캐초보의 첫 페이징

JsP 2009. 10. 1. 00:21

이젠 페이징처리가 두렵지 않습니다. (캐초보는 페이징이 무서워~)
레퍼런스를 보지 않고 스스로 로직을 짜서 네비게이션을 구현해 낸 것이지요..ㅋ
완전 허접하지만 큰 산을 하나 넘은 것 같아 기쁩니다. 항상 맘에 걸렸거든요.. 언젠가 해결해야 될 과제인데,,

제 책상보다 지저분한 소스를 보시죠;;

<%
DeptPage dp = new DeptPage();
PagingVo pv = new PagingVo();
pv = dp.getCount();
String tr = null;
String currPage = request.getParameter("page");
String currNavi = request.getParameter("next");
String pageF = request.getParameter("pageFor");
int pageFo = 0; //시작점을 위한
int nextPage = 0; //다음 네비게이션 페이지 번호
int selectPage = 0; //보고자 하는 페이지 번호
if(currPage==null){
 pageFo=1;
 nextPage = 1;
 selectPage = 1;
}
else{
 pageFo = Integer.parseInt(pageF);
 nextPage = Integer.parseInt(currNavi);
 selectPage = Integer.parseInt(currPage);
}
ArrayList<LogonDataBean> arlist = dp.getList(selectPage);
int list = pv.getPageNavi().get(nextPage);
%>
<input type="hidden" value="<%=selectPage %>" name="pageNum"/>
<div id = "result">
<table width="500" align="center">
<tr>
 <td class="m-news" colspan=4 >부서 테이블(페이)</td>
</tr>
 <tr >
  <td width="150">부서명(학과명)</td>
  <td width="150">상위부서명(단과대학명)</td>
  <td width="100">ID</td>
  <td width="100">Password</td>
 </tr>
 <% for(int i=0; i<arlist.size(); i++){
 LogonDataBean gon = arlist.get(i);
 %>
 <tr>
  <td width="100"><%= gon.getDepartment() %></td>
  <td width="100"><%= gon.getSuperdepartment() %></td>
  <td width="100"><%= gon.getId() %></td>
  <td width="100"><%= gon.getPasswd() %></td>
 </tr>
 <%} %>
</table>
<center>
<% if(nextPage-1 == 0){}
else{%>
<a href="javascript:pageSelect('<%=nextPage-1 %>','<%=pageFo-1 %>','<%=pageFo-pv.getPageViewList() %>')">[이전]</a>
<%} %>
<%
 for(int i=pageFo; i<=list; i++){
%><a href="javascript:pageSelect('<%=nextPage %>','<%=i %>','<%=pageFo %>')">[<%=i %>]</a>
<%} %><a href="javascript:pageSelect('<%=nextPage+1 %>','<%=list+1 %>','<%=list+1 %>')">[다음]</a></center>

</div>

 public PagingVo getCount() throws SQLException{
  Connection conn = null;
  PreparedStatement pstmt = null;
  ResultSet rs = null;
  int count = 0;
  int pageCount = 0; //전체 페이지수
  int pageViewList = 3; //네비게이션에 보여줄 페이지 수
  int pageView = 10; //한페이지에 보여줄 목록 수
  int remain = 0;
  int temp_page = 0; //pageCount를 pageViewList로 나눈 몫
  int remainS = 0;
  int maxPage = 0; //끝 페이지
  HashMap<Integer, Integer> pmap = new HashMap<Integer, Integer>();
  PagingVo pv = new PagingVo();
  try{
   conn = dbcon.getConnection();
   String sql = "select count(*) as ct from dept";
   pstmt = conn.prepareStatement(sql);
   rs = pstmt.executeQuery();
   if(rs.next()){
   count = rs.getInt("ct");
   }
   pageCount = (int)count/pageView;
   remain = (int)count%pageView;
   if(pageCount == 0 && remain != 0){ //페이지가 없고 나머지값이 있으면 +1
    pageCount = pageCount + 1;
   }
   else if(pageCount != 0 && remain == 0){
    
   }
   else if(pageCount != 0 && remain != 0){
    pageCount = pageCount + 1;
   }
   else{
    pageCount = pageCount+1;
   }
   
   temp_page = (int)pageCount/pageViewList; //pageCount는 나머지페이지까지 계산되어 있다.
   remainS = (int)pageCount%pageViewList;
   
   for(int i=1; i<=temp_page; i++){
    pmap.put(i, i*pageViewList);
    if(i==temp_page && remainS != 0){ //마지막 단위이고 남은 페이지가 0이 아니면
     pmap.put(i+1, i*pageViewList+remainS); //최종페이지+1하고 남은 페이지수만큼만 담는다
    }
   }
   pv.setPageNavi(pmap); //최종적으로 객체에 담는다.
   pv.setPageCount(pageCount);
   pv.setPageViewList(pageViewList);
  }catch (Exception e) {
   e.printStackTrace();
  }finally{
   if(rs != null)try{rs.close();}catch(SQLException sqle){}
   if(pstmt != null)try{pstmt.close();}catch(SQLException sqle){}
   if(conn != null)try{conn.close();}catch(SQLException sqle){}
  }
  return pv;
 }




변수명도 막 지었고 코드 가독성도 정말 꽝이네요..ㅋ
아무튼 저는 이번에도 HashMap제네릭을 이용했습니다. [이전] 과 [다음]을 구현할 때 페이징 단위를 표현하기 위해서.. 뭐 딱히 생각나는 방법이 없어서 그렇게 쓴 점도 있지만,,
전체 게시물페이지가 27개이고 보여주는 페이지 수가 10개씩이라면...
map.get(1) == 10
map.get(2) == 20
map.get(3) == 27
머 이런식으로 갖고 오도록...

이제 처음과 끝을 구현하면 되겠네요..ㅋ

여러분은 어떻게 페이징 처리를 하시나요?
AND