@@@ 페이징 처리@@@
#BoardController
package com.kh.sjproject.board.controller;
import java.io.IOException;
import java.util.List;
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 com.kh.sjproject.board.model.service.BoardService;
import com.kh.sjproject.board.model.vo.Board;
import com.kh.sjproject.board.model.vo.PageInfo;
import com.kh.sjproject.common.ExceptionForward;
// frontcontroller 디자인패턴
@WebServlet("/board/*")
public class BoardController extends HttpServlet {
private static final long serialVersionUID = 1L;
public BoardController() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String uri = request.getRequestURI();
String contextPath = request.getContextPath();
String command = uri.substring((contextPath+"/board").length());
String msg = null;
String path = null;
RequestDispatcher view = null;
BoardService boardService = new BoardService();
// 게시글 목록 조회용 Controller
if(command.equals("/list")) {
try {
// 페이징 처리 (pagination)
// 눈에 보이는 게시판에 일정 개수의 게시글만 노출되고
// 나머지는 페이지로 구분하여 숫자 형태로 보여주게하는 방법
// DB
// 현재 게시글 전체 수
int listCount = boardService.getListCount();
// 사용자지정
// 한 페이지에 보여질 게시글의수
int limit = 5;
// 보여질 페이징바의 페이지 개수
int pagingBarSize = 10;
// 계산
// 현재 페이지 번호를 표시할 변수
int currentPage = 0;
// 전체 페이지의 수 (== 마지막 페이지)
int maxPage = 0;
// 페이징바 시작 페이지 번호
int startPage = 0;
// 페이징바 끝 페이지 번호
int endPage = 0;
// currentPage - 현재 페이지 번호를 표시할 변수
// 처음 게시판 목록으로 화면이 전환이되면 1페이지가 보여야 함
if(request.getParameter("currentPage") == null) {
currentPage = 1;
} else {
// 전달 받은 값이 있을 경우 해당 번호를 저장
currentPage = Integer.parseInt(request.getParameter("currentPage"));
}
// maxPage - 총 페이지 수(== 마지막 페이지)
// limit == 5일 경우
// 게시글의 개수가 50개일 경우 필요 페이지의 수 : 10페이지
// 게시글의 개수가 51개일 경우 필요 페이지의 수 : 11페이지
maxPage = (int)Math.ceil( ( (double)listCount / limit) );
// startPage - 페이징바의 시작 페이지 번호
// 페이징바에 수가 10개씩 보여질 경우
// 시작번호는 1, 11, 21, 31, ....
startPage = (currentPage - 1) / pagingBarSize * pagingBarSize + 1;
// endPage - 페이징바 끝 페이지 번호
endPage = startPage + pagingBarSize - 1;
if(maxPage <= endPage) {
endPage = maxPage;
}
PageInfo pInf = new PageInfo(listCount, limit, pagingBarSize, currentPage, maxPage, startPage, endPage);
System.out.println(pInf);
List<Board> bList = boardService.selectList(currentPage, limit);
path = "/WEB-INF/views/board/boardList.jsp";
request.setAttribute("bList", bList);
request.setAttribute("pInf", pInf);
view = request.getRequestDispatcher(path);
view.forward(request, response);
} catch (Exception e) {
ExceptionForward.errorPage(request, response, "게시판 목록 조회", e);
}
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
# BoardService
package com.kh.sjproject.board.model.service;
import static com.kh.sjproject.common.JDBCTemplate.*;
import java.sql.Connection;
import java.util.List;
import com.kh.sjproject.board.model.dao.BoardDao;
import com.kh.sjproject.board.model.vo.Board;
public class BoardService {
/** 전체 게시글 수 조회 Service
* @return listCount
* @throws Exception
*/
public int getListCount() throws Exception{
Connection conn = getConnection();
int listCount = new BoardDao().getListCount(conn);
close(conn);
return listCount;
}
/** 게시판 목록 조회용 Service
* @param currentPage
* @param limit
* @return bList
* @throws Exception
*/
public List<Board> selectList(int currentPage, int limit) throws Exception{
Connection conn = getConnection();
List<Board> bList = new BoardDao().selectList(conn, currentPage, limit);
close(conn);
return bList;
}
}
#BoardDao
package com.kh.sjproject.board.model.dao;
import static com.kh.sjproject.common.JDBCTemplate.*;
import java.io.FileReader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import com.kh.sjproject.board.model.vo.Board;
import com.kh.sjproject.notice.model.dao.NoticeDao;
public class BoardDao {
private Properties prop = null;
public BoardDao() throws Exception{
String fileName
// 컴파일된 버전
= BoardDao.class // 자원을 얻어와라()
.getResource("/com/kh/sjproject/sql/board/board-query.properties")
.getPath();//풀경로를 나타내라
prop = new Properties();
prop.load(new FileReader(fileName));
}
/** 전체 게시글 수 조회용 Dao
* @param conn
* @return listCount
* @throws Exception
*/
public int getListCount(Connection conn) throws Exception{
Statement stmt = null;
ResultSet rset = null;
int listCount = 0;
String query = prop.getProperty("getListCount");
try {
stmt = conn.createStatement();
rset = stmt.executeQuery(query);
if(rset.next()) {
listCount = rset.getInt(1);
}
} finally {
close(rset);
close(stmt);
}
return listCount;
}
/** 게시판 목록 조회용 Dao
* @param conn
* @param currentPage
* @param limit
* @return bList
* @throws Exception
*/
public List<Board> selectList(Connection conn, int currentPage, int limit) throws Exception{
PreparedStatement pstmt = null;
ResultSet rset = null;
List<Board> bList = null;
String query = prop.getProperty("selectList");
try {
// 쿼리문 실행 시 between 조건에 사용될 값
int startRow = (currentPage -1) * limit + 1;
int endRow = startRow + limit - 1;
pstmt = conn.prepareStatement(query);
pstmt.setInt(1, 1);
pstmt.setInt(2, startRow);
pstmt.setInt(3, endRow);
rset = pstmt.executeQuery();
bList = new ArrayList<Board>();
Board board = null;
while(rset.next()) {
board = new Board(rset.getInt("BOARD_NO"),
rset.getString("BOARD_TITLE"),
rset.getInt("BOARD_COUNT"),
rset.getDate("BOARD_MODIFY_DT"),
rset.getString("MEMBER_ID"),
rset.getString("CATEGORY_NM")
);
bList.add(board);
}
} finally {
close(rset);
close(pstmt);
}
return bList;
}
}
#SQL
-- 조회가 가능한 게시물 조회
SELECT BOARD_NO, BOARD_TITLE,
BOARD_CONTENT, BOARD_COUNT,
BOARD_MODIFY_DT,
BOARD_TYPE,
MEMBER_ID, CATEGORY_NM
FROM BOARD
JOIN MEMBER ON(BOARD_WRITER = MEMBER_NO)
JOIN CATEGORY ON(BOARD_CATEGORY =
CATEGORY_CD)
WHERE BOARD_STATUS='Y';
-- VIEW 생성
CREATE OR REPLACE VIEW V_BOARD AS
SELECT BOARD_NO, BOARD_TITLE,
BOARD_CONTENT, BOARD_COUNT,
BOARD_MODIFY_DT,
BOARD_TYPE,
MEMBER_ID, CATEGORY_NM
FROM BOARD
JOIN MEMBER ON(BOARD_WRITER = MEMBER_NO)
JOIN CATEGORY ON(BOARD_CATEGORY =
CATEGORY_CD)
WHERE BOARD_STATUS='Y'
ORDER BY BOARD_NO DESC;
-- ORA-01031: insufficient privileges
--> VIEW 생성 권한이 없을 경우 나타나는 에러
-- 관리자 계정으로 접속하여 VIEW 생성 권한 부여
GRANT CREATE VIEW TO server;
SELECT * FROM V_BOARD WHERE BOARD_TYPE=1;
-- BOARD 목록 조회 시
-- LIMIT 만큼의 범위로 잘라서 조회
-- V_BOARD에서 ROWNUM이 1~5 사이 이고
-- 게시판 타입이 1인 행의
-- ROWNUM, 글번호, 글제목, 조회수
-- 수정일, 작성자, 카테고리명 조회
SELECT RNUM, BOARD_NO, BOARD_TITLE,
BOARD_COUNT, BOARD_MODIFY_DT,
MEMBER_ID, CATEGORY_NM
FROM (SELECT ROWNUM RNUM, BOARD_NO,
BOARD_TITLE,
BOARD_COUNT, BOARD_MODIFY_DT,
MEMBER_ID, CATEGORY_NM, BOARD_TYPE
FROM V_BOARD WHERE BOARD_TYPE=1)
WHERE RNUM BETWEEN 6 AND 10;
-------------------------------------------------------
SELECT RNUM, BOARD_NO, BOARD_TITLE,
BOARD_COUNT, BOARD_MODIFY_DT, MEMBER_ID,
CATEGORY_NM FROM (SELECT ROWNUM RNUM,
BOARD_NO, BOARD_TITLE, BOARD_COUNT,
BOARD_MODIFY_DT, MEMBER_ID, CATEGORY_NM,
BOARD_TYPE FROM V_BOARD WHERE
BOARD_TYPE=?) WHERE RNUM BETWEEN ? AND ?
-------------------------------------------------
properties 에 복붙
'study > WebServer' 카테고리의 다른 글
10_ws_(EL, JSTL) (0) | 2020.02.11 |
---|---|
9_ws_(파일업로드) (0) | 2020.01.23 |
7_ws_(암호화) (0) | 2020.01.17 |
6_ws_(session) (0) | 2020.01.16 |
5_ws_(mapge 수정정보창) (0) | 2020.01.15 |