19.05.24 게시판 보기 (model 2 동영상 12강~14강)
Back-End/JSP 2019. 5. 24. 17:23
-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}">
</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 |
'Back-End > JSP' 카테고리의 다른 글
19.05.25 jsp 게시판 쓰기 (model 2 동영상 16강) (0) | 2019.05.25 |
---|---|
19.05.25 jsp 게시판 보기 (model 2 동영상 15강) (0) | 2019.05.25 |
19.05.24 회원가입 (model 2 동영상 11강) (0) | 2019.05.24 |
Dispatcher 방식과 Redirect 방식 (0) | 2019.05.24 |
19.05.23 고급 서블릿 파라미터 활용 (model 2 동영상 9강~10강) (0) | 2019.05.23 |