19.05.24 게시판 보기 (model 2 동영상 12강~14강)

Back-End/JSP 2019. 5. 24. 17:23
728x90
반응형


-model 2 방식으로 게시판 전체 글보기-


model 1 방식때는 게시글, 전체글보기를 jsp로 구현했고,

model 2 방식은 컨트롤러 클래스 (서블릿) 가 구현

서블릿이 전체글이 담긴 DAO와 연결되서 데이터를 액세스(빈클래스 사용)하고 빈클래스에서 나온값을 벡터에 담고

다시 서블릿으로 가져와 JSP 에 넘겨서 글 보기가 가능하게 한다.

즉, 서블릿에서 처리하고 결과만 JSP에서 출력함


  1. 커넥션 풀 설정


  2. DAO (DB연결) 만들기


  3. 빈클래스 만들기


  4. 서블릿 클래스 (컨트롤러) 만들기





BoardListCon.java (게시글 리스트 서블릿)

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
package control;
 
import java.io.IOException;
import java.util.Vector;
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import model.BoardBean;
import model.BoardDAO;
 
/**
 * Servlet implementation class BoardListCon
 */

//@WebServilet는 서블릿 클래스의 요청을 위한 url 매핑을 보다 쉽게 자바 클래스에서

 설정할 수 있도록 제공되는 어노테이션 이다. 

//웹 서블릿 url 설정 

//url을  /BoadrListCon.do를 요청했을때 BoadrListCon.do가 호출이 된다.

 

@WebServlet("/BoardListCon.do")
public class BoardListCon extends HttpServlet {
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        reqPro(request, response);
    }
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        reqPro(request, response);
    }
 
    protected void reqPro(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // jsp쪽에서 출력되게끔 자료를 넘겨주어야 한다.
 
        // 화면에 보여질 게시글의 개수를 지정
        int pageSize = 10;
 
        // 현재 보여지고 있는 페이지의 넘버값을 읽어들인다.
        String pageNum = request.getParameter("pageNum");
 
        // null 처리
        if (pageNum == null) {
            pageNum = "1";
        }
        // 전체 게시글의 갯수
        int count = 0;
        // jsp 페이지 내에서 보여질 넘버링 숫자값을 저장하는 변수 선언
        int number = 0;
 
        // 현재 보여지고 있는 페이지 문자를 숫자로 변환
        int currentPage = Integer.parseInt(pageNum);
        // 전체 게시글의 갯수를 가져와야 하기에 데이터베이스 객체 생성
        BoardDAO bdao = new BoardDAO();
        count = bdao.getAllCount();
 
        // 현재 보여질 페이지 시작 번호를 설정
        int startRow = (currentPage - 1* pageSize + 1;
        int endRow = currentPage * pageSize;
 
        // 최신글 10개를 기준으로 게시글을 리턴 받아주는 메소드 호출
        Vector<BoardBean> v = bdao.getAllBoard(startRow, endRow);
        number = count - (currentPage - 1* pageSize;
 
        // BoardList.jsp 쪽으로 request 객체에 담아서 넘겨준다.
        request.setAttribute("v", v);
        request.setAttribute("number", number);
        request.setAttribute("pageSize", pageSize);
        request.setAttribute("count", count);
        request.setAttribute("currentPage", currentPage);
 
        // BoardList를 통해 forward를 시킨다.
        RequestDispatcher dis = request.getRequestDispatcher("BoardList.jsp");
        dis.forward(request, response);
 
    }
}
 
cs


BoardBean.java (빈 클래스)

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
package model;
 
public class BoardBean { // 빈클래스 생성
 
    private int num;
    private String email;
    private String subject;
    private String password;
    private String reg_date;
    private String writer;
    private int ref;
    private int re_step;
    private int re_level;
    private int readcount;
    private String content;
 
    public int getNum() {
        return num;
    }
 
    public void setNum(int num) {
        this.num = num;
    }
 
    public String getEmail() {
        return email;
    }
 
    public void setEmail(String email) {
        this.email = email;
    }
 
    public String getSubject() {
        return subject;
    }
 
    public void setSubject(String subject) {
        this.subject = subject;
    }
 
    public String getPassword() {
        return password;
    }
 
    public void setPassword(String password) {
        this.password = password;
    }
 
    public String getReg_date() {
        return reg_date;
    }
 
    public void setReg_date(String reg_date) {
        this.reg_date = reg_date;
    }
 
    public String getWriter() {
        return writer;
    }
 
    public void setWriter(String writer) {
        this.writer = writer;
    }
 
    public int getRef() {
        return ref;
    }
 
    public void setRef(int ref) {
        this.ref = ref;
    }
 
    public int getRe_step() {
        return re_step;
    }
 
    public void setRe_step(int re_step) {
        this.re_step = re_step;
    }
 
    public int getRe_level() {
        return re_level;
    }
 
    public void setRe_level(int re_level) {
        this.re_level = re_level;
    }
 
    public int getReadcount() {
        return readcount;
    }
 
    public void setReadcount(int readcount) {
        this.readcount = readcount;
    }
 
    public String getContent() {
        return content;
    }
 
    public void setContent(String content) {
        this.content = content;
    }
 
}
cs



BoardDAO.java (DB연결)

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
package model;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Vector;
 
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
 
public class BoardDAO {
 
    Connection con;
    PreparedStatement pstmt;
    ResultSet rs;
 
    // 데이터 베이스에 연결 메소드
    public void getCon() {
        try {
            Context initctx = new InitialContext();
            Context envctx = (Context) initctx.lookup("java:comp/env");
            // 타입이 데이터 소스이므로 데이터소스로 (타입변환해서) 받는다.
            DataSource ds = (DataSource) envctx.lookup("jdbc/pool");
            // 얻은 데이터소스를 사용해 연결한다.
            con = ds.getConnection(); // 커넥션 연결 해주는 메소드
 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    // 전체 게시글의 갯수를 리턴하는 메소드
    public int getAllCount() {
        getCon();
        // 개시글의 갯수를 세야하기 때문에 카운트 변수를 추가하고 초기값을 선언한다.
        int count = 0;
 
        try {
            // sql 쿼리 준비함
            String sql = "select count(*) from board";
            pstmt = con.prepareStatement(sql);
            // ?표가 없으므로 바로 결과실행후 리턴시켜주면 된다.
            rs = pstmt.executeQuery();
            // 전체게시글은 한칸에서 밖에 출력이 되지 않으므로 1칸만 있으면 된다. 반복문 말고 if문으로 사용한다.
            if (rs.next()) { // 데이터가 있다면 카운트에 넣는다.
                // 전체 게시글 수
                count = rs.getInt(1);
            }
            con.close();
 
        } catch (Exception e) {
            e.printStackTrace();
        }
        return count;
    }
 
    // 화면에 보여질 데이터를 10개씩 추출해서 리턴하는 메소드
    public Vector<BoardBean> getAllBoard(int startRow, int endRow) {
        // 리턴할객체 선언
        getCon();
        Vector<BoardBean> v = new Vector<>();
        try {
            // 쿼리 작성
            String sql = "select * from (select A.*, Rownum Rnum from (select * from board order by ref desc, re_step asc)A)"
                    + "where Rnum >= ? and Rnum <= ?";
            // 쿼리 실행할 객체를 선언
            pstmt = con.prepareStatement(sql);
            pstmt.setInt(1, startRow);
            pstmt.setInt(2, endRow);
            // 쿼리실행후 결과 저장
            rs = pstmt.executeQuery();
            // 데이터 개수가 몇개인지 모르기에 반복문을 이용하여 데이터를 추출
            while (rs.next()) {
                // 데이터를 패키징 ( BoardBean 클래스를 이용) 해줌
                BoardBean bean = new BoardBean();
                bean.setNum(rs.getInt(1));
                bean.setWriter(rs.getString(2));
                bean.setEmail(rs.getString(3));
                bean.setSubject(rs.getString(4));
                bean.setPassword(rs.getString(5));
                bean.setReg_date(rs.getDate(6).toString());
                bean.setRef(rs.getInt(7));
                bean.setRe_step(rs.getInt(8));
                bean.setRe_level(rs.getInt(9));
                bean.setReadcount(rs.getInt(10));
                bean.setContent(rs.getString(11));
                // 패키징한 데이터를 벡터에 저장
                v.add(bean);
            }
            con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return v;
    }
 
}
 
cs



BoardList.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
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<body>
    <center>
        <h2>전체 게시글 보기</h2>
        <table width="700" border="1" bordercolor="skyblue">
            <tr height="40">
                <td colspan="5" align="right">
                    <button onclick="location.href='BoardWriteForm.jsp'">글쓰기</button>
                </td>
            </tr>
 
            <tr height="40">
                <td width="50" align="center">번호</td>
                <td width="320" align="center">제목</td>
                <td width="100" align="center">작성자</td>
                <td width="150" align="center">작성일</td>
                <td width="80" align="center">조회수</td>
            </tr>
            <!-- $안에 number을 사용하면 계속 number만 출력되기 때문에 forEach문으로 number을 계속 1씩 감소시켜야 한다. -->
            <c:set var="number" value="${number}" />
            <c:forEach var="bean" items="${v}">
 
 
                <tr height="40">
                    <td width="50" align="left">${number }</td>
                    <td width="50" align="left">
                        <!-- 들여쓰기 구문 --> <!-- 첫번째 (1) 은 들여쓰기할 필요가 없다. --> <!-- 공백을 여러개 출력하기 위한 구문 -->
                        <c:if test="${bean.re_step > 1 }">
                            <c:forEach var="j" begin="1" end="${(bean.re_step-1)*5}">
                &nbsp;
            </c:forEach>
                        </c:if<!-- 버튼을 눌렀을때 실행이 되게끔 a태그를 건다 --> <a
                        href="BoardInfoControl.do?num=${bean.num }">${bean.subject } </a>
 
                    </td>
                    <td width="50" align="left">${bean.writer }</td>
                    <td width="50" align="left">${bean.reg_date }</td>
                    <td width="50" align="left">${bean.readcount }</td>
                </tr>
                <c:set var="number" value="${number-1 }" />
            </c:forEach>
        </table>
 
    </center>
</body>
</html>
cs



728x90
반응형
: