JSP Servlet 페이징 구현하기(2) JSP + Oracle

페이징을 구현하기 위해

먼저 페이징 VO를 만들어 줬다.




위처럼 6개의 필드를 생성해줬다. 위에 VO는

공통 VO이다. 각 페이지마다 페이징이 다르기 때문에

공통으로 뺀 후 아래처럼 다른 VO에서 CmmnVO를

상속받아 사용하게 했다.





이제 게시글 리스트 커맨드를 보자.



(page 값의 출처는 맨 아래에 있다)

화면단에서 넘어온 "page"를 받아 parsePage에 넣은 후

null값이면 1을 넣어줬는데 게시판의 현재 위치한

page에 값이 없다면 1페이지로 이동할 수 있게하기 위함이다.

다음 CmmnVO에서 page를 long으로 선언했기 때문에

String형은 parsePage를 long으로 형변환 시켜줬다.





다음 ArrayList의 PagingList를 만들어 줬다.

BoardDto에는 게시글에 들어갈

글 번호, 글 내용, 글 제목 등이 들어가있다.

그리고 setAttribute를 이용해 DB에서 뽑아온

게시글 값 들을 화면에 뿌려준다.


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
public ArrayList<BoardDto> PagingList(PagingVO pagingVO) throws Exception {
        ArrayList<BoardDto> PagingList = new ArrayList<BoardDto>();
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try{
            connection = dataSource.getConnection();
            String query = "select a.* from ( select a.*, ROWNUM rnum, FLOOR((ROWNUM-1)/10)+1 pageNumber from( select bid, btitle, bcontent, bWriter from board where yn='Y' order by bid desc)a)a where a.pageNumber = ? order by a.rnum";
            preparedStatement = connection.prepareStatement(query);
            preparedStatement.setInt(1, (int)(pagingVO.getPage()));
            resultSet = preparedStatement.executeQuery();
            
            while(resultSet.next()){
                int bId = resultSet.getInt("bId");
                String bTitle = resultSet.getString("bTitle");
                String bContent = resultSet.getString("bContent");
                String bWriter = resultSet.getString("bWriter");
                BoardDto boardDto = new BoardDto(bId, bTitle, bContent, bWriter);
                PagingList.add(boardDto);
            }
        
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            if(resultSet != null){resultSet.close();}
            if(preparedStatement != null){preparedStatement.close();}
            if(connection != null){connection.close();}
        }
        return PagingList;
    }
cs


위는 BoardDao의 PagingList이다.

2line에서 ArrayList형식의 PagingList객체를 만들어줬다.

다음 8line의 쿼리문이다. 이 쿼리문은


http://rwd337.tistory.com/83?category=650717


내 블로그의 SPRING 페이징에서 사용했던

쿼리문을 그대로 가져와 사용했다.

조금 수정된 부분이라면 

원래는 아래와 같이 #을 이용한 파라미터가 들어가있다.

마이바티스에서는 parameterType 을 이용해

PagingVO안의 값들을 쉽게 넣어줄 수 있다.

하지만 지금은 마이바티스를 사용하지 않기때문에



아래와같이 직접 값을 넣어줬다.

원래는 PagingVO 에서 선언한 2값이

들어가야 하지만



2대신 10을넣어 게시글이

10개씩 리스트에 출력되도록 했다.




page값도 마찬가지다.

아래처럼 #파라미터를 통해 마이바티스에서는

page값이 들어가지지만

현재는 마이바티스를 사용하지 않으므로



직접 넣어줬다. 위 소스의 10line을 보면

pagingVO에서 page 값을 get한다음

int 형으로 형변환 시킨 후 preparedStatement를 통해

page값을 쿼리에 넣어준다.


13line에서 부터는 DB에서 꺼내온

게시글 번호, 내용, 제목 등을

BoardDto에 넣은 후 PagingList에 add 후

PagingList를 반환한다.


이 반환된 PagingList를 커맨드에서

request.setAttribute를 통해 화면에 뿌려준것이다.




이제 커맨드에서 총 페이지 갯수를 가져올

준비를 해야한다. Map 형식의 pagingListCnt를 선언 후

boardDao안의 PagingListCnt를 통해

DB에서 totalPage를 뽑아와서 화면단으로 뿌려줘야한다.

다음 Map방식의 resMap객체를 만들어줘서

페이징에 필요한 여러 값들을 resMap안에 put 해준다.




일단 boardDao안의 PagingListCnt를 보자.

#{rows}는 아까 설명했으니 패스하자.



아까와 똑같이 10 값을 줬다.


이제 쿼리에서 뽑아온 totalPage 값을

pagingVO안에 set시켜주자

다음 PagingListCnt가 Map 형식 이므로


pagingListCnt.put("totalPage", totalPage);

put을 사용해 Map 방식으로 값을 넣어주자.


다음 PagingListCnt 를 return하여 반환시켜준다.


위에서 설명했던 것처럼 dao에서

반환받은 totalPage를 resMap에 담자.



이제 위처럼 resMap에 각종 페이징 로직값들을

put해준다음 PagingList와 resMap을

request.setAttribute를 사용해 화면에 뿌려주자


로직 설명은 아래 링크에 들어가서 확인하자

http://rwd337.tistory.com/83?category=650717



이제 페이징을 적용할 jsp 화면단에

아래와같이 값들을 출력 시켜주면된다.

화면단의 페이징 소스는 SPRING 페이징 소스를

그대로 가져왔다.



마지막으로 스크립트단에 아래처럼 fnGoPaging을 만들어주면 끝이다.




댓글

Designed by JB FACTORY