본문으로 바로가기

JDBC를 활용한 회원가입 예제

category JSP 2018. 5. 1. 21:09

1. sign_up 


 회원가입 양식이 있는 페이지로 회원가입버튼(submit)을 누르게 되면 member_add.jsp로 페이지가 이동하면서 값이 넘어간다. (request방식)



2.member_add 


 sign_up에서 넘어온 값을 request.getParameter로 받아서 새로 만든 변수에 넣고 회원가입을 한 정보들을 DB에 넣기 위해 INSERT 쿼리문에 pstmt.setString, setInt(물음표자리,변수)로 쿼리문을 채운 후에 pstmt.executeUpdateINSERT쿼리문을 실행 후 int형으로 반환되는 값으로 쿼리문 성공여부를 판단 후(updateCount) finally 블록에서 preparedStatementconnection 객체를 close() 해주고 난 후에 Login.jsp로 페이지이동(response.sendRedirect)시켜준다.

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import="java.sql.*"%>
    <%@ page import="javax.sql.*"%>
    <%@ page import="javax.naming.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
    request.setCharacterEncoding("UTF-8");
    Connection conn = null;
    PreparedStatement pstmt =null;
    String sql="";
    int updateCount = 0;
    
    String mb_id = request.getParameter("mb_id");
    String mb_pw = request.getParameter("mb_pw");
    String email = request.getParameter("email");
    String mb_name = request.getParameter("mb_name");
    String jumin1 = request.getParameter("jumin1");
    String jumin2 = request.getParameter("jumin2");
    String birth_year = request.getParameter("birth_year");
    int birth_month = Integer.parseInt(request.getParameter("birth_month"));
    int birth_date = Integer.parseInt(request.getParameter("birth_date"));
    String[] interest = request.getParameterValues("interest");
     StringBuffer interests = new StringBuffer();    //배열을 하나의 String으로 보냄
     for(String i : interest){                        //배열을 하나의 String으로 합침
         interests.append(i).append(" ");
     }
     
    String introduce = request.getParameter("introduce");
    /* sql="INSERT INTO homework (mb_id, mb_pw, email, mb_name, jumin1, jumin2,";
    sql+="birth_year, birth_month, birth_date, interest) values (?,?,?,?,?,?,?,?,?,?)"; */
    
    sql="INSERT INTO homework (mb_id, mb_pw, email, mb_name, jumin1, jumin2, birth_year, birth_month, birth_date, interest, introduce) values (?,?,?,?,?,?,?,?,?,?,?)";
 
    System.out.println(sql);
    try{
        Context init = new InitialContext();
        DataSource ds = (DataSource)init.lookup("java:comp/env/jdbc/OracleDB");
        conn = ds.getConnection();
        pstmt = conn.prepareStatement(sql);
        
        pstmt.setString(1,mb_id);                
        pstmt.setString(2,mb_pw);
        pstmt.setString(3,email);
        pstmt.setString(4,mb_name);
        pstmt.setString(5,jumin1);
        pstmt.setString(6,jumin2);
        pstmt.setString(7,birth_year);
        pstmt.setInt(8,birth_month);
        pstmt.setInt(9,birth_date);
        pstmt.setString(10,interests.toString());
        pstmt.setString(11,introduce);
        
        updateCount = pstmt.executeUpdate();                                //변경된 행의 개수 반환
 
        if (updateCount != 0) {
            System.out.println("회원가입 성공");
        } else {
            System.out.println("회원가입 실패");
        }
    } catch (Exception e) {
        
        System.out.println("연결에 실패하였습니다.(member_add)");
        out.println("<h3>연결에 실패하였습니다.(member_add)</h3>");
    }finally {
        try {
            
            pstmt.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    response.sendRedirect("login.jsp"); /* 회원 추가 후 login.jsp 로 */    
%>
 
cs



3. login.jsp


ID, PW를 입력 후 로그인 버튼을 누르면 폼태그로 로그인 처리페이지인 member_login.jspID,PW의 값과 함께 페이지를 이동한다.


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
32
33
34
35
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script>
    function submit() {
        document.abcd.submit();        
</script>
</head>
<body>
<form action="member_login.jsp" name="abcd" method="POST">
    <table border="3">
        <tr>
            <h1>로그인 페이지</h1>                                                
        </tr>
        <tr>
            <td>아이디 :
            <input type="text" name="mb_id" id="mb_id" size=13></td>
        </tr>
        <tr>
            <td>비밀번호 :
            <input type="password" name="mb_pw"  id="mb_pw" size=13></td>
        </tr>
        <tr>
            <td align="center">&nbsp;  <!-- 아이디의 값과 비밀번호의 값을 가지고 member_login.jsp로 mb_id name로 보낸다. -->    
            <a href="javascript:submit();">로그인</a
                               <a href="sign_up.jsp">회원가입</a></td>
        </tr>
    </table>
    </form>
</body>
</html>
cs


4. member_login 


 로그인 처리 페이지이다. login.jsp에서 폼태그로 넘어온 값(ID,PW)request.getParameter로 받고 새로운 변수에 저장 후 SELECT 쿼리문을 이용해서 해당하는 ID의 정보를 뽑고 실행 후 Result객체로 리턴해서 rs변수에 넣는다. 넣은 후 한 개 행(한명의 사용자의 값)에서 IDPW를 비교하는거기 때문에 if쓴다. 물론 while도 써도된다. rs에 저장된 쿼리실행 결과와 getParameter로 받아온 ID, PW이 일치하면 로그인을 유지하기위해 sessionID를 올리고 main.jsp로 페이지이동처리(response.sendRedirect)를 해준다.

만약 ID,PW값이 일치하지 않는다면 else로 빠져서 alert메시지와 location.href="login.jsp"로 인해 Login.jsp로 페이지이동처리가 된다.


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.naming.*"%>
<!-- 로그인 처리 페이지
파라미터로 넘어온 아이디 비번이 쿼리문실행한 rs에 있는 값과 맞으면 main.jsp로 보냄 -->
<%
    String mb_id = request.getParameter("mb_id");            //login.jsp에서 로그인과 비번이 넘어옴 /그리고 변수에 저장
    String mb_pw = request.getParameter("mb_pw");
    Connection conn = null;
    PreparedStatement pstmt =null;
    String sql = "";
%>
<%
    try {
        Context init = new InitialContext();
        DataSource ds = (DataSource) init.lookup("java:comp/env/jdbc/OracleDB");
        conn = ds.getConnection();
 
        sql = "SELECT * FROM homework WHERE mb_id=?";                    //얻어온 아이디를 쿼리문에 넣음
        pstmt = conn.prepareStatement(sql);                                //쿼리문갖고와서 pstmt공간에 저장을한다.
        pstmt.setString(1, mb_id);                                        //where안에 넣어서 그 아이디사람의 정보를 저장된 쿼리문에 set으로 추가를한 후 
        ResultSet rs = pstmt.executeQuery();                            //pstmt의 쿼리를 실행해서 값을 가져오는 rs에 넣는다.
        
        
        if(rs.next()) {        //while은 여러개 행을 돌리는거고 if는 한 개 행만 돌리는거 / while해도 된다    
            //rs의 현재 로우의 값이 있으면 true를 반환하고 없으면 false를 반환한다.
            if(rs.getString("mb_pw").equals(mb_pw) && rs.getString("mb_id").equals(mb_id)){ %>    <!-- select로 뽑아온 쿼리문의 결과값에서 mb_pw와 request.getParameter로 받아온 값과 비번과 일치하면 -->
                <% session.setAttribute("mb_id", mb_id);%>                                        <!-- 사용자페이지에서 활동할라고 session에 등록해놓음 -->
                <% response.sendRedirect("main.jsp"); %>                                        <!-- 정상적 실행이니까 main.jsp로 간다 -->
            <%}else{
                %><script>alert('비밀번호가 틀렸습니다'); location.href="login.jsp";</script><% /* else로 비번이 틀리면 다시 login.jsp로 돌려보냄 */
            }
        }
    } catch (Exception e) {
        System.out.println("연결에 실패하였습니다.(member_login)");
        out.println("<h3>연결에 실패하였습니다.(member_login)</h3>");
    }finally {
        try {    
            pstmt.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }
%>
cs


5. main.jsp 


 로그인 처리페이지에서 ID,PW로 로그인이 성공해서 session에 등록된 ID로 관리자메뉴를 보여줄것인지, 사용자메뉴를 보여줄것인지 처리를 해주는 페이지이다. 일단 관리자인지 사용자인지간에 둘 다 정보를 뽑긴 해야하므로 위에서 SELECT * FROM homework로 전체 정보를 sql문에 담아준 후 실행(executeQuery)한 값을 rs에 넣어준다. 그리고 if조건문을 이용해서 session에 등록되어있는 ID"admin"이면 관리자이므로 조건문에 들어오게되고 모든 사용자의 정보를 전체출력한다. 그리고 개개인마다 삭제링크를 추가해서 해당 사용자의 정보를 삭제할 수 있다. 삭제할 때는 a태그로 링그를 통해서 하는데 member_del.jsp?mb_id=<%=rs.getString("mb_id")%>로 지금 현재 사용자의 아이디를 같이 넘겨준다.

그리고 관리자가 아니면 else(일반 사용자)로 넘어간다. 그리고 일반 사용자는 자신의 정보를 볼 수 있고 몇몇 개의 정보를 수정할 수 있도록 하였는데 각 정보옆에 관리자의 삭제페이지와 똑같이 a태그 href링크로 현재 사용자의 값을 같이 넘겨주었다. 그런데 사용자가 수정할 값을 입력받아와야 하기 때문에 새로운 페이지에서 값을 받아와야한다. 그래서 member_modify_action페이지 텍스트타입을 통해 입력을 받은 후 폼태그로 member_modify.jsp로 값과 함께 hidden타입으로 페이지이동처리를 한다.


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<%@ page language="java" contentType="text/html; charset=UTF-8"   pageEncoding="UTF-8"%>
    
<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.naming.*"%>
 
 
<%String mb_id = (String)session.getAttribute("mb_id");                 /* if문에서 로그인에 성공해서 session에 등록한 id를 얻어온다. 거기에 로그인된 정보들이 있다. admin이나 사용자나 */
    String sql = null;
    Connection conn = null;
    try {
        Context init = new InitialContext();
        DataSource ds = (DataSource) init.lookup("java:comp/env/jdbc/OracleDB");
        conn = ds.getConnection();
 
        sql = "SELECT * FROM homework";                                            /* 일단 관리자나 사용자나 자기가 볼 정보를 출력해야하니까 select로 전체 출력을 한다. */
        PreparedStatement pstmt = conn.prepareStatement(sql);                    /* 쿼리문을 pstmt에 저장하고 */
        ResultSet rs = pstmt.executeQuery();                                    /* 쿼리문을 실행하고 db에 저장된 전체 결과값을 가져오는 rs에 저장한다. */
 
        
         if(mb_id.equals("admin")) { %>관리자님 안녕하세요                        <!-- session에서 받아온 값과 비교해서 admin이면  전체 회원 정보를 출력-->
            <table border="5">
                <%
                    while(rs.next()) {%>
                <tr>
                    <td><%= rs.getString("mb_id"%></td>
                    <td><%= rs.getString("mb_pw"%></td>
                    <td><%= rs.getString("email"%></td>
                    <td><%= rs.getString("mb_name"%></td>
                    <td><%= rs.getString("jumin1"%></td>
                    <td><%= rs.getString("jumin2"%></td>
                    <td><%= rs.getString("birth_year")%></td>
                    <td><%= rs.getInt("birth_month"%></td>
                    <td><%= rs.getInt("birth_date"%></td>
                    <td><%= rs.getString("interest"%></td>
                    <td><%= rs.getString("introduce"%></td>
                    <td><a href="member_del.jsp?mb_id=<%= rs.getString("mb_id")%>">삭제</a></td>    <!-- 각 회원마다 삭제 버튼 하나씩 넣고 ?mb_id=로 현재 회원의 rs.getString("mb_id"). id를 member_del.jsp로 값을 보낸다  -->
                </tr>
                <%}%>
            </table><%
             }else{%>                                                            <!-- 관리자가 아니면 (else) -->
                <%= mb_id %>님 환영합니다.
                 <table border="5"><%
                    while(rs.next()){                                            
                        if(rs.getString("mb_id").equals(mb_id)) {    %>                    /* select 문의 전체 id값에서 session 에서 받아온 값과 비교해서 일치하면 아래를 출력 */            
                        <tr>
                        <td>비밀번호 : </td> <td><%= rs.getString("mb_pw"%></td>        <!-- if문에 해당하는 ID의 비밀번호를 출력 -->
                        </tr>    
                        <tr>
                        <td>이메일 : </td> <td><%= rs.getString("email"%></td>        <!-- if문에 해당하는 ID의 이메일을 출력 -->
                        <td><a href="member_modify_action.jsp?mb_id=<%= rs.getString("mb_id")%>">수정</a></td<!-- member_modify_action.jsp로 mb_id의 값을 넘겨줌 -->
                        </tr>
                    <% }
                    }%>
                    </table>
                        <br><a href="login.jsp">로그인페이지로 가기</a><br>    
         <% }
          } catch (Exception e) {
            out.println("<h3>연결에 실패하였습니다.(main.jsp)</h3>");
        }%>
cs


6. member_modify


 member_modify_action에서 넘어온 수정한 값을 새로운 변수에 저장하고 UPDATE 문을 통해서 이전에 존재했던 값들을 새로운 값으로 대체한다. 전과 같이 setString으로 해당 컬럼의 자리와 변경할 값 ? 에 변수를 넣고 쿼리를 실행 후 updateCount에 넣는다. 완료 후 response.sendRedirect("main.jsp")로 페이지 이동처리를 한다.


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import="java.sql.*"%>
    <%@ page import="javax.sql.*"%>
    <%@ page import="javax.naming.*"%>  
    <%
    Connection conn=null;
    PreparedStatement pstmt = null;
    int updateCount= 0;
    String mb_id = request.getParameter("mb_id");
    String mb_pw = request.getParameter("mb_pw"); 
    String email = request.getParameter("email"); 
    String sql = "UPDATE homework set mb_pw=?, email=? WHERE mb_id=?";            
   
    try{
          Context init = new InitialContext();
        DataSource ds = (DataSource)init.lookup("java:comp/env/jdbc/OracleDB");
        conn = ds.getConnection();
        pstmt = conn.prepareStatement(sql);
        
        pstmt.setString(1, mb_pw);
        pstmt.setString(2, email);
        pstmt.setString(3, mb_id);
        updateCount = pstmt.executeUpdate();        //executeUpdate는 주로 insert, update, delete 쓸때 씀 
        
        if(updateCount !=0){
            System.out.println("수정성공");
        }else{
            System.out.println("수정실패");
        }
        
    }catch(Exception e){
        out.println("<h3>연결에 실패하였습니다.(member_modify)</h3>");
        System.out.println("<h3>연결에 실패하였습니다.(member_modify)");
    }finally {
        try {
            pstmt.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }    
    response.sendRedirect("main.jsp"); /* 회원 수정 후 main.jsp로 */     
cs

7. member_del  

 관리자 메뉴에서 사용자의 정보를 삭제하기 위한 페이지다. admin에도 삭제 버튼이 있지만 이 페이지에서 이 페이지로 넘어온 ID의 값과 비교해서 "admin" 이면 삭제를 하지못하게 한다.

삭제를 위해 DELETE문을 이용해서 쿼리문을 작성한다. main.jsp에서 넘어온 ID값을 WHERE조건문에 대입을 하고 삭제를 실행한다.


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import="java.sql.*"%>
    <%@ page import="javax.sql.*"%>
    <%@ page import="javax.naming.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<% 
    Connection conn = null;
    PreparedStatement pstmt = null;
    String sql="";
    int updateCount = 0;
    String mb_id = request.getParameter("mb_id");
    if(mb_id.equals("admin")){
         out.println("<script>");
         out.println("alert('관리자를 삭제할 수 없습니다!')"); 
         out.println("location.href='main.jsp'"); //main.jsp로 넘김
         out.println("</script>");
         return;
    }
    sql="DELETE FROM homework WHERE mb_id=?";
    
    try{
        Context init = new InitialContext();
        DataSource ds = (DataSource)init.lookup("java:comp/env/jdbc/OracleDB");
        conn = ds.getConnection();
        pstmt = conn.prepareStatement(sql);
        
        pstmt.setString(1, mb_id);
        
        updateCount = pstmt.executeUpdate();
        
        if(updateCount !=0){
            System.out.println("삭제성공");
        }else{
            System.out.println("삭제실패");
        }
        
    }catch(Exception e){
        System.out.println("연결에 실패하였습니다.(member_del)");
        out.println("<h3>연결에 실패하였습니다.(member_del)</h3>");
    }finally {
        try {
            pstmt.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }    
    response.sendRedirect("main.jsp"); /* 회원 삭제 후 main.jsp로 */
%>
 
cs