-
<페이징 처리>
페이지를 나누는걸 페이징 처리라고한다.
1 게시글
-- startRow(임의로 가로줄 변수지정) 첫페이지 1,11,12...(startPage)
2 게시글
3 게시글
4 게시글
5 게시글
-- endRow(임의로 변수지정) 마지막 10,20,30....(endPage)
< 1 2 3 4 5 6 7 8 9 10 > -->limit : 한 페이지에 표시될 페이징 수 (임의로 변수지정)
-- 어떻게 지정하느냐에 따라 다 다르다.
~34끝난 마지막 페이지(maxPage)
선택된 페이지 = currentPage (직관적으로 현재페이지라고 하겠음)
주소창 2번째 페이지로 넘어가면 page=2가 뜬다.
주소창 3번째 페이지로 넘어가면 page=3가 뜬다.(page는 변수명이다.)
원래 c -> s-> d -> DB->다시돌아감
페이징처리는 서비스를 2번 왔다갔다해야된다.
페이징 처리가 들어가면 Service를 두 번 요청하기 때문에 레퍼런스 변수로 생성
1) 게시글 전체 개수 가져올 때 : 페이징 처리 계산에 사용
2) 게시글 가져올 때
게시판
1) 일반 : 제목 내용 글 날짜-->사진과 공통적임->그래서 보드테이블에 넣음
2) 사진 : 제목 내용 글 날짜 파일-> 파일만 attachment테이블에 넣음
STATUS 상태를 구분이 안되서 사진게시판=2과 일반게시판=1이 구분되지 않음.
-->숫자 넣어서 구분한다(사진 게시판인지, 일반게시판인지)
<doGet 작성>
페이징 처리가 들어가면 Service를 두 번 요청하기 때문에 레퍼런스 변수로 생성
- 게시글 전체 개수 가져올 때 : 페이징 처리 계산에 사용
- 게시글 가져올 때BoardService service = new BoardService(); int listCount; // 게시물 총 개수 int currentPage; // 현재 페이지 표시 int pageLimit; // 한 페이지에서 표시될 페이징 수 int boardLimit; // 한 페이지에 보일 게시글 최대 개수 int maxPage; // 전체 페이지 중 가장 마지막 페이지 int startPage; // 페이징 된 페이지 중 시작 페이지 int endPage; // 페이징 된 페이지 중 마지막 페이지 listCount = service.getListCount(); //총 게시물 수를 가져와서 카운트하는 것 // System.out.println(listCount);//보드에 데이터를 안넣었기 때문에 0이라고 뜬다 currentPage = 1; if(request.getParameter("currentPage") != null) {//넘겨받은 페이지가 currentPage에 페이징 처리된것이 넘어오면 currentPage = Integer.parseInt(request.getParameter("currentPage"));//데이터가 들어왔다는거고 데이터를 인티저파싱을 해서 현재페이지가 변경된다. currentPage = ?-->들어간 페이지숫자 } //97개 게시물 ->최대 10개 97 나누기 10(boardLimit) = 9..7 나눈 값 9, 나머지 7 //예시 123개 게시물 -> 최대 13 123 나누기 10 = 12..3 //260 -> 26 260 나누기 10 = 26 //총 게시물 나누기 boardLimit pageLimit = 10; boardLimit = 10; //다른방법,int/int = 9 , +1하면 10개 게시글 나눈 값이 9여서 9까지밖에 안나오는데 10까지 만들어서 7도 담아줘야되기때문에. //가장최소감이 0.1이니까 0.9를 더해줘서 하나를 더 추가할 수 있게 //다른방법,(int)((double)listCount/boardLimit + 0.9); //ceil = 올려줌 올림 값이 double로 나온다->(int)추가로 강제형변환을 또 해준다. maxPage = (int)Math.ceil((double)listCount/boardLimit); //1..10/11..20/21..30->1,11,21 startPage (n >= 0) 10n+1 -> pageLimit //cp : 4 ->1 / cp: 9 -> 1 /10나누기 0은 1이 나오기 때문에 cp-1을 해서 진행한다.(1-1=0 0도 1로 나오기때문에) (currentPage-1)/ pageLimit startPage = (currentPage - 1)/pageLimit * pageLimit + 1; endPage = startPage + pageLimit -1; if(maxPage < endPage) {//맥스가 34일때 엔드가 40일때 존재할 것이다 endPage = maxPage;//같게 만들어준다. }
<오라클DB>
쿼리문 별칭으로 가져오기
<데이터 생성>begin for i in 1..97 loop insert into board values(seq_bid.nextval, 1, 10, i, i+100, 'admin', default, sysdate, sysdate, default); end loop; end; / commit;--위에 생성 후 커밋까지 완료해준다
<페이징 처리된 게시물 가져오기>: 게시물을 가지고 오기 위해 필요한 것 가져오기
SELECT BOARD_ID, BOARD_TYPE, CATE_ID, CATE_NAME, BOARD_TITLE, BOARD_CONTENT, BOARD_WRITER, NICKNAME, BOARD_COUNT, CREATE_DATE, B.MODIFY_DATE, B.STATUS FROM BOARD B JOIN MEMBER ON(USER_ID = BOARD_WRITER) JOIN CATEGORY USING(CATE_ID) WHERE B.STATUS = 'Y' AND BOARD_TYPE = 1 ORDER BY BOARD_ID DESC;
<2. 최근 10개 게시물만 가져오기>SELECT * FROM(SELECT BOARD_ID, BOARD_TYPE, CATE_ID, CATE_NAME, BOARD_TITLE, BOARD_CONTENT, BOARD_WRITER, NICKNAME, BOARD_COUNT, CREATE_DATE, B.MODIFY_DATE, B.STATUS FROM BOARD B JOIN MEMBER ON(USER_ID = BOARD_WRITER) JOIN CATEGORY USING(CATE_ID) WHERE B.STATUS = 'Y' AND BOARD_TYPE = 1 ORDER BY BOARD_ID DESC) --WHERE ROWNUM <= 10; WHERE ROWNUM <= 20 AND ROWNUM >= 11;
<3. M이상 N이하에 있는 게시물 가져오기>
SELECT * FROM (SELECT ROWNUM RNUM, DESCBOARD.* FROM(SELECT BOARD_ID, BOARD_TYPE, CATE_ID, CATE_NAME, BOARD_TITLE, BOARD_CONTENT, BOARD_WRITER, NICKNAME, BOARD_COUNT, CREATE_DATE, B.MODIFY_DATE, B.STATUS FROM BOARD B JOIN MEMBER ON(USER_ID = BOARD_WRITER) JOIN CATEGORY USING(CATE_ID) WHERE B.STATUS = 'Y' AND BOARD_TYPE = 1 ORDER BY BOARD_ID DESC) DESCBOARD) WHERE RNUM <= 20 AND RNUM >= 11;
SELECT보다 WHERE가 먼저 읽혀서 또 인라인으로 넣어줘야한다.
<+VIEW 활용> (쿼리가 길어서)1) VIEW생성을 위한 권한부여
: SYSTEM에서 권한부여 진행
GRANT CREATE VIEW TO JSP_Servlet;
2) VIEW생성하기CREATE OR REPLACE VIEW blist AS SELECT ROWNUM RNUM, DESCBOARD.* FROM(SELECT BOARD_ID, BOARD_TYPE, CATE_ID, CATE_NAME, BOARD_TITLE, BOARD_CONTENT, BOARD_WRITER, NICKNAME, BOARD_COUNT, CREATE_DATE, B.MODIFY_DATE, B.STATUS FROM BOARD B JOIN MEMBER ON(USER_ID = BOARD_WRITER) JOIN CATEGORY USING(CATE_ID) WHERE B.STATUS = 'Y' AND BOARD_TYPE = 1 ORDER BY BOARD_ID DESC) DESCBOARD;
3) 생성한 뷰를 이용해서 쿼리문 작성SELECT * FROM BLIST WHERE RNUM >= 11 AND RNUM <= 20;
-->쿼리문을 단축하기 위해서 뷰를 생성해서 가져온다.(작성한 쿼리문을 프로펄티에 넣어준다.)
'JSP' 카테고리의 다른 글
서블릿_필터_래퍼_암호화 (0) 2022.05.11 JSP_이미지_게시판 (0) 2022.05.09 공지사항_수정_흐름 (0) 2022.05.05 JSP_공지사항_2 (0) 2022.05.04 JSP_개념_공지사항 (0) 2022.05.03