Servlet게시판3: 게시판 리스트·게시글전체목록·페이징처리

BoardFrontController.java의 doProcess()의 주소비교 후 처리부분에 코드 추가

1
2
3
4
5
6
7
8
9
10
11
12
	//게시글전체조회
}else if(command.equals("/BoardList.bo")){
System.out.println("컨트롤러: /BoardList.bo주소요청");
//게시글 전체를 확인 하려면 : .jsp(뷰) <- servlet(컨트롤러) <- .java(모델) <- DB로 이동 해야한다.
action = new BoardListAction();
System.out.println("컨트롤러 : BoardListAction객체 생성 execute() 호출");
try {
forward = action.execute(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}




boardList.jsp 생성

  • 페이징처리는 BoardListAction.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
<% 
//request 영역에 boardList 저장
ArrayList<BoardDTO> boardList = (ArrayList<BoardDTO>) request.getAttribute("boardList"); //캐스팅
int cnt = (int)request.getAttribute("cnt");

//페이징 정보 저장
String pageNum = (String)request.getAttribute("pageNum");
int pageCount = (Integer)request.getAttribute("pageCount");
int pageBlock = (Integer)request.getAttribute("pageBlock");
int startPage = (Integer)request.getAttribute("startPage");
int endPage = (Integer)request.getAttribute("endPage");

//6. 게시판 모든 내용을 화면에 출력
String id = (String) session.getAttribute("id");
%>
<fieldset>
<legend>땡땡게시판</legend>
<div id="contents">
게시판 총 글의 수 : <%=cnt%> 개
<%
if(id == null){
%>
<input class="btn" type="button" value="로그인" onclick="location.href='./MemberLogin.me'">
<%
}else if( id != null){
%>
<input class="btn" type="button" value="로그아웃" onclick="location.href='./MemberLogout.me'">
<input class="btn" type="button" value="글쓰기" onclick="location.href='./BoardWrite.bo'">
<input class="btn" type="button" value="파일 올리기" onclick="location.href='./FileBoardWrite.bo'">
<%
}
%>
<br>
<table>
<tr>
<th>글번호</th>
<th>제목</th>
<th>작성자</th>
<th>조회수</th>
<th>작성일</th>
<th>IP</th>
</tr>
<%//반복문
//ArrayList는 가변배열이므로 length가 없고 size가 존재한다.
//size()메서드는 배열의 요소의 갯수를 리턴
for(int i=0;i<boardList.size(); i++){
//ArrayList 한칸의 정보 ->BoardBean 객체 하나로 이동
BoardDTO bb = (BoardDTO)boardList.get(i);
%>
<tr>
<td><%=bb.getBno()%></td>
<td>
<%
//답글일때만 이미지넣기
//변수 wid를 이용하여 들여쓰기 처리
int wid = 0;
if(bb.getRe_lev() > 0){
wid= 10 * bb.getRe_lev(); //레벨값의 10을 곱한 값만큼 이미지 가로길이를 길게해줌
%>
<img src="./board/level.gif" width="<%=wid%>" height="15">
<img src="./board/re.gif">
<% } %>
<a href="./BoardContent.bo?bno=<%=bb.getBno()%>&pageNum=<%=pageNum%>"><%=bb.getSubject()%></a></td>
<td><%=bb.getName()%></td>
<td><%=bb.getReadcount()%></td>
<td><%=bb.getDate()%></td>
<td><%=bb.getIp()%></td>
</tr>
<%
}
%>
</table>
</div>
</fieldset>
<%
// 다른 페이지 이동 버튼
if(cnt != 0){
%>
<div id="pageBlock">
<%
// 이전
if(startPage > pageBlock){
%>
<a href="./BoardList.bo?pageNum=<%=startPage-pageBlock%>">[이전]</a>
<%
}
// 숫자 (1...10/11...20/.....)
for(int i=startPage;i<=endPage;i++){
%>
<a href="./BoardList.bo?pageNum=<%=i%>">[<%=i %>]</a>
<%
}
// 다음
if(endPage < pageCount){
%>
<a href="./BoardList.bo?pageNum=<%=startPage+pageBlock%>">[다음]</a>
<%
}
%>
</div>
<%
}
%>




BoardListAction.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
public class BoardListAction implements Action {

@Override
public ActionForward execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
System.out.println("모델: BoardListAction안의 execute() 실행됨");

// 페이징 처리*****************************
// 한 페이지에서 보여줄 글의 개수 설정
int pageSize = 10;
// 현 페이지의 페이지값을 확인
String pageNum = request.getParameter("pageNum");
if (pageNum == null) { // 페이지 정보가 없을경우 항상 1페이지
pageNum = "1";
}

// 시작 행번호 계산 1...10 / 11...20 / 21...30 / 31...40
int currentPage = Integer.parseInt(pageNum);

int startRow = (currentPage - 1) * pageSize + 1;

// 끝 행번호 계산
int endRow = currentPage * pageSize;
////////////////페이징 처리 위쪽//////////////////////////

// BoardDAO 객체 생성
BoardDAO bdao = new BoardDAO();
// 글 개수 체크하는 메서드, 정보 가져오는 메서드
// getBoardCount(), getBoardList()
int boardCount = bdao.getBoardCount();

//////////////////페이징 처리 아래쪽/////////////////////
// 전체 페이지수 - 글 50 / 화면 10씩 출력 => 5페이지
// - 글 56 / 화면 10씩 출력 => 6페이지

int pageCount = boardCount / pageSize + (boardCount % pageSize == 0 ? 0 : 1);

// 한 화면에 보여줄 페이지 번호개수
int pageBlock = 2;

// 페이지 블럭의 시작페이지 번호 1...10/11...20/21....30/31....40
int startPage = ((currentPage - 1) / pageBlock) * pageBlock + 1;

// 페이지 블럭의 끝 페이지 번호
int endPage = startPage + pageBlock - 1;
if (endPage > pageCount) {
endPage = pageCount;
}

// BoardDAO 객체 생성
BoardDAO bdao = new BoardDAO();
// 글 개수 체크하는 메서드, 정보 가져오는 메서드
// getBoardCount(), getBoardList()
int boardCount = bdao.getBoardCount();
// 글 개수 체크하는 메서드, 정보 가져오는 메서드
// getBoardCount(), getBoardList()

//글이 있는 경우에만 글 가져오기
ArrayList boardList = null;
if(boardCount > 0){
boardList = (ArrayList) bdao.getBoardList();
}
System.out.println("모델: "+boardList);
// 정보(글목록)를 가지고 .jsp페이지로 이동

// request 영역에 boardList 저장
req.setAttribute("boardList", boardList);
req.setAttribute("cnt", boardCount);

// 페이징처리를 위한 정보 추가 저장
request.setAttribute("pageNum", pageNum);
request.setAttribute("pageCount", pageCount);
request.setAttribute("pageBlock", pageBlock);
request.setAttribute("startPage", startPage);
request.setAttribute("endPage", endPage);

// 페이지 이동 (./board/boardList.jsp)
ActionForward forward = new ActionForward();
forward.setPath("./board/boardList.jsp");
forward.setRedirect(false);
return forward;
}

}




BoardDAO.java에 getBoardCount()메서드 추가 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//게시글카운트
public int getBoardCount(){
int cnt = 0;
try{
getCon();
sql="select count(*) from itwill_board";
pstmt = con.prepareStatement(sql);
rs = pstmt.executeQuery();
if(rs.next()){
cnt = rs.getInt(1);
}
System.out.println("DAO: DB에 저장된 글의 수 "+cnt);
} catch(Exception e) {
e.printStackTrace();
} finally{
closeDB();
}
return cnt;
}




BoardDAO.java에 getBoardList()메서드 추가 코드

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
//게시글불러오기
//실무에서 arraylist말고 list를 쓰는 이유는 부모의 기능들을 바로 사용하기 위해서임
//하위클래스로 캐스팅이 될때 사용할 수 있는 기능에 차이가 있다.
public List<BoardDTO> getBoardList() {
//List<BoardDTO> boardList = new List<>(); 안됨 따라서 class로 업캐스팅해줘야함
List<BoardDTO> boardList = new ArrayList<BoardDTO>(); //업캐스팅
try{
getCon();
sql="select * from itwill_board";
pstmt = con.prepareStatement(sql);
rs = pstmt.executeQuery();
while(rs.next()){
BoardDTO bdto = new BoardDTO();
bdto.setBno(rs.getInt("bno"));
bdto.setContent(rs.getString("content"));
bdto.setDate(rs.getDate("date"));
bdto.setFile(rs.getString("file"));
bdto.setIp(rs.getString("ip"));

bdto.setName(rs.getString("name"));
bdto.setPw(rs.getString("pw"));
bdto.setRe_lev(rs.getInt("re_lev"));
bdto.setRe_ref(rs.getInt("re_ref"));
bdto.setRe_seq(rs.getInt("re_seq"));

bdto.setReadcount(rs.getInt("readcount"));
bdto.setSubject(rs.getString("subject"));

boardList.add(bdto);
}
System.out.println("DAO: 게시글불러오기");
}catch(Exception e){
e.printStackTrace();
}finally{
closeDB();
}
return boardList;
}//end of getBoardList