티스토리 뷰

반응형

 

데이트베이스에 연동하여

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 존재 할 때

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31