공부한것들을 정리하는 블로그 입니다.
7-6. 페이징처리(paging, pagination) : BoardDAO.java, BoardList2.jsp, PagingVO.java 본문
7-6. 페이징처리(paging, pagination) : BoardDAO.java, BoardList2.jsp, PagingVO.java
호 두 2019. 7. 4. 17:53
이번 실습에서는 페이징을 다뤄보도록 하겠습니다.
원래 페이징처리는 조금 나중에 다룰 예정이였습니다만, 아래의 이유로 인하여 먼저 포스팅하게 되었습니다.
먼저 2년전에 작성했던 페이징글이 너무 옛날 코드라서 최신코드로 수정이 필요했습니다. 2년전에 작성했던 페이징 관련 글( https://drsggg.tistory.com/35 ) 에서 사용했던 API가 바뀌어서 현행화 할 필요가 있었습니다.( 지난 코드들은 API변경으로 인하여 복붙으로는 사용불가 )
본 실습(7단원) 이후에 해당 코드(servlet + jsp)들을 Spring MVC 혹은 Annotation을 이용하여 의존성주입 및 제어의 역전 실습을 진행 할 예정인데( 8단원 이후.. ), 페이징을 구글링 하였을때 보편적으로 출력되는 게시물들은 대개 Spring MVC를 이용하였거나 의존성주입 및 제어의 역전이 이미 적용 된 상태였습니다. 하여 제가 원하는 형태에 마무리까지 완전히 구현된 게시글 페이징 글을 찾기 어려워 우선 포스팅하게 되었습니다.
기능을 완성하고 보니 몇가지 수정사항이 존재하긴 합니다만, 앞서 말씀드렸다시피 추후 진행 될 실습에서 다시한번 다룰 예정이므로 그때 코드를 다듬어 나가도록 하겠습니다.
보통 구글링할때 페이징이라고 하지만, 영문 검색을 할 때는 paging 또는 pagination 이라고 부릅니다.
( pageable은 조금 차이가 있죠. 자세한건 추후 다루도록 하겠습니다.
org.springframework.data.domain.Pageable : 페이징을 지원하며 파라미터에 Pageable을 사용하면 리턴형으로 List나 org.springframework.data.domain.Page 사용 한다. )
paging은 자원을 보존하기 위해 데이터베이스에서 항목의 한 페이지를 로드하는 작업입니다.(ex) SQL 및 Model단 )
pagination은 사용자가 다음에 로드 할 페이지를 선택할 수 있도록 일련의 페이지 번호를 제공하는 UI 요소입니다. (ex 각종 버튼들 : << 이전 1 2 3 4 5 다음 >> )
1. 소스 경로
2. 데이터 INSERT
3. 페이징 처리 된 화면캡처
4. PagingVO.java 신규 추가 및 페이징처리 관련 코드 추가
5. BoardDAO.java 에 페이징처리 관련 코드 추가
6. getBoardList2.jsp 신규 추가 및 페이징처리 관련 코드 추가
1. 소스 경로
2. 데이터 INSERT
- 우선 DB에 테스트를 위한 데이터를 넣어줍니다. 저는 여러가지 상황에 대한 화면 및 예시를 보여드리기 위해 101개를 넣어주었습니다.
package com.springbook.biz.board;
import java.util.List;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class BoardServiceClient {
public static void main(String[] args) {
AbstractApplicationContext container =
new GenericXmlApplicationContext("applicationContext.xml");
BoardService boardService = (BoardService)container.getBean("boardService"); // @Service("boardService") : BoardServiceImpl
// 게시글 입력
BoardVO vo = new BoardVO();
// vo.setTitle("임시 제목");
// vo.setWriter("홍길동");
// vo.setContent("임시 내용...........");
// boardService.insertBoard(vo);
// System.out.println("[" + BoardServiceClient.class.getSimpleName() + "] " + vo.toString());
for (int i = 0; i < 101; i++) {
vo.cleanUp();
vo.setTitle("임시 제목 " + String.valueOf(i+1));
vo.setWriter("홍길동");
vo.setContent("임시 내용........... " + String.valueOf(i+1));
boardService.insertBoard(vo);
System.out.println("[" + BoardServiceClient.class.getSimpleName() + "] " + vo.toString());
}
// vo 초기화
boardService.cleanUp(vo);
System.out.println("[" + BoardServiceClient.class.getSimpleName() + "] " + vo.toString());
// 게시글 조회
vo.setSearchCondition("TITLE");
List<BoardVO> boardList = boardService.getBoardList(vo);
for(BoardVO board: boardList) {
System.out.println("[boardList] " + board.toString());
}
container.close();
}
}
3. 페이징 처리 된 화면캡처
- 편의성을 위해 화면을 캡처하여 올립니다.
index.jsp
- getBoardList2.jsp 로 이동하는 부분 추가
첫 페이지 화면
- 최근에 입력 된 화면이 최상단에 위치하도록 정렬
- 전체 게시글 수가 101개 이므로, 전체 페이지 갯수는 11개(마지막 11페이지는 출력되는 게시글 1개)
- 1페이지(첫 페이지)에서는 이전버튼 클릭 불가
- 마찬가지로 11페이지(마지막 페이지) 에서도 다음버튼 클릭 불가
5페이지(화면상에 출력된 페이지번호 중 마지막) 클릭 시 화면
- 클릭된 페이지번호는 <a> 태그 사라짐
- 클릭된 페이지에 해당하는 게시글들 출력
5페이지(화면상에 출력된 페이지번호 중 마지막) 에서 다음버튼 클릭 시 화면
- 5페이지(화면상에 출력된 페이지번호 중 마지막)을 클릭 후 다음버튼 클릭 시, 페이지번호 다음으로 넘어감(6~10페이지 출력)
- 6페이지(화면상에 출력된 페이지번호 중 마지막)을 클릭 후 이전버튼 클릭 시, 페이지번호 이전으로 넘어감(1~5페이지 출력)
>>버튼 클릭 시 화면
- >>버튼 클릭 시 11페이지(마지막 페이지)로 이동
- 11페이지(마지막 페이지) 에서는 다음버튼 클릭 불가
- 전체 게시글 수가 101개 이므로, 전체 페이지 갯수는 11개(마지막 11페이지는 출력되는 게시글 1개)
"9" 검색 시 화면
- 전체 게시글 수 19개 paging 처리 : ( ex) 123 )
- 전체 게시글 수 19개에 대한 pagination 처리 : ( ex) 전체페이지 2개 )
"9" 검색 후 2페이지 화면
4. PagingVO.java 신규 추가 및 페이징처리 관련 코드 추가
- paging 관련 변수를 담기 위한 클래스 추가. 기능상 DTO로 정의해야 하지만 추후 리팩토링 하기로하고 우선 넘어감
( VO : DTO와 동일한 개념이나 차이점은 Read–Only 속성 객체 )
- 단축키( Alt+Shift+S ) 를 사용하여 getter/setter, toString 을 추가하면 편함
package com.springbook.biz.paging;
public class PagingVO {
//paging
private int totalCount; // 전체 게시글 수 (get)
private int currentPage; // 현재 페이지 (get)
private int totalPage; // 전체 페이지 수 (get)
//pagination
private int displayPage = 5; // 한 페이지에 몇 개의 페이지 (선택 set)
private int displayRow = 10; // 한 페이지에 몇 개의 로우 (선택 set)
private int beginPage; // 페이징 시작 페이지 수
private int endPage; // 페이징 종료 페이지 수
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getDisplayPage() {
return displayPage;
}
public void setDisplayPage(int displayPage) {
this.displayPage = displayPage;
}
public int getDisplayRow() {
return displayRow;
}
public void setDisplayRow(int displayRow) {
this.displayRow = displayRow;
}
public int getBeginPage() {
return beginPage;
}
public void setBeginPage(int beginPage) {
this.beginPage = beginPage;
}
public int getEndPage() {
return endPage;
}
public void setEndPage(int endPage) {
this.endPage = endPage;
}
@Override
public String toString() {
return "PagingVO [totalCount=" + totalCount + ", currentPage=" + currentPage + ", totalPage=" + totalPage
+ ", displayPage=" + displayPage + ", displayRow=" + displayRow + ", beginPage=" + beginPage
+ ", endPage=" + endPage + "]";
}
}
5. BoardDAO.java 에 페이징처리 관련 코드 추가
- SQL 쿼리 추가
( BOARD_LIST2_WITH_PAGING, BOARD_LIST_T2_WITH_PAGING, BOARD_LIST_C2_WITH_PAGING, BOARD_LIST2_CNT, BOARD_LIST_T2_CNT, BOARD_LIST_C2_CNT )
- 메서드 추가
( getBoardListWithPaging, getBoardCnt )
package com.springbook.biz.board.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.springbook.biz.board.BoardVO;
import com.springbook.biz.common.JDBCUtil;
import com.springbook.biz.paging.Paging;
import com.springbook.biz.paging.PagingVO;
import hello.printSimpleName;
@Repository("boardDAO")
public class BoardDAO {
private Connection conn = null;
private PreparedStatement stmt = null;
private ResultSet rs = null;
private final String BOARD_INSERT = "insert into board(seq, title, writer, content, regdate) values((select nvl(max(seq),0)+1 from board),?,?,?,sysdate)";
private final String BOARD_UPDATE = "update board set title=?, content=? where seq=?";
private final String BOARD_DELETE = "delete board where seq=?";
private final String BOARD_GET = "select * from board where seq=?";
// private final String BOARD_LIST = "select * from board order by seq desc";
private final String BOARD_LIST = "select * from board order by seq desc";
private final String BOARD_LIST_T = "select * from board where title like '%'||?||'%' order by seq desc";
private final String BOARD_LIST_C = "select * from board where content like '%'||?||'%' order by seq desc";
private final String BOARD_UPDAT_CNT = "update board set cnt=cnt+1 where seq=?";
private final String BOARD_LIST2_WITH_PAGING = "SELECT * from ( SELECT ROWNUM AS row_num, board.* FROM ( SELECT * FROM board ORDER BY seq DESC ) board ) WHERE row_num >= ? AND row_num <= ?";
private final String BOARD_LIST_T2_WITH_PAGING = "SELECT * from ( SELECT ROWNUM AS row_num, board.* FROM ( SELECT * FROM board WHERE TITLE LIKE '%'||?||'%' ORDER BY seq DESC ) board ) WHERE row_num >= ? AND row_num <= ?";
private final String BOARD_LIST_C2_WITH_PAGING = "SELECT * from ( SELECT ROWNUM AS row_num, board.* FROM ( SELECT * FROM board WHERE CONTENT LIKE '%'||?||'%' ORDER BY seq DESC ) board ) WHERE row_num >= ? AND row_num <= ?";
private final String BOARD_LIST2_CNT = "SELECT COUNT(*) FROM ( SELECT * FROM board ORDER BY seq DESC ) board";
private final String BOARD_LIST_T2_CNT = "SELECT COUNT(*) from ( SELECT ROWNUM AS row_num, board.* FROM ( SELECT * FROM board ORDER BY seq DESC ) board ) WHERE TITLE LIKE '%'||?||'%'";
private final String BOARD_LIST_C2_CNT = "SELECT COUNT(*) from ( SELECT ROWNUM AS row_num, board.* FROM ( SELECT * FROM board ORDER BY seq DESC ) board ) WHERE CONTENT LIKE '%'||?||'%'";
printSimpleName p = new printSimpleName();
public void insertBoard(BoardVO vo) {
System.out.println("===> JDBC로 insertBoard() 기능 처리");
try {
conn = JDBCUtil.getConnection();
stmt = conn.prepareStatement(BOARD_INSERT);
stmt.setString(1, vo.getTitle());
stmt.setString(2, vo.getWriter());
stmt.setString(3, vo.getContent());
stmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.close(stmt, conn);
}
}
public void updateBoard(BoardVO vo) {
System.out.println("===> JDBC로 updateBoard() 기능 처리");
try {
conn = JDBCUtil.getConnection();
stmt = conn.prepareStatement(BOARD_UPDATE);
stmt.setString(1, vo.getTitle());
stmt.setString(2, vo.getContent());
stmt.setInt(3, vo.getSeq());
stmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.close(stmt, conn);
}
}
public void deleteBoard(BoardVO vo) {
System.out.println("===> JDBC로 deleteBoard() 기능 처리");
try {
conn = JDBCUtil.getConnection();
stmt = conn.prepareStatement(BOARD_DELETE);
stmt.setInt(1, vo.getSeq());
stmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.close(stmt, conn);
}
}
public BoardVO getBoard(BoardVO vo) {
System.out.println("===> JDBC로 getBoard() 기능 처리");
BoardVO board = null;
try {
conn = JDBCUtil.getConnection();
stmt = conn.prepareStatement(BOARD_GET);
stmt.setInt(1, vo.getSeq());
rs = stmt.executeQuery();
if(rs.next()) {
board = new BoardVO();
board.setSeq(rs.getInt("SEQ"));
board.setTitle(rs.getString("TITLE"));
board.setWriter(rs.getString("WRITER"));
board.setContent(rs.getString("CONTENT"));
board.setRegDate(rs.getDate("REGDATE"));
board.setCnt(rs.getInt("CNT"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.close(stmt, conn);
}
return board;
}
public List<BoardVO> getBoardList(BoardVO vo) {
System.out.println("===> JDBC로 getBoardList() 기능 처리");
List<BoardVO> boardList = new ArrayList<BoardVO>();
String flagBoardListFromSearch = "N";
try {
conn = JDBCUtil.getConnection();
if (vo.getSearchCondition() != null && vo.getSearchKeyword() != null) {
flagBoardListFromSearch = "Y";
}
if("Y".equals(flagBoardListFromSearch) && vo.getSearchCondition().equals("TITLE")) {
stmt = conn.prepareStatement(BOARD_LIST_T);
stmt.setString(1, vo.getSearchKeyword());
} else if("Y".equals(flagBoardListFromSearch) && vo.getSearchCondition().equals("CONTENT") ) {
stmt = conn.prepareStatement(BOARD_LIST_C);
stmt.setString(1, vo.getSearchKeyword());
} else {
stmt = conn.prepareStatement(BOARD_LIST);
}
rs = stmt.executeQuery();
while(rs.next()) {
BoardVO board = new BoardVO();
board.setSeq(rs.getInt("SEQ"));
board.setTitle(rs.getString("TITLE"));
board.setWriter(rs.getString("WRITER"));
board.setContent(rs.getString("CONTENT"));
board.setRegDate(rs.getDate("REGDATE"));
board.setCnt(rs.getInt("CNT"));
boardList.add(board);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.close(stmt, conn);
}
return boardList;
}
public void updateBoardCnt(BoardVO vo) {
System.out.println("===> JDBC로 updateBoardCnt() 기능 처리");
try {
conn = JDBCUtil.getConnection();
stmt = conn.prepareStatement(BOARD_UPDAT_CNT);
stmt.setInt(1, vo.getSeq());
stmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.close(stmt, conn);
}
}
public List<BoardVO> getBoardListWithPaging(int currentPage, BoardVO vo){
System.out.println("===> JDBC로 getBoardListWithPaging() 기능 처리");
PagingVO paging = new PagingVO();
List<BoardVO> boardList = new ArrayList<BoardVO>();
String flagBoardListFromSearch = "N";
int startNum = (currentPage - 1) * paging.getDisplayRow() + 1;
int endNum = currentPage * paging.getDisplayRow();
//System.out.println("===> startNum = " + startNum );
//System.out.println("===> endNum = " + endNum );
try{
conn = JDBCUtil.getConnection();
if (vo.getSearchCondition() != null && vo.getSearchKeyword() != null) {
flagBoardListFromSearch = "Y";
}
//페이징
if("Y".equals(flagBoardListFromSearch) && vo.getSearchCondition().equals("TITLE")) {
stmt = conn.prepareStatement(BOARD_LIST_T2_WITH_PAGING);
stmt.setString(1, vo.getSearchKeyword());
stmt.setInt(2, startNum);
stmt.setInt(3, endNum);
} else if("Y".equals(flagBoardListFromSearch) && vo.getSearchCondition().equals("CONTENT") ) {
stmt = conn.prepareStatement(BOARD_LIST_C2_WITH_PAGING);
stmt.setString(1, vo.getSearchKeyword());
stmt.setInt(2, startNum);
stmt.setInt(3, endNum);
} else {
stmt = conn.prepareStatement(BOARD_LIST2_WITH_PAGING);
stmt.setInt(1, startNum);
stmt.setInt(2, endNum);
}
rs = stmt.executeQuery();
while(rs.next()){
BoardVO board = new BoardVO();
board.setSeq(rs.getInt("SEQ"));
board.setTitle(rs.getString("TITLE"));
board.setWriter(rs.getString("WRITER"));
board.setContent(rs.getString("CONTENT"));
board.setRegDate(rs.getDate("REGDATE"));
board.setCnt(rs.getInt("CNT"));
boardList.add(board);
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtil.close(stmt, conn);
}
return boardList;
}
// 게시글 수 조회
public int getBoardCnt(BoardVO vo) {
System.out.println("===> JDBC로 getBoardCnt() 기능 처리");
String flagBoardListFromSearch = "N";
int boardListcnt = 0;
try{
conn = JDBCUtil.getConnection();
if (vo.getSearchCondition() != null && vo.getSearchKeyword() != null) {
flagBoardListFromSearch = "Y";
}
//페이징
if("Y".equals(flagBoardListFromSearch) && vo.getSearchCondition().equals("TITLE")) {
stmt = conn.prepareStatement(BOARD_LIST_T2_CNT);
stmt.setString(1, vo.getSearchKeyword());
} else if("Y".equals(flagBoardListFromSearch) && vo.getSearchCondition().equals("CONTENT") ) {
stmt = conn.prepareStatement(BOARD_LIST_C2_CNT);
stmt.setString(1, vo.getSearchKeyword());
} else {
stmt = conn.prepareStatement(BOARD_LIST2_CNT);
}
rs = stmt.executeQuery();
if(rs.next()){
boardListcnt = rs.getInt(1);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.close(stmt, conn);
}
return boardListcnt;
}
}
6. getBoardList2.jsp 신규 추가 및 페이징처리 관련 코드 추가
- 기존의 BoardList.jsp를 카피 후 소스 수정 및 추가작업 진행함
- 전체 게시글 수 조회 추가: int boardListcnt = boardDAO.getBoardCnt(vo);
- 페이징처리 부분 추가 : == paging ==
- 페이징관련 UI 부분 추가 : == pagination ==
- 게시글을 조회해 오는 부분 수정 : boardList = boardDAO.getBoardListWithPaging(currentPage, vo);
- 마크업 부분에 게시글 출력단 수정 : for (BoardVO board : boardList)
- 마크업 부분에 페이징처리 추가 : 페이징처리
<%@ page import="java.io.Console"%>
<%@ page import="java.util.List"%>
<%@ page import="com.springbook.biz.board.impl.BoardDAO"%>
<%@ page import="com.springbook.biz.board.BoardVO"%>
<%@ page import="com.springbook.biz.user.UserVO"%>
<%@ page import="com.springbook.biz.paging.PagingVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%
// 한글깨짐방지
request.setCharacterEncoding("UTF-8");
// 사용자 이름 설정
String id = (String)session.getAttribute("id");
// 임의의 상수 설정
String action = "/biz/getBoardList2.jsp";
String searchCondition = request.getParameter("searchCondition");
String searchKeyword = request.getParameter("searchKeyword");
String search = "&searchCondition="+searchCondition+"&searchKeyword="+searchKeyword;
// 쿠키
//session.setAttribute("cookie", request.getCookies());
//========= get board list with paging ===========
BoardVO vo = new BoardVO();
BoardDAO boardDAO = new BoardDAO();
// 게시글 검색 설정
vo.setSearchCondition(searchCondition);
vo.setSearchKeyword(searchKeyword);
// 페이징 처리 된 데이터 조회
int boardListcnt = boardDAO.getBoardCnt(vo);
//========= paging ===========
PagingVO pagingVO = new PagingVO();
// 현재 페이지 체크 및 설정
// 첫 페이지면 1이 설정, 아니라면 해당 페이지 넘버가 설정됨
int currentPage = 1;
//System.out.println("request.param page = " + request.getParameter("page") );
if (request.getParameter("page") != null) {
currentPage = Integer.parseInt(request.getParameter("page"));
}
pagingVO.setCurrentPage(currentPage);
// 전체 페이지 설정
// sql rownum 설정하기 이전의 count 필요
pagingVO.setTotalCount( boardListcnt );
//========= pagination ===========
pagingVO.setEndPage( ((int) Math.ceil(pagingVO.getCurrentPage() / (double) pagingVO.getDisplayPage())) * pagingVO.getDisplayPage() ); //Math.ceil : 소수점 이하를 올림한다
pagingVO.setBeginPage( pagingVO.getEndPage() - (pagingVO.getDisplayPage() - 1) );
pagingVO.setTotalPage( (int) Math.ceil(pagingVO.getTotalCount() / (double) pagingVO.getDisplayRow()) );
if (pagingVO.getEndPage() > pagingVO.getTotalPage()) {
pagingVO.setEndPage(pagingVO.getTotalPage());
}
//========= get board list with paging ===========
// 페이징 처리 된 데이터 조회
List<BoardVO> boardList;
boardList = boardDAO.getBoardListWithPaging(currentPage, vo);
System.out.println("currentPage = " + currentPage );
System.out.println("999 pagingVO.toString() = " + pagingVO.toString() );
System.out.println("000 boardList.toString() = " + boardList.toString() );
%>
<!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>글 목록</title>
<style type="text/css">
body {
text-align: center;
}
#paging {
font-size: 22pt;
}
</style>
</head>
<body>
<center>
<h1>글 목록</h1>
<h3><%=id%>님 환영합니다....<a href="logout_proc.jsp">log out</a>
</h3>
<!-- 검색 시작 -->
<!-- <form action="getBoardList2.do" method="get"> -->
<form action="getBoardList2.jsp" method="get">
<table border="1" cellpadding="0" cellspacing="0" width="700">
<tr>
<td align="right"><select id="searchCondition"
name="searchCondition">
<option value="TITLE">제목</option>
<option value="CONTENT">내용</option>
</select> <input id="searchKeyword" name="searchKeyword" type="text">
<input type="submit" value="검색 "></td>
</tr>
</table>
</form>
<!-- 검색 종료 -->
<!-- 전체 게시글 수 -->
<div>
전체 게시글 수 : <%=pagingVO.getTotalCount() %>
</div>
<table border="1" cellpadding="0" cellspacing="0" width="700">
<tr>
<th bgcolor="orange" width="100">번호</th>
<th bgcolor="orange" width="200">제목</th>
<th bgcolor="orange" width="150">작성자</th>
<th bgcolor="orange" width="150">등록일</th>
<th bgcolor="orange" width="100">조회수</th>
</tr>
<%
for (BoardVO board : boardList) {
%>
<tr>
<td><%=board.getSeq()%></td>
<td align="left"><a href="getBoard.jsp?seq=<%=board.getSeq()%>">
<%=board.getTitle()%>
</a></td>
<td><%=board.getWriter()%></td>
<td><%=board.getRegDate()%></td>
<td><%=board.getCnt()%></td>
</tr>
<%
}
%>
</table>
<br>
<!-- 여기부터 페이징처리 -->
<div id="pagination">
<!-- 변수 매핑 -->
<c:set var="page" value="<%=pagingVO.getCurrentPage() %>" />
<c:set var="beginPage" value="<%=pagingVO.getBeginPage() %>" />
<c:set var="endPage" value="<%=pagingVO.getEndPage() %>" />
<c:set var="totalPage" value="<%=pagingVO.getTotalPage() %>" />
<c:set var="action" value="<%=action %>" />
<c:set var="displayPage" value="<%=pagingVO.getDisplayPage() %>" />
<c:set var="searchKeyword" value="<%=searchKeyword %>" />
<c:set var="search" value="<%=search %>" />
<!-- 처음으로 -->
<c:if test="${ searchKeyword == null }">
<a href="${ action }?page=1">
<span>«</span>
</a>
</c:if>
<c:if test="${ searchKeyword != null }">
<a href="${ action }?page=1${ search }">
<span>«</span>
</a>
</c:if>
<!-- 이전버튼 -->
<c:if test="${ page <= 1 }">
<span>이전</span>
</c:if>
<c:if test="${ page > 1 }">
<c:if test="${ searchKeyword == null }">
<a href="${ action }?page=${ page - 1 }">이전</a>
</c:if>
<c:if test="${ searchKeyword != null }">
<a href="${ action }?page=${ page - 1 }${ search }">이전</a>
</c:if>
</c:if>
<!-- 넘버링버튼 for문 -->
<c:forEach var="item" varStatus="status" begin="${ beginPage }" end="${ endPage }" step="1">
<c:if test="${ page == item }">
${ item }
</c:if>
<c:if test="${ page != item }">
<c:if test="${ searchKeyword == null }">
<a href="${ action }?page=${ item }">${ item }</a>
</c:if>
<c:if test="${ searchKeyword != null }">
<a href="${ action }?page=${ item }${ search }">${ item }</a>
</c:if>
</c:if>
</c:forEach>
<!-- 다음버튼 -->
<c:if test="${ page >= totalPage }">
<span>다음</span>
</c:if>
<c:if test="${ page < totalPage }">
<c:if test="${ searchKeyword == null }">
<a href="${ action }?page=${ page + 1 }">다음</a>
</c:if>
<c:if test="${ searchKeyword != null }">
<a href="${ action }?page=${ page + 1 }${ search }">다음</a>
</c:if>
</c:if>
<!-- 끝으로 -->
<c:if test="${ searchKeyword == null }">
<a href="${ action }?page=${ totalPage }">
<span>»</span>
</a>
</c:if>
<c:if test="${ searchKeyword != null }">
<a href="${ action }?page=${ totalPage }${ search }">
<span>»</span>
</a>
</c:if>
</div>
<br> <a href="insertBoard.jsp">새 글 등록</a>
</center>
</body>
</html>
추가
JDBCUtil.java
package com.springbook.biz.common;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class JDBCUtil {
public static Connection getConnection() {
try {
// Class.forName("org.h2.Driver");
Class.forName("oracle.jdbc.driver.OracleDriver");
// return DriverManager.getConnection("jdbc:h2:/home/usernameHodoo/workspace/BoardWeb/src/main/resources/boardweb", "sa", "");
return DriverManager.getConnection("jdbc:oracle:thin:@localhost:1522:user", "scott", "tiger");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void close(PreparedStatement stmt, Connection conn) {
if(stmt != null) {
try {
if(!stmt.isClosed()) {
stmt.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
stmt = null;
}
}
if(conn != null) {
try {
if(!conn.isClosed()) {
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
conn = null;
}
}
}
public static void close(ResultSet rs, PreparedStatement stmt, Connection conn) {
if(rs != null) {
try {
if(!rs.isClosed()) {
rs.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
rs = null;
}
}
close(stmt, conn);
}
}
'(2019) 사이드 프로젝트 > BoardWeb(게시판-MVC1,MVC2,스프링MVC)' 카테고리의 다른 글
8. MVC Model2 아키텍처로 게시판 개발 (0) | 2019.07.12 |
---|---|
7-8. 글 등록, 수정, 삭제 구현 : insertBoard.jsp, insertBoard_proc.jsp, updateBoard_proc.jsp, deleteBoard_proc.jsp (0) | 2019.07.12 |
7-7. 실습 중간점검 , 프로젝트 별첨 (0) | 2019.07.05 |
7-5. 실습 중간점검 , 프로젝트 별첨 (0) | 2019.06.28 |
7-4. 글 조회수 카운트, session을 이용한 조회수 중복 방지 처리(jsp) : BoardDAO.java, getBoard.jsp (0) | 2019.06.28 |
7-3. 글 상세 조회 : getBoard.jsp (0) | 2019.06.24 |
7-2. 글 목록 조회, 글 검색 기능 : getBoardList.jsp, BoardDAO.java (0) | 2019.06.24 |
7-1. 로그인, 로그아웃, 로그인 검증 및 실패 후처리 : login.jsp, login_proc.jsp, logout_proc.jsp (3) | 2019.06.24 |