티스토리 뷰
반응형
데이트베이스에 연동하여
AWT, Dialog, Popup 창을 이용한 로그인 예제
import java.awt.*;
import java.awt.event.*;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import com.kysoft.member.Member;
import com.kysoft.member.MemberDAO;
class JavaEx29 extends Frame { // Frame = 기본 Container
private static final long serialVersionUID = 1L;
// Components
Label lid; // ID 레이블
Label lpwd; // PW 레이블
TextField tfId; // ID 필드
TextField tfPwd; // PW 필드
Button ok; // 로그인 버튼
Dialog msgDlg; // 팝업창
Label msgLabel;
// 초기화(Initialization)
// components 인스턴스(객체) 생성 / 속성 할당 / container에 장착
JavaEx29(String title) {
super(title); // Frame(String title)을 호출한다.
// Components 생성
lid = new Label("ID :", Label.RIGHT); // Label의 text정렬을 오른쪽으로.
lpwd = new Label("Password :", Label.RIGHT); // 약 12개의 글자를 입력할 수 있는 TextField 생성.
tfId = new TextField(12);
tfPwd = new TextField(12);
tfPwd.setEchoChar('*'); // 입력한 값 대신 '*'이 보이게 한다.
tfId.setBackground(Color.yellow); // 배경색 지정
tfPwd.setBackground(Color.yellow); // 배경색 지정
ok = new Button("로그인"); // ok = new Button("OK");
msgDlg = new Dialog(this,"로그인 메시지",false);
msgDlg.setSize(500,70);
msgDlg.setLocation(50,50);
msgDlg.setLayout(new FlowLayout());
msgDlg.setVisible(false);
msgLabel = new Label("");
msgDlg.add(msgLabel);
Button btnOk = new Button("OK");
msgDlg.add(btnOk);
btnOk.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
msgDlg.setVisible(false);
msgDlg.dispose();
tfId.setText("");
tfPwd.setText("");
tfId.requestFocus();
}
});
// OK버튼과 TextField에 이벤트처리를 위한 Listener를 추가해준다.
tfId.addActionListener(new EventHandler()); // ID field
tfPwd.addActionListener(new EventHandler()); // PW field
ok.addActionListener(new EventHandler()); // 로그인 버튼
//super.addWindowListener(new EventHandler()); //
//super.addWindowListener(new EventHandler()); //
addWindowListener(new EventHandler());//
//component들을 container에 장착(add)
// 레이아웃(배치) 방식을 설정
setLayout(new FlowLayout()); // LayoutManager를 FlowLayout으로
add(lid); // ID Label // 생성한 Component들을 Frame에 포함시킨다.
add(tfId); // ID field
add(lpwd); // PW Label
add(tfPwd); // PW field
add(ok); // 로그인 버튼
setSize(450, 70); // 크기설정
setVisible(true); // Frame이 화면에 보이게 한다.
}
private boolean checkId(String id) throws PatternSyntaxException {
boolean flag = false;
// 로그인 폼 점검(form validation) 시작
/*
* regex : ID : 1) 공백없음. 2) 8~12자 3) 특수문자(X)
* 4) 첫자는 반드시 영문자 소문자로 시작
*/
String pattern = "[a-z][a-z | A-Z | 0-9\\S]{7,11}"; // 정규 표현식(regular Expression) : ID 점검
// String pattern = "[a-z][a-zA-Z0-9\\S]{7,11}"; // 정규 표현식(regular Expression) : ID 점검
// String pattern = "[a-z][a-zA-Z0-9[^\\s]]{7,11}"; // 정규 표현식(regular Expression) : ID 점검
// String pattern = "[\\p{Lower}]{1}[\\p{Lower}\\p{Upper}\\p{Digit}[^\\p{Space}]]{7,11}";
// String pattern = "[a-z][\\p{Lower}A-Z\\p{Digit}\\S}]{7,11}";
// String pattern = "[a-z][\\p{Lower} | A-Z | \\p{Digit} | \\S}]{7,11}";
// String pattern = "[\\d]{1}.[A-Za-z0-9\\S}]{7,11}";
// String pattern = "[a-z][a-zA-Z0-9[^\\s]]{7,11}";
// String pattern = "[^\\d]{1}[\\w\\S]{7,11}";
// String pattern = "[^\\d][\\w\\S]{7,11}";
// try {
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(id);
if (m.matches()) {
flag=true;
} else {
//flag=false;
msgLabel.setText("아이디는 공백없이 영문자나 숫자로 구성되며 8~12자 사이입니다.");
msgDlg.setVisible(true);
//System.out.println("아이디는 공백없이 영문자나 숫자로 구성되며 8~12자 사이입니다.");
}
return flag;
}
public static void main(String args[]) {
JavaEx29 f = new JavaEx29("Login");
}
class EventHandler implements ActionListener, WindowListener {
public void actionPerformed(ActionEvent e){
String id = tfId.getText(); // tfId에 입력되어있는 text를 얻어온다.
String password = tfPwd.getText();
// DB P/G'n 시작
HashMap<String, String> map = new HashMap<String, String>();
MemberDAO dao = new MemberDAO();
ArrayList<Member> members = new ArrayList<Member>();
try {
members = dao.getMembers();
} catch (SQLException se) {
System.out.println("예외처리 5: "+se.getMessage());
se.printStackTrace();
} catch (Exception ex) {
System.out.println("예외처리 6: "+ex.getMessage());
ex.printStackTrace();
}
for (int i=0; i<members.size();i++)
map.put(members.get(i).getId(), members.get(i).getPw());
if (checkId(id)) { // ID 유효성(validation) 점검 = OK !
if(!map.containsKey(id)) {
msgLabel.setText("입력하신 id는 존재하지 않습니다. 다시 입력해주세요.");
msgDlg.setVisible(true);
//System.out.println("입력하신 id는 존재하지 않습니다. 다시 입력해주세요.");
} else {
if(!(map.get(id)).equals(password)) {
msgLabel.setText("비밀번호가 일치하지 않습니다. 다시 입력해주세요.");
msgDlg.setVisible(true);
//System.out.println("비밀번호가 일치하지 않습니다. 다시 입력해주세요.");
} else {
msgLabel.setText("id와 비밀번호가 일치합니다.");
msgDlg.setVisible(true);
//System.out.println("id와 비밀번호가 일치합니다.");
}//if
}//if
}
// DB P/G'n 끝
/*
if (!id.equals("javachobo")){
System.out.println("입력하신 id가 유효하지 않습니다. 다시 입력해 주세요.");
// id를 다시 입력할 수 있도록, focus를 tfId로 옮긴다.
tfId.requestFocus();
tfId.selectAll(); // tfId에 입력된 text가 선택되게 한다.
} else if (!password.equals("asdf")) {
System.out.println("입력하신 비밀번호가 틀렸습니다. 다시 입력해 주시기 바랍니다.");
// id를 다시 입력할 수 있도록 focus를 tfId로 옮긴다.
tfPwd.requestFocus();
tfPwd.selectAll();
} else {
System.out.println( id + "님, 성공적으로 로그인 되었습니다.");
}
*/
}
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
e.getWindow().setVisible(false); // 창(윈도우 : Frme)을 닫다; 메모리상에서는 여전히
e.getWindow().dispose(); // 메모리에서 제거
System.exit(0); // 프로그램 정상 종료
}
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
}
}
결과
기본 창
데이터베이스에 ID 및 PW 존재하지 않을 시
데이터베이스에 ID 및 PW 존재 할 때
반응형
'IT & programming > Java' 카테고리의 다른 글
8/22 - I/O, 스트림, IOEx 예제문제 (0) | 2012.08.22 |
---|---|
8/21 - AWT, 로그인 예제, Adapter클래스 이용 (0) | 2012.08.21 |
8/20 - AWT, 이벤트 처리방법, 예제 Frametest3 (0) | 2012.08.20 |
8/20 - Event의 종류와 관련 인터페이스 (0) | 2012.08.20 |
8/17 - 필기 (0) | 2012.08.17 |
댓글