참조 페이지 : http://ndba.egloos.com/tb/2831611


오늘은 JSP에서 테이블 내용을 페이징 처리 하는 방법에 대해 연습해 보았다.



코드는 Color Scripter에서 잘라서 붙이려니, 페이지 내에 문제가 생겨서 통째로 밑에 올리고


위에서는 설명만 적도록 했다.


먼저, 테이블의 내용은 JAVA 클래스를 따로 만들어 메소드를 호출하여 ArrayList에 담아서 불러 오도록 하였다.


메소드 호출하는데 사용한 주요한 변수 2가지는.


1. 현재 페이지의 번호.


2. 페이지당 보여줄 행의 갯수.


로 정했다.


현재 페이지의 번호 currentPage 는 상수 1로 고정하였지만, [다음] 버튼을 누를 시에는 페이지 번호 값이 담긴 파라미터가 넘어 오므로,


그에 해당하는 페이지 번호로 변경 되게 하였다.


페이지당 보여줄 행의 갯수는, pagePerRow 자유롭게 선택해서 정하면 된다.


전체 행의 갯수 rowNumber는 역시 메소드를 따로 만들어 호출해서 값을 받아내어 변수에 담아서 사용하도록 하였다.



페이징 시에 보여줄 버튼은



이런 형태를 가지게 된다.



이전, 다음 버튼부터 설명 하자면,


이전 버튼은 현재 페이지의 번호가 1보다 클 때만 나타나도록 하였다.


다음 버튼은 현재 페이지의 번호가 마지막 페이지의 번호(총 페이지의 갯수 lastPage) 보다 작을 때만 나타나도록 하였다.



1,2,3,4,5...의 넘버링은


for문을 활용하는 것이 좋을 것 같다고 생각하였다.


다만, 페이지가 너무 많아지면 끝도 없이 (ex) 1000,1001,...) 넘버링이 길어지는 문제가 생기는데,


이 부분에 대한 해결책은 더 고민해보아야 할 것 같다.


페이징 하는데 이용한 계산식은,


총 페이지의 갯수  lastPage = (( 모든 행의 갯수 rowNumber - 1) / 페이지당 보여줄 행의 갯수 pagePerRow) + 1 ;


를 이용하여  계산 하였다.


<!-- 2018-07-11 이광재 -->
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
<%@ page import = "service.EmployeeDao"%>
<%@ page import = "service.Employee" %>
<%@ page import = "java.util.ArrayList"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>EmployeeList</title>
<style>
.zui-table {
border: solid 1px #DDEEEE;
border-collapse: collapse;
border-spacing: 0;
font: normal 13px Arial, sans-serif;
}
.zui-table thead th {
background-color: #DDEFEF;
border: solid 1px #DDEEEE;
color: #336B6B;
padding: 10px;
text-align: left;
text-shadow: 1px 1px 1px #fff;
}
.zui-table tbody td {
border: solid 1px #DDEEEE;
color: #333;
padding: 10px;
text-shadow: 1px 1px 1px #fff;
}
</style>
</head>
<body>
<h3>직원 명부</h3>
<table class="zui-table">
<tr>
<th>no</th>
<th>name</th>
<th>age</th>
<th>주소입력</th>
<th>점수보기</th>
<th>삭제</th>
<th>수정</th>
</tr>
<%
int currentPage = 1;
if(request.getParameter("currentPage") != null) {
currentPage = Integer.parseInt(request.getParameter("currentPage")); // String 타입으로 넘어온 "currentPage" 변수의 타입을 int로 변환하여 저장한다.
}
int pagePerRow = 5;
EmployeeDao employeeDao = new EmployeeDao();
ArrayList<Employee> list = employeeDao.selectEmployeeByPage(currentPage, pagePerRow);
System.out.println(list + " : 01 list check");
int rowNumber = employeeDao.selectRowNumber();
for(int i=0; i<list.size(); i++) {
%>
<tr>
<td><%=list.get(i).getEmployeeNo()%></td>
<td><a href="./EmployeeAddrList.jsp?no=<%=list.get(i).getEmployeeNo()%>"><%=list.get(i).getEmployeeName()%></a></td>
<td><%=list.get(i).getEmployeeAge()%></td>
<td><a href="./InsertEmployeeAddrForm.jsp?no=<%=list.get(i).getEmployeeNo()%>">주소입력</a></td>
<td><a href="./EmployeeAndScore.jsp?employeeNo=<%=list.get(i).getEmployeeNo() %>">점수보기</a></td>
<td><a href="./DeleteEmployeeAction.jsp?no=<%=list.get(i).getEmployeeNo()%>">삭제</a></td>
<td><a href="./UpdateEmployeeForm.jsp?no=<%=list.get(i).getEmployeeNo()%>">수정</a></td>
</tr>
<%
}
%>
</table>
<%
if(currentPage>1) { //currentPage 값이 1보다 클때만 실행
%>
<a href="./EmployeeList.jsp?currentPage=<%=currentPage-1%>">이전</a> <!-- 이전 페이지 버튼 클릭시 "currentPage"변수로 currentPage-1의 값을 전송 -->
<%
}
/* 마지막 페이지의 번호 구하기(페이지의 총 갯수는 총 행의 갯수 -1에서 페이지당 보여줄 행의 수를 나눈 몫에다가 1을 더한다.)
예) (총 행 갯수 (25 - 1) / 페이지당 보여줄 행의수 5 = 5) +1 = 마지막 페이지의 번호는 5 --> 행 갯수와 PPR이 딱 나누어 떨어질 때
예) (총 행 갯수 (27 - 1) / 페이지당 보여줄 행의수 5 = 5) +1 = 마지막 페이지의 번호는 6 --> 행 갯수와 PPR이 딱 나누어 떨어지지 않을 때
*/
int lastPage = ((rowNumber - 1) / pagePerRow) + 1 ;
System.out.println(rowNumber + " : rowNumber called");
System.out.println(pagePerRow + " : pagePerRow called");
System.out.println(lastPage + " : lastPage called");
/* if ((employee.getRowNumber()-1) % pagePerRow !=0) { // rowNumber-1의 값과 페이지당 행의 수와의 나머지가 1이 아닐때
lastPage++;
}
*/
int pageNum = 0;
for(int i=1; i<=lastPage; i++) {
%>
<a href="./EmployeeList.jsp?currentPage=<%=i%>">[<%=i%>]</a>
<%
}
if(currentPage<lastPage) { /* 현재 페이지 넘버가 마지막 페이지 넘버보다 작아졌을때만 실행. */
%>
<a href="./EmployeeList.jsp?currentPage=<%=currentPage+1%>">다음</a> <!-- 다음 페이지 버튼 클릭시 "currentPage"변수로 currentPage+1의 값을 전송 -->
<%
}
%>
<br><br>
<a href = "./index.jsp">메인화면으로..</a>
</body>
</html>



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
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<%@ page import = "kr.or.ksmart.dao.Mdao" %>
<%@ page import = "kr.or.ksmart.dto.Member" %>
<%
    String id = request.getParameter("id"); // 로그인 폼에서 넘어온 아이디 저장
    String pw = request.getParameter("pw"); // 로그인 폼에서 넘어온 비번 저장
    System.out.println(id + "<-- id");
    System.out.println(pw + "<-- pw");
 
    Mdao dao = new Mdao(); // Mdao클래스의 객체 생성 및 할당
    int ok = dao.mLoginCheck(id,pw); // dao 객체내의  mLoginCheck 메소드 호출후 리턴 값 저장
    System.out.println(ok + "<===리턴 받은 ok");
    
    Member member = new Member(); // Member 클래스 객체 생성
    
    if(ok == (1)) {    // 변수 ok에 저장된 값에 따라 분기문 작성
        member = dao.mGetForSession(id);    //dao 객체내의 mGetForSession메소드 호출후 리턴되는 member 객체주소값 저장
        session.setAttribute("S_NAME", member.getM_name()); // setAttribute메소드를 호출하여 member 객체 내의 get메소드로 호출되는 값을 변수에 저장
        session.setAttribute("S_LEVEL", member.getM_level());
        session.setAttribute("S_ID", member.getM_id());
        //response.sendRedirect(request.getContextPath()+"/index.jsp");
%>
        <script type="text/javascript">
            alert('로그인성공');
            location.href='<%= request.getContextPath()%>/index.jsp';
        </script>
<%
    } else if(ok == 2) {
        System.out.println("04 비번 불일치");
%>
        <script type="text/javascript">
            alert('비번불일치');
            location.href='<%= request.getContextPath()%>/index.jsp';
        </script>
<%
    } else if(ok == 3) {
        System.out.println("02 아이디 불일치");
%>    
        <script type="text/javascript">
            alert('아이디 불일치');
            location.href='<%= request.getContextPath()%>/index.jsp';
        </script>     
<%
    }
%>
 
cs


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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
public class Mdao {
    //01입력처리 메서드 선언
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    ArrayList<Member> alm = null;
    // 로그인 성공시에 DB에서 id과 일치하는 행의 id,level,name 컬럼 값을 조회하는 메소드
    public Member mGetForSession(String in_id) throws ClassNotFoundException, SQLException {
        System.out.println("mGetForSession 호출 완료");
        
        DriverDB db = new DriverDB(); // 생성자 메소드로 DB 객체 생성
        System.out.println(db + " : db 객체의 참조 주소값");
        
        conn = db.driverDbcon(); // driverDbcon메소드를 호출하여 Connection 객체 생성(DB연결)
        
        // prepareStatement 메소드로 PreparedStatement객체 생성(쿼리문 실행 준비)
        pstmt = conn.prepareStatement("select m_id, m_level, m_name from tb_member where m_id=?"); 
        pstmt.setString(1, in_id);
        System.out.println(pstmt + "<==pstmt 쿼리문 조회");
        rs = pstmt.executeQuery(); // 쿼리문 실행 후 조회된 테이블 ResultSet 객체에 저장
        
        Member member = new Member(); // 읽어낸 값 Member 객체에 세팅할 준비.
        
        if(rs.next()) { // rs 객체내의 테이블의 행을 조사한다.
            member.setM_id(rs.getString("m_id")); // set 메소드를 호출하여 값을 세팅
            member.setM_level(rs.getString("m_level"));
            member.setM_name(rs.getString("m_name"));
        }
        
        if (rs != null) { //rs 객체 종료
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (pstmt != null) { //pstmt 객체 종료
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) { // conn 객체 종료
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        
        return member; //member 객체 주소값 리턴
    }
    // 로그인 성공, 비번확인,아이디 확인하는 메소드
    public int mLoginCheck(String in_id,String in_pw) throws ClassNotFoundException, SQLException {
        System.out.println("mLoginCheck 호출 완료");
        
        DriverDB db = new DriverDB();    // 생성자 메소드로 DB 객체 생성
        System.out.println(db + " : db 객체의 참조 주소값");
        
        conn = db.driverDbcon();    // driverDbcon메소드를 호출하여 Connection 객체 생성(DB연결)
        
        // prepareStatement 메소드로 PreparedStatement객체 생성(쿼리문 실행 준비)
        pstmt = conn.prepareStatement("select m_pw from tb_member where m_id=?");
        pstmt.setString(1, in_id);
        System.out.println(pstmt + "<==pstmt 쿼리문 조회");
        rs = pstmt.executeQuery();// 쿼리문 실행 후 조회된 테이블 ResultSet 객체에 저장
        
        int ok = 0//리턴할 값 저장할 변수 초기화.
        
        if(rs.next()) { // rs 테이블내의 행 조회
            if(rs.getString("m_pw").equals(in_pw)) { // 조회된 m_pw 컬럼의 값이 in_pw 변수내의 값과 일치 할 경우 로그인 성공 1 리턴
                System.out.println("로그인 성공");
                 ok = 1;
            } else {
                System.out.println("비번 불일치"); // 다를 경우 실패 2 리턴
                ok = 2;
            }
        } else {
            System.out.println("아이디 불일치"); // 아이디가 다를경우 실패 3리턴
            ok = 3;
        }
        
        if (rs != null) {//rs 객체 종료
            try {
                rs.close();
            } catch (SQLException e) { //pstmt 객체 종료
                e.printStackTrace();
            }
        }
        if (pstmt != null) { // conn 객체 종료
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        
        return ok; // ok에 담긴 값 리턴
    }
cs



1. 로그인 폼에서 id,pw 입력 후 전송


2. login_pro에서 전송된 값 저장.


3. 저장된 값을 매개변수로 mLoginCheck 메소드 호출


4. 호출된 메소드 내에서 DB내의 id,pw 값과 비교 후 일치하는 행과 값이 있으면 1, pw가 다르면 2, 행이 없으면 3을 리턴 한다.


5. 리턴 된 값을 변수에 저장한다.


6. 1의 경우는 로그인에 성공했으므로, mGetForSession 메소드를 호출하여 DB내 1명의 회원 정보를 조회하고 member 객체 내에 값을 set 메소드를 호출해서 세팅하고 객체의 주소 값을 리턴 한다.


7. 리턴 된 member 객체의 주소 값을 참조하여, get메소드를 호출하여 세팅된 값을 불러온다.


8. 불러온 값을 setAttribute 메소드의 매개변수로 입력해서 변수에 저장한다. 그리고 로그인 성공 경고창을 띄우고 index페이지로 리다이렉트 한다.


9. 2,3의 경우는 로그인 실패의 경우이므로 비번 불일치, 아이디 불일치 경고창을 띄우고 index페이지로 리다이렉트 한다.





이상 JSP DTO,DAO를 활용한 로그인 세션 처리에 대해 정리하여 보았다.






JSP 페이지에서 게시판을 만들고, 게시글 내의 페이지에서 덧글 기능을 추가하여 보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//board 상세 내용 출력하는 부분
                    
                    String sql = "SELECT board_no,member_id,board_title,board_content,board_pw,board_date FROM board where board_no=?";
                    pstmt = conn.prepareStatement(sql);
                    pstmt.setString(1,sendBoardNo);
                    System.out.println(pstmt + " : confirm pstmt");
                    
                    rs = pstmt.executeQuery();
                    
                    
                    if(rs.next()) {
                %>
                        <div id="view_title_box">
                            <span><%=rs.getString(3%></span>
                            <span id="info"><%=rs.getString(2%> | 조회:208 | <%=rs.getString(6%></span>
                        </div>
                        <p id="view_content">
                            <%=rs.getString(4%>
                        </p>
                <%
                    }
                %>
cs


쿼리문은 글 번호가 일치하는 게시물의 번호, 글쓴이의 id, 글 제목, 글 내용, 글 비밀번호, 작성 시간의 부분을 조회하는 내용이다.


rs 객체에 담겨진 테이블은 rs.getString()에 의해 글의 제목, 작성자 id, 글의 내용이 페이지 내에 출력되게 된다.


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
<!-- 덧글 리스트 -->
                <!-- 페이징 or 덧글의 수가 5개까지 허용되도록 --> 
                <%
                    //덧글 리스트 select
                    String commentListQuery = "SELECT member_id, board_comment_content FROM board_comment WHERE board_no=?";
                    pstmt2 = conn.prepareStatement(commentListQuery);
                    pstmt2.setString(1, sendBoardNo);
                    System.out.println(pstmt2 + " : confirm pstmt2");
                    
                    //덧글의 갯수 select
                    String countListQuery = "SELECT count(*) as countList FROM board_comment where board_no=?";
                    pstmt3 = conn.prepareStatement(countListQuery);
                    pstmt3.setString(1, sendBoardNo);
                    
                    rs2 = pstmt2.executeQuery();
                    System.out.println(rs2 + " : confirm rs2");
                    
                    rs3 = pstmt3.executeQuery();
                    System.out.println(rs3 + " : confirm rs3");
                    
                    //덧글 갯수 변수에 저장
                    int countList = 0;
                    if(rs3.next()){
                        countList = rs3.getInt(1);
                    }
                %>
cs


덧글에 관련된 코드이다.


첫번째 쿼리는 글 번호가 일치하는 글의 작성자 id, 덧글들을 board_comment 테이블에서 조회하는 내용이다.


두번째 쿼리는 글 번호가 일치하는 board_comment 내의 모든 행의 갯수를 조회하는 내용이다.


그 후 rs3 객체에 담겨진 두번째 쿼리 실행의 결과 테이블은 countList 변수에 값이 담기게 된다.



                    //덧글 리스트 출력
                    while(rs2.next()){
                %>
                        <tr>
                            <td><%=rs2.getString(1%></td>
                            <td><%=rs2.getString(2%></td>
                        </tr>
                <%
                    }
                %>


덧글 리스트를 출력하는 코드로 rs2 객체내 테이블의 행을 조사하여 컬럼의 값들을 행의 마지막 까지 페이지에 출력하게 한다.


                <!-- 덧글 입력하는 폼 -->
                <form action="./insertCommentAction.jsp" method="post">
                    <div id="comment_box">
                        <img id="title_comment" src="img/title_comment.gif">
                        <textarea name="boardCommentContent"></textarea>
                        <%
                            //로그인 세션이 있을때만 덧글 작성 가능.
                            if(session.getAttribute("loginInfo"!= null){
                                //덧글 갯수가 5개 미만일때 글쓰기 버튼 표시
                                if(countList < 5) {
                        %>
                                    <input type="image" id="ok_ripple" src="img/ok_ripple.gif"><br>
                        <%
                                } else { //덧글갯수가 5개 이상이면 글쓰기 버튼 없애기
                        %>
                                    <img src="img/comment_limit_5.jpg" id="ok_ripple2">
                        <%
                                }
                            } else {//로그인 세션이 없을때는 로그인 먼저 하라는 그림 출력
                        %>
                                <img src="img/first_login.jpg" id="ok_ripple2">
                        <%                                
                            }
                        %>    
                        <input type="hidden" name="boardNo" value="<%=sendBoardNo %>"><br>
                        <input type="hidden" name="loginInfo" value="<%=session.getAttribute("loginInfo")%>">
                    </div>
                </form>

덧글을 입력하는 폼의 코드 부분이다.


폼에서 insertCommentAction.jsp페이지로 post 방식을 통해 값을 넘겨주도록 하였다.


로그인 세션이 있을때애는 덧글 작성확인 이미지 버튼이 표시되게 하였고,


없을때에는 로그인을 먼저 하라는 사진이 표시되도록 하였다.


그리고 덧글이 5개 이상일 경우에는 더 이상 덧글을 작성할 수 없다는 그림을 표시하게 하였다.


1
2
3
4
5
6
7
8
9
10
11
12
13
            // 덧글 사용 쿼리문 작성
            String insertCommentQuery = "INSERT INTO board_comment (board_no, board_comment_content, member_id) VALUES (?, ?, ?)";
            pstmt = conn.prepareStatement(insertCommentQuery);
            pstmt.setInt(1, boardNo);
            pstmt.setString(2, boardCommentContent);
            pstmt.setString(3, loginInfo);
            
            //쿼리문 실행
            pstmt.executeUpdate();
            
            //덧글 작성 글로 리다이렉트
            response.sendRedirect("./boardDetail.jsp?sendboardno=" + boardNo);
 
cs


boardDetail.jsp 페이지에서 전송된 정보를 받아서 mysql데이터 베이스에 입력하도록 하는 페이지다.


쿼리문은 글 번호, 덧글 내용, 작성자 id 컬럼에 입력값을 담아서 삽입하는 내용이다.


PreparedStatement 객체내 executeUpdate()메소드가 실행되어 삽입이 완료 되고, 


boardDetail.jsp의 글 번호에 해당하는 글로 리다이렉트 되도록 하였다.





덧글 리스트와 덧글 작성 부분이다.




덧글이 5개 이상이면 덧글쓰기 버튼이 이미지로 전환된다.


로그인을 하지 않은 상태에서는 로그인을 먼저 하라는 이미지가 출력된다.







이상 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
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
77
78
79
80
81
82
83
84
85
86
87
88
89
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
<!Doctype html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
        <style>
            * {
                margin:0;
                padding:0;
            }
            ul {
                list-style-type:none;
            }
            body {
                font-family:"맑은 고딕", "돋움";
                font-size:12px;
                color:44444;
            }
            #login_box {
                width:220px;
                height:120px;
                border:solid 1px #bbbbbb;
                border-radius:15px;
                margin:10px 0 0 10px;
                padding:10px 0 0 15px;
            }
            h2 {
                font-family:"Arial";
                margin-bottom:10px;
            }
            #login_box input {
                width:100px;
                height:18px;
            }
            #id_pass, #login_btn {
                display:inline-block;
                vertical-align:top;
            }
            #id_pass span {
                display:inline-block;
                width:20px;
            }
            #pass {
                margin-top:3px;
            }
            #login_btn button {
                margin-left:5px;
                padding:12px;
                border-radius:5px;
            }
            #btns {
                margin:12px 0 0 0;
                text-decoration:underline;
            }
            #btns li {
                margin-left:10px;
                display:inline;
            }
        </style>
    </head>
    <body>
        <form action="./loginAction2.jsp" method="post">
            <div id="login_box">
                <h2>Member Login</h2>
                <ul id="input_button">
                    <li id="id_pass">
                        <ul>
                            <li>
                                <span>ID</span>
                                <input type="text" name="id">
                            </li>
                            <li id="pass">
                                <span>PW</span>
                                <input type="password" name="pw">
                            </li>
                        </ul>
                    </li>
                    <li id="login_btn">
                        <button>로그인</button>
                    </li>
                </ul>
                <ul id="btns">
                    <li>회원가입</li>
                    <li>아이디/비밀번호 찾기</li>
                </ul>
            </div>
        </form>
    </body>
</html>
cs

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
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
<%@ page import = "java.sql.*"%>
<!Doctype html>
<%
    //request.setCharacterEncoding("EUC-KR");
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    
    String loginid = request.getParameter("id");
    String loginpw = request.getParameter("pw");
    System.out.println(loginid + "<---loginid");
    System.out.println(loginpw + "<---loginpw");
    
    Class.forName("com.mysql.jdbc.Driver");
    
    String dbaddress = "jdbc:mysql://localhost:3306/member_list?useUnicode=true&characterEncoding=euckr";
    String dbid = "root";
    String dbpw = "java0000";
    
    conn = DriverManager.getConnection(dbaddress, dbid, dbpw);
    System.out.println(conn + "<---conn");
    
    String sql = "SELECT dbid,dbpw,name,phone,email,address,memo,picture from join_member where dbid=? and dbpw=?";
    pstmt = conn.prepareStatement(sql);
    System.out.println(pstmt + "<---01 pstmt");
    
    pstmt.setString(1, loginid);
    pstmt.setString(2, loginpw);
    System.out.println(pstmt + "<---02 pstmt");
    
    rs = pstmt.executeQuery();
    System.out.println(rs + "<---rs");
    
    if(rs.next()) {
        rs.getString("dbid");
        rs.getString("name");
        rs.getString("phone");
        rs.getString("email");
        rs.getString("address");
        rs.getString("memo");
        rs.getString("picture");
        out.println("로그인 성공");
        System.out.println(rs.getString("dbid"));
        System.out.println(rs.getString("name"));
        System.out.println(rs.getString("phone"));
        System.out.println(rs.getString("email"));
        System.out.println(rs.getString("address"));
        System.out.println(rs.getString("memo"));
        System.out.println(rs.getString("picture"));
    } else {
        System.out.println("로그인 실패");
        response.sendRedirect("./loginForm2.jsp");
    }
 
%>
cs





setString(?의 번호, 입력변수) 메소드로 ?에 입력값을 대입해주지 않으면 


com.mysql.jdbc.JDBC4PreparedStatement@14ed38ee: SELECT dbid,dbpw,name,phone,email,address,memo,picture from join_member where dbid=** NOT SPECIFIED ** and dbpw=** NOT SPECIFIED **<---02 pstmt


id password를 입력해도 쿼리문에 값이 입력되지 않아서


java.sql.SQLException: No value specified for parameter 1


예외가 발생한다.



getRequestURI() : 페이지의 주소만 출력한다.



getRequestURL() : 페이지의 주소, 프로토콜, 포트번호까지 출력한다.



getParameter : 


rerurn 값이 문자열 (String)인것만 받을 수 있음.


주로 쿼리 스트링 값을 받는데 사용함







getAttribute : 


return 값으로 object를 사용 가능하므로 객체를 담을 수 있음.


object type을 사용하기 때문에 객체를 담는데 주로 사용한다.



 

GET 방식 : 어떤 정보를 가져오기

URL에 변수를 포함시켜 요청
→ 즐겨찾기 추가 가능? 브라우저에서 URL을 입력하여 접근하는 방식이 이것
? 데이터가 헤더에 포함되어 전달됨
? URL에 데이터가 노출됨
? 길이 제한이 있음
? 캐시될 수 있음

URL?변수명1=값1&변수명2=값2&변수명3=값3&…


/hello/test.php?name1=value1&name2=value2

 

GET은 Select적인 성향을 가지고 있습니다. GET은 서버에서 어떤 데이터를 가져와서 보여준다거나 하는 용도이지 서버의 값이나 상태등을 바꾸지 않습니다. 게시판의 리스트라던지 글보기 기능 같은 것이 이에 해당하죠.(방문자의 로그를 남긴다거나 글읽은 횟수를 올려준다거나 하는건 예외입니다.)

 


POST 방식 : POST는 서버의 값이나 상태를 바꾸기 위해서 사용합니다. 글쓰기를 하면 글의 내용이 디비에 저장이 되고 수정을 하면 디비값이 수정이 되죠. 이럴 경우에 POST를 사용합니다.


?데이터가 본문(BODY)에 포함되어 전달됨
?URL에 데이터가 노출되지 않음
→ 즐겨찾기 추가 불가?길이 제한이 없음
?캐시되지 않음


POST /hello/test.php HTTP/1.1
Host: jmnote.com
name1=value1&name2=value2

 


절대경로 : 전체 경로와 같은말로

예) C:\Program Files\Java\jdk1.8.0_144\README.html

이와같이 파일의 고유한 장소를 전체적으로 나타내는것을 의미한다.

 

 


상대경로 : 같은 웹 사이트, 혹은 폴더 안에 있는 주소를 의미한다.

예) home폴더 안에 home.html페이지에서 하위 폴더인 sub_dir폴더의 page1.html로 링크를 걸때는
sub_dir/page1.html로 경로 설정.

반대로 sub_dir폴더내의 page1.html페이지에서 상위 폴더인 home폴더의 home.html로 링크를 걸 때는 ../home.html로 경로 설정.

../의 의미는 현재 위치하는 폴더로부터 한단계 전단계로 이동한다는 뜻임.

2단계 상위로 이동할때는  ../../home.html로 설정.


/ 최상위 경로를 의미
./ 현재 폴더를 의미
../ 상위 폴더를 의미


 

+ Recent posts