대충벌레 블로그
article thumbnail
728x90
반응형

회원가입을 위한 테이블 생성

<html />
create table member( id varchar(30) not null, # 아이디 password varchar(30) , #패스워드 name varchar(30), # 이름 email varchar(30), # 이메일 phone varchar(30), # 전화번호 job varchar(30), # 직업 regdate varchar(30), # 가입날짜 primary key(id) )engine = innodb default charset=utf8; drop table member; desc member select * from member limit 100; # 100개 행만 선택해봄 select id,password from member where id ='test' select count(*) from member; # 회원수 insert into member values('bug','1234','대충벌레','bigbug@naver.com','010-1234-5212','학생',now()); # 테스트

 

프로젝트가 에러없이 일단 잘 실행되는지 확인하기 위해 index.jsp 만들고 확인

<html />
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>INDEX</title> </head> <body> INDEX 페이지 입니다. </body> </html>

index.jsp 정상 출력됨

 

 

데이터베이스 연동하기 위해서 WEB-INF > lib 에 커넥터.jar 파일을 넣어줍니다.

기본적인 구조 



[DBConnection.java]

<java />
package register0104; import java.sql.*; import java.util.Properties; import java.util.Vector; public class DBConnectionMgr { private Vector connections = new Vector(10); private String _driver = "org.gjt.mm.mysql.Driver", // com.mysql.jdbc.Driver 와 동일 _url = "jdbc:mysql://127.0.0.1:3306/db명?useUnicode=true&characterEncoding=UTF8", _user = "유저명", _password = "패스워드명"; private boolean _traceOn = false; private boolean initialized = false; private int _openConnections = 10; private static DBConnectionMgr instance = null; public DBConnectionMgr() { } /** Use this method to set the maximum number of open connections before unused connections are closed. */ public static DBConnectionMgr getInstance() { if (instance == null) { synchronized (DBConnectionMgr.class) { if (instance == null) { instance = new DBConnectionMgr(); } } } return instance; } public void setOpenConnectionCount(int count) { _openConnections = count; } public void setEnableTrace(boolean enable) { _traceOn = enable; } /** Returns a Vector of java.sql.Connection objects */ public Vector getConnectionList() { return connections; } /** Opens specified "count" of connections and adds them to the existing pool */ public synchronized void setInitOpenConnections(int count) throws SQLException { Connection c = null; ConnectionObject co = null; for (int i = 0; i < count; i++) { c = createConnection(); co = new ConnectionObject(c, false); connections.addElement(co); trace("ConnectionPoolManager: Adding new DB connection to pool (" + connections.size() + ")"); } } /** Returns a count of open connections */ public int getConnectionCount() { return connections.size(); } /** Returns an unused existing or new connection. */ public synchronized Connection getConnection() throws Exception { if (!initialized) { Class c = Class.forName(_driver); DriverManager.registerDriver((Driver) c.newInstance()); initialized = true; } Connection c = null; ConnectionObject co = null; boolean badConnection = false; for (int i = 0; i < connections.size(); i++) { co = (ConnectionObject) connections.elementAt(i); // If connection is not in use, test to ensure it's still valid! if (!co.inUse) { try { badConnection = co.connection.isClosed(); if (!badConnection) badConnection = (co.connection.getWarnings() != null); } catch (Exception e) { badConnection = true; e.printStackTrace(); } // Connection is bad, remove from pool if (badConnection) { connections.removeElementAt(i); trace("ConnectionPoolManager: Remove disconnected DB connection #" + i); continue; } c = co.connection; co.inUse = true; trace("ConnectionPoolManager: Using existing DB connection #" + (i + 1)); break; } } if (c == null) { c = createConnection(); co = new ConnectionObject(c, true); connections.addElement(co); trace("ConnectionPoolManager: Creating new DB connection #" + connections.size()); } return c; } /** Marks a flag in the ConnectionObject to indicate this connection is no longer in use */ public synchronized void freeConnection(Connection c) { if (c == null) return; ConnectionObject co = null; for (int i = 0; i < connections.size(); i++) { co = (ConnectionObject) connections.elementAt(i); if (c == co.connection) { co.inUse = false; break; } } for (int i = 0; i < connections.size(); i++) { co = (ConnectionObject) connections.elementAt(i); if ((i + 1) > _openConnections && !co.inUse) removeConnection(co.connection); } } public void freeConnection(Connection c, PreparedStatement p, ResultSet r) { try { if (r != null) r.close(); if (p != null) p.close(); freeConnection(c); } catch (SQLException e) { e.printStackTrace(); } } public void freeConnection(Connection c, Statement s, ResultSet r) { try { if (r != null) r.close(); if (s != null) s.close(); freeConnection(c); } catch (SQLException e) { e.printStackTrace(); } } public void freeConnection(Connection c, PreparedStatement p) { try { if (p != null) p.close(); freeConnection(c); } catch (SQLException e) { e.printStackTrace(); } } public void freeConnection(Connection c, Statement s) { try { if (s != null) s.close(); freeConnection(c); } catch (SQLException e) { e.printStackTrace(); } } /** Marks a flag in the ConnectionObject to indicate this connection is no longer in use */ public synchronized void removeConnection(Connection c) { if (c == null) return; ConnectionObject co = null; for (int i = 0; i < connections.size(); i++) { co = (ConnectionObject) connections.elementAt(i); if (c == co.connection) { try { c.close(); connections.removeElementAt(i); trace("Removed " + c.toString()); } catch (Exception e) { e.printStackTrace(); } break; } } } private Connection createConnection() throws SQLException { Connection con = null; try { if (_user == null) _user = ""; if (_password == null) _password = ""; Properties props = new Properties(); props.put("user", _user); props.put("password", _password); con = DriverManager.getConnection(_url, props); } catch (Throwable t) { throw new SQLException(t.getMessage()); } return con; } /** Closes all connections and clears out the connection pool */ public void releaseFreeConnections() { trace("ConnectionPoolManager.releaseFreeConnections()"); Connection c = null; ConnectionObject co = null; for (int i = 0; i < connections.size(); i++) { co = (ConnectionObject) connections.elementAt(i); if (!co.inUse) removeConnection(co.connection); } } /** Closes all connections and clears out the connection pool */ public void finalize() { trace("ConnectionPoolManager.finalize()"); Connection c = null; ConnectionObject co = null; for (int i = 0; i < connections.size(); i++) { co = (ConnectionObject) connections.elementAt(i); try { co.connection.close(); } catch (Exception e) { e.printStackTrace(); } co = null; } connections.removeAllElements(); } private void trace(String s) { if (_traceOn) System.err.println(s); } } class ConnectionObject { public java.sql.Connection connection = null; public boolean inUse = false; public ConnectionObject(Connection c, boolean useFlag) { connection = c; inUse = useFlag; } }

 

register.jsp 회원가입 폼 

<html />
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>회원가입</title> <script type="text/javascript"> function idCheck(id){ if(id==""){ alert("아이디를 입력해 주세요."); document.regForm.mem_id.focus(); }else{ url="idcheck.jsp?id="+id; window.open(url,"post","width=300,height=200"); } } </script> </head> <body> <table border="1" align='center'> <form name='regform' method='post' action='register_ok.jsp'> <tr> <th colspan="2">회원가입</th> </tr> <tr> <td width="20%">아이디</td> <td width="60%"><input type='text' name='id' size='20'> &nbsp;&nbsp;<input type='button' value='중복확인' onclick='idCheck(this.form.id.value)'></td> </tr> <tr> <td>패스워드</td> <td><input type="password" name='password' size='20'></td> </tr> <tr> <td>패스워드 확인</td> <td><input type='password' name='password_re' size='20'></td> </tr> <tr> <td>이름</td> <td><input type='text' name='name' size='10'></td> </tr> <tr> <td>이메일</td> <td><input type='text' name='email' size='30'></td> </tr> <tr> <td>전화번호</td> <td><input type="text" name='phone' size='20'></td> </tr> <tr> <td colspan="2" align='center'> <input type='submit' value='회원가입'>&nbsp;&nbsp;&nbsp;<input type="reset" value='다시쓰기'> </tr> </form> </table> </body> </html>

 

ID가 DB에있는 값과 중복되는게 있는지 비교 

MemberDAO.java 생성후 코드 작성

<java />
package register0104; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; public class MemberDAO { private DBConnectionMgr pool = null; public MemberDAO() { try { pool = DBConnectionMgr.getInstance(); } catch (Exception e) { System.out.println("Error : "+e); } }// 생성자 // 아이디 있는지 비교 public boolean checkID(String id) { Connection c = null; PreparedStatement p = null; ResultSet r = null; boolean check = false; try { c = pool.getConnection(); // 객체를 빌림 String query = "select id from member where id =?"; p = c.prepareStatement(query); p.setString(1, id); r = p.executeQuery(); check = r.next(); } catch (Exception e) { // TODO: handle exception System.out.println("Exception" +e); }finally { pool.freeConnection(c, p, r); } return check; } }


ID 체크를 위한 idcheck.jsp 를 만들어줌   

<html />
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <jsp:useBean id="memberDAO" class="register0104.MemberDAO"/> <% String id = request.getParameter("id"); boolean check = memberDAO.checkID(id); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>ID 중복체크</title> </head> <body bgcolor="#FFFFDD"> <center> <b><%=id %></b> <% if(check){ out.println("이미 존재하는 ID 입니다"); }else{ out.println("사용 가능한 아이디 입니다."); } %> <a href="#" onclick='win_close()'>닫기</a> </center> </body> </html>

 

회원가입을 위한 DAO 추가 

<java />
//회원가입 public boolean memberInsert(MemberDTO memberDTO) { Connection c=null; PreparedStatement p = null; boolean flag = false; try { c = p.getConnection(); String query = "insert into member values(?,?,?,?,?,?,now()"; p=c.prepareStatement(query); p.setString(1, memberDTO.getId()); p.setString(2, memberDTO.getPassword()); p.setString(3, memberDTO.getName()); p.setString(4, memberDTO.getEmail()); p.setString(5, memberDTO.getPhone()); p.setString(6, memberDTO.getJob()); int cnt = p.executeUpdate(); // excuteQuery : resultSet 반환 // excuteUpdate : int 행의 갯수 반환 if(cnt>0) { flag=true; } } catch (Exception e) { // TODO: handle exception System.out.println("Exception "+e); }finally { pool.freeConnection(c, p); } return flag; }

회원가입폼 입력확인을 위한 확인 폼 register_ok.jsp 추가

<html />
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% request.setCharacterEncoding("utf-8"); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>회원가입 확인</title> <script type="text/javascript" src="script.js"></script> </head> <body> <%-- 폼에서 저장한 데이터를 빈에 저장한다. 빈에서 꺼내어 확인폼을 구성한다 맞다고 판단되면 확인을 눌러 처리 --%> <jsp:useBean id="memberDTO" class="register0104.MemberDTO"/> <jsp:setProperty property="*" name="memberDTO"/> <table border="1" align='center'> <form name='regform' method='post' action='insert.jsp'> <tr> <th colspan="2"><jsp:getProperty property="name" name="memberDTO"/>작성한 내용 확인</th> </tr> <tr> <td width="20%">아이디</td> <td width="60%"><input type='text' name='id' value='<jsp:getProperty property="id" name="memberDTO"/>'></td> </tr> <tr> <td>이름</td> <td><input type='text' name='name' value='<jsp:getProperty property="name" name="memberDTO"/>'></td> </tr> <tr> <td><input type="hidden" name='password' value='<jsp:getProperty property="password" name="memberDTO"/>'></td> </tr> <tr> <td>이메일</td> <td><input type='text' name='email' value='<jsp:getProperty property="email" name="memberDTO"/>'></td> </tr> <tr> <td>전화번호</td> <td><input type="text" name='phone' value='<jsp:getProperty property="phone" name="memberDTO"/>'></td> </tr> <tr> <td>직업</td> <td><input type='text' name='job' value='<jsp:getProperty property="job" name="memberDTO"/>'></td> </tr> <tr> <td colspan="2" align='center'> <input type='submit' value='회원가입'>&nbsp;&nbsp;&nbsp;<input type="button" value='다시쓰기' onclick="history.back()"> </tr> </form> </table> </body> </html>

 

 

회원가입을 처리할 insert.jsp 추가

<html />
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%-- 가입 처리를 위한 페이지 --%> <jsp:useBean id="memberDAO" class="register0104.MemberDAO"/> <jsp:useBean id="memberDTO" class="register0104.MemberDTO"/> <jsp:setProperty property="*" name="memberDTO"/> <% boolean flag = memberDAO.memberInsert(memberDTO); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>회원가입 처리</title> </head> <body> <% if(flag){ out.println("회원가입 축하"); out.println("<a href=login.jsp>로그인</a>"); }else{ out.println("다시 가입 부탁"); out.println("<a href=register.jsp>재가입</a>"); } %> </body> </html>

DB에 정상적으로 입력됬는지 확인

[지금 확인해보니 job 컬럼은 추가를 안했음]

 

index.jsp 수정

<html />
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <% String id = (String)session.getAttribute("key"); System.out.println(id); %> <!DOCTYPE html> <html> <head> <script type="text/javascript"> </script> <meta charset="UTF-8"> <title>INDEX</title> </head> <body> INDEX 페이지 입니다. <% if(id != null){ %> <B><%=id %></B> 님 환영합니다. <a href="logout.jsp">로그아웃</a> <%}else{ %> <a href='register.jsp'>회원가입</a> <div> <form name="login" method="post" action='login_ok.jsp'> <p><input type="text" name='id' size='20' placeholder="아이디"></p> <p><input type='password' name='password' size="20" placeholder="비밀번호"></p> <p><input type='submit' value='로그인'> </p> </form> </div> </form> <% } %> </body> </html>

따로 로그인 페이지는 만들지 않고 index에 추가했음.

 

로그인 처리를 위한 login_ok.jsp 추가

<html />
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% request.setCharacterEncoding("utf-8"); %> <jsp:useBean id="memberDAO" class="register0104.MemberDAO"/> <% String id = request.getParameter("id"); String password = request.getParameter("password"); boolean check = memberDAO.logincheck(id,password); if(check){ session.setAttribute("key", id); response.sendRedirect("index.jsp"); }else{ response.sendRedirect("error.jsp"); System.out.print("올바르지 않은 게정 정보"); } %> <!DOCTYPE html> <html> <head> <script type="text/javascript"> </script> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> </body> </html>

로그인 처리를 위해 DAO에 추가

<java />
// 로그인 체크 public boolean logincheck(String id,String password) { Connection c= null; PreparedStatement p = null; ResultSet r = null; boolean logincheck = false; try { c = pool.getConnection(); String query = "select id , password from member where id = ? and password = ? "; p=c.prepareStatement(query); p.setString(1, id); p.setString(2, password); r=p.executeQuery(); logincheck =r.next(); System.out.println(logincheck); } catch (Exception e) { // TODO: handle exception System.out.println("Exception : "+e); }finally { pool.freeConnection(c,p,r); } return logincheck; }

에러가 있을시 이동할 error.jsp 추가

<html />
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>로그인 에러</title> </head> <BR><BR><BR> <center> <b>로그인에 실패하셨습니다<p> <input type="button" value="다시쓰기" onClick="history.back()"> </center> </body> </html>

 

로그아웃 할때 세션을 없앨 logout.jsp 추가

<html />
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <% session.invalidate(); %> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> alert("로그아웃 됨"); location.href="index.jsp"; </script> </head> <body> </body> </html>

 

 

확인을 위해 다시 정리 

 index.jsp

id : abc ,   password : 1234 로 로그인 

로그아웃시 세션 종료되고 다시 인덱스로 돌아옴

id 혹은 password가 일치하지 않을경우

다시쓰기 클릭시 다시 index로 돌아옴

프로젝트 소스 코드 

https://github.com/inthegun/bug_register

 

inthegun/bug_register

회원가입,로그인 NO MVC. Contribute to inthegun/bug_register development by creating an account on GitHub.

github.com

 

반응형
profile

대충벌레 블로그

@대충벌레

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!