Anyframe Web에서는 Page 처리에 대한 구현이 편리하도록 page 관련 Tag Library를 제공한다. 여기에서는 페이지 처리와 관련된 Page 객체, 각 영역별 Page 객체의 사용법 및 Page Tag Library를 통한 목록조회 화면의 구성에 대해 알아 본다.
페이지 처리 로직이 필요한 경우 다음과 같은 순서로 구현하면 된다.package anyframe.common;
import java.util.*;
import java.io.Serializable;
public class Page implements Serializable {
public static final Page EMPTY_PAGE = new Page(Collections.EMPTY_LIST, 0, 0);
/**
* 해당 Object의 목록
*/
private Collection objects;
/**
* 현재페이지
*/
private int currentPage;
/**
* 총 개수
*/
private int totalCount;
/**
* 페이지 번호가 화면에 보여지는 개수
*/
private int pageunit = 10;
/**
* 한 페이지당 조회 개수
*/
private int pagesize = 10;
/**
* 최대 페이지 번호 (전체 페이지)
*/
private int maxPage;
/**
* 화면에 보여지는 페이지번호의 최소수 (해당 페이지 Unit의 최소 페이지)
*/
private int beginUnitPage;
/**
* 화면에 보여지는 페이지번호의 최대수 (해당 페이지 Unit의 최대 페이지)
*/
private int endUnitPage;
/**
* Page Class의 Constructor ( pageunit & pagesize : 10 (default) )
*
* @param objects
* Collection
* @param currentPage
* @param totalCount
*/
public Page(Collection objects, int currentPage, int totalCount) {
this.objects = objects;
this.totalCount = totalCount;
this.maxPage = pagesize==0? this.totalCount : (totalCount - 1) / pagesize + 1;
this.currentPage = currentPage > maxPage ? maxPage : currentPage;
this.beginUnitPage = ((currentPage - 1) / pageunit) * pageunit + 1;
this.endUnitPage = beginUnitPage + (pageunit - 1);
}
… 중략 …
}
public Page getUserList(SearchVO searchVO) throws Exception {
int pageIndex = searchVO.getPageIndex();
int pageSize = propertiesService.getInt("PAGE_SIZE");
int pageUnit = propertiesService.getInt("PAGE_UNIT");
..
HashMap userListMap = queryService.findWithRowCount("getUserList",
iVal, pageIndex, pageSize);
ArrayList resultList = (ArrayList) userListMap.get(IQueryService.LIST);
int totalSize = ((Long) userListMap.get(IQueryService.COUNT)).intValue();
Page resultPage = new Page(resultList, (new Integer(pageIndex)).intValue()
, totalSize, pageUnit, pageSize);
return resultPage;
}
public class GetUserListAction extends DefaultActionSupport {
..
public ActionForward process(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
..
Page resultPage = userService.getUserList(searchVO);
int pageSize = propertiesService.getInt("PAGE_SIZE");
..
request.setAttribute("page", resultPage);
request.setAttribute("pageSize", new Integer(pageSize));
return mapping.findForward("success");
}
}
//page 처리로직을 구현한 custom tag를 사용하기 위한 설정
<%@ taglib uri='/WEB-INF/anyframe-page.tld' prefix='anyframe' %>
//Page 객체를 사용하기 위한 import
<%@ page import="anyframe.common.Page" %>
... 중략 ...
<%
Page resultPage = (Page)request.getAttribute("page");
ArrayList resultList = (ArrayList)resultPage.getList();
..
int pageSize = ((Integer)request.getAttribute("pageSize")).intValue();
%>
..
//현재 페이지 정보를 유지하기 위한 hidden 값
<input type="hidden" name="pageIndex" value="<%=resultPage.getCurrentPage()%>">
<anyframe:pagenavigator linkUrl="javascript:fncGetUserList(2);"
pages="<%=resultPage%>" formName="listForm"
firstImg="sample/images/ct_btn_pre.gif"
prevImg="sample/images/ct_btn_pre01.gif"
lastImg="sample/images/ct_btn_next.gif"
nextImg="sample/images/ct_btn_next01.gif" />
… 후략 …
package anyframe.web.struts.common.util;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
import anyframe.common.Page;
public class PageNavigatorTag extends TagSupport {
private String firstImg = "anyframe/web/image/page/page_before1.gif";
private String prevImg = "anyframe/web/image/page/page_before.gif";
private String lastImg = "anyframe/web/image/page/page_after1.gif";
private String nextImg = "anyframe/web/image/page/page_after.gif";
private String imgHeight = "13";
private String imgWidth = "15";
private String numClass = "page";
private String clickNumClass = "page_s";
private String formName = "forms[0]";
private String linkUrl = "";
private Page pages = Page.EMPTY_PAGE;
private int currentPage = 1;
public int doStartTag() throws JspException {
try {
JspWriter out = pageContext.getOut();
String page_num_script = "javascript:document." + getFormName()
+ ".pageIndex.value=";
out.print("<table border='0' cellspacing='0' cellpadding='0'><tr>");
if (pages.hasPreviousPageUnit()) {
out.print("<td><a href='" + page_num_script
+ pages.getPageOfPreviousPageUnit() + ";" + linkUrl
+ "'>");
out.print("<img src='" + firstImg + "' width='" + imgWidth
+ "' height='" + imgHeight + "' border='0' ></a></td>");
}
…
// 이하 getter/setter method는 생략
…
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>Anyframe Page</shortname>
<tag>
<name>pagenavigator</name>
<tagclass>anyframe.web.struts.common.util.PageNavigatorTag</tagclass>
<bodycontent>JSP</bodycontent>
<attribute>
<name>firstImg</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>prevImg</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>lastImg</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
… 중략 …
</tag>
</taglib>