복습
게시판 페이징하기 - sql문 rownum 사용 본문
페이징에 필요한 변수 선언
<%
request.setCharacterEncoding("utf-8");
int pageSize = 5;// 한 화면에 보여지는 수
String pageNum = request.getParameter("pageNum");
if(pageNum==null){
pageNum = "1";
}
int currentPage = Integer.parseInt(pageNum);
int startRow = (currentPage-1)*pageSize+1;
int endRow = currentPage*pageSize;
BoardDAO dao = BoardDAO.getInstance();
ArrayList<Board> arr = dao.boardList(startRow,endRow);
int count = dao.boardCount();
int number = count-(currentPage-1)*pageSize;
%>
pageSize : 한 페이지에 보여질 글의 수
pageNum : 출력될 페이지 번호(현재 페이지)
currentPage : 현재 페이지 번호
startRow : 페이지에 출력될 글의 시작 번호(DB에서 ref와 re_step을 모두 고려하여 순서대로 정렬 했을 때의 번호로 페이지의 가장 위에 출력될 글의 번호이다.)
endRow : startRow의 반대
count : 글의 총 갯수
number => 글의 총 갯수 - (현재페이지번호 -1) * 한 페이지에 보여질 글의 수
: 실제 출력될 글의 번호로 가장 최근에 쓴 글(가장 위에 있는 글)의 번호이다.
boardList()의 select문 구현 - 글의 번호 매기기
public ArrayList<Board> boardList(int startRow, int endRow){
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
Board b = null;
ArrayList<Board> arr = new ArrayList<Board>();
try {
con = getConnection();
String sql = "select * from (select rownum rn, aa.* from (select * from board order by ref desc, re_step asc) aa) where rn between ? and ?";
ps = con.prepareStatement(sql);
ps.setInt(1, startRow);
ps.setInt(2, endRow);
rs = ps.executeQuery();
// 생략
sql문 rownum 키워드 사용
1. ref, re_step으로 정렬
aa.* from (select * from board order by ref desc, re_step asc) aa)
- board 테이블의 데이터를 ref의 내림차순, re_step의 오름차순으로 정렬한다.
2. rownum으로 순번 매기기
(select rownum rn, aa.* from (select * from board order by ref desc, re_step asc) aa)
- 정렬한 데이터를 rownum을 사용하여 순번을 매기는데 열의 이름은 rn으로 한다.
3. 원하는 범위만큼 출력
sql = "select * from (select rownum rn, aa.* from (select * from board order by ref desc, re_step asc) aa) where rn between ? and ?";
- 정렬하여 순번을 매긴 데이터를 원하는 범위만큼 출력한다.
- startRow~endRow 번호의 글을 출력한다.
페이지에 글 출력
<%for(Board b : arr) { %>
<tr>
<td><%=number-- %></td>
<td><a href="boardView.jsp?num=<%=b.getNum()%>"><%=b.getSubject() %></a></td>
<td><%=b.getWriter() %></td>
<td><%=b.getReg_date() %></td>
<td><%=b.getReadcount() %></td>
</tr>
<%} %>
- arr에 받아온 글의 데이터를 출력한다.
- number는 가장 최근에 쓰여진 글의 번호(가장 마지막 번호)이므로 -1씩 하며 글의 번호를 매긴다.
페이지 이동 버튼 구현
<%
if(count>0){
int pageCount = count/pageSize+(count%pageSize==0?0:1); // 총 페이지 개수
int pageBlock = 3; // 한 페이지당 표시될 페이지 번호 수
int startPage = (int)((currentPage-1)/pageBlock)*pageBlock+1;
int endPage = startPage+pageBlock-1; // 계산상의 endPage
if(endPage>pageCount){
// 계산 상 가장 끝 번호의 페이지가 총 페이지 갯수보다 크면 끝 페이지의 번호는 총 페이지 갯수
endPage = pageCount;
}
//이전
if(startPage>pageBlock){
// 현재 페이지의 첫 페이지가 한 페이지당 표시되는 페이지 갯수 보다 크면
// 즉 첫 번째 페이지(1~3 페이지)가 아니라면
%>
<a href="list.jsp?pageNum=<%=startPage-1%>">[이전]</a>
<%
}
//페이지 번호 출력
for(int i=startPage;i<=endPage;i++){
if(i==currentPage){
%>
// 현재 페이지에서는 태그 출력하지 않음
<%=i %>
<%
}else{
%>
<a href="list.jsp?pageNum=<%=i%>"><%=i %></a>
<%
}}
//다음
if(endPage<pageCount){// 현재 페이지의 가장 끝 페이지 번호가 가장 끝 페이지가 아니라면
%>
<a href="list.jsp?pageNum=<%=startPage+pageBlock%>">[다음]</a>
<%
}}
%>
'서버프로그램' 카테고리의 다른 글
JSTL에서 sql문 사용 (0) | 2020.06.23 |
---|---|
JSTL 사용하기 (0) | 2020.06.23 |
세션(Session), 정규표현식(정규식) (0) | 2020.06.18 |
JSON 사용하기, get 함수 설정 (0) | 2020.06.17 |
제이쿼리(jquery) - 비동기 방식(get, post, ajax), 콜백함수, load() (0) | 2020.06.16 |