ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JSP_페이징처리
    JSP 2022. 5. 7. 00:15

    <페이징 처리>

    페이지를 나누는걸 페이징 처리라고한다.

    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
Designed by Tistory.