1) 準備
原始的pager-taglib.jar可能會導致中文亂碼(準確說是在url中有中文時),要用修改過的。(要沒有可給我評論中索取)
2) 分頁jsp文件
將分頁的代碼寫到一個獨立的jsp文件中,
<%@ pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>
<%--這是給編譯器看的,應在每個文件上都加上,要不保存時都會出問題,選擇save as UTF-8也會亂碼 --%>
<%@ taglibprefix="pg"uri="http://jsptags.com/tags/navigation/pager"%>
<%@ tagliburi="http://java.sun.com/jsp/jstl/core"prefix="c"%>
<script type="text/javascript">
function selectPagesize(select){
var newPageSize=select.value;
var url=document.getElementById("firstPage").href;
window.location=url+"&newPageSize="+newPageSize;
}
</script>
<pg:pager url="${param.servletUrl}"items="${total }"maxIndexPages="9"maxPageItems="${pageSize }"export="currentPage=pageNumber">
<table width="100%"border="0"cellspacing="0"cellpadding="0">
<tr>
<tdwidth="33%"><divalign="left"><spanclass="STYLE22"> 共有<strong> ${total }</strong> 條記錄,當前第<strong>${currentPage }</strong> 頁,共 <strong><spanid="totalPage"><pg:last>${pageNumber }</pg:last></span></strong> 頁</span></div></td>
<tdwidth="67%"align=rightvalign="top"noWrap>
<c:forEachitems="${param.queryParam}"var="p">
<pg:paramname="${p }"/>
</c:forEach>
<pg:first><aid="firstPage"href="${pageUrl }">首頁</a></pg:first>
<pg:prev><ahref="${pageUrl }">上一頁</a></pg:prev>
<pg:pages>
<c:choose>
<c:whentest="${currentPageeq pageNumber }">
<fontcolor="red">${pageNumber }</font>
</c:when>
<c:otherwise>
<ahref="${pageUrl }">${pageNumber }</a>
</c:otherwise>
</c:choose>
</pg:pages>
<pg:next><ahref="${pageUrl }">下一頁</a></pg:next>
<pg:last><ahref="${pageUrl }">尾頁</a></pg:last>
每頁<selectname="pagesize"onchange="selectPagesize(this)">
<c:forEachbegin="5"step="5"end="50"var="newPageSize">
<optionvalue="${newPageSize }"<c:iftest="${newPageSize eqpageSize }">selected</c:if>>${newPageSize }</option>
</c:forEach>
</select>條
</td>
</tr>
</table>
</pg:pager>
3) 在需要分頁的頁面中包含此頁面
<jsp:includepage="/WEB-INF/views/common/pager.jsp">
<jsp:paramvalue="${article_list}" name="servletUrl"/>
<jsp:param value="title"name="queryParam"/>
</jsp:include>
queryParam是需要在url後附加參數,比如說模糊查詢時的文章名用,如果不需要就可以去掉。不去沒影響的,所以是一個通用的分頁模塊。後面有詳細的使用講解。
4) 使用ThreadLocal模式
爲了避免分頁參數多次傳遞,使用ThreadLocal模式
public class PagerContext {
private static ThreadLocal<Integer> offset=new ThreadLocal<Integer>();
private static ThreadLocal<Integer> pageSize=new ThreadLocal<Integer>();
public static int getOffset(){
Integer _offset=offset.get();
if(_offset!=null)
return _offset;
else{
return 0;
}
}
public static void setOffset(int_offset){
offset.set(_offset);
}
public static void removeOffset(){
offset.remove();
}
public static int getPageSize(){
Integer _pagesize=pageSize.get();
if(_pagesize!=null)
return _pagesize;
else{
return 10;
}
}
public static void setPageSize(int_pagesize){
pageSize.set(_pagesize);
}
public static void removePageSize(){
pageSize.remove();
}
}
5) 獲取offset與pageSize參數
這兩個參數指從數據庫中第幾個開始取和一次取多少個。
public int getOffset(HttpServletRequest request){
int offset=0;
StringoffsetParam=request.getParameter("pager.offset");
if(offsetParam!=null){
offset=Integer.parseInt(offsetParam);
}
return offset;
}
public int getPageSize(HttpServletRequest request){
//默認爲10
int pageSize=10;
//如果有修改每頁顯示數目的參數,則修改session中的值,並顯示第一頁
StringnewPageSize=request.getParameter("newPageSize");
if(newPageSize!=null){
pageSize=Integer.parseInt(newPageSize);
request.getSession().setAttribute("pageSize", pageSize);
}else{
//得到每頁顯示記錄數,從session中取,如果沒有則將默認值放入session
IntegerpageSizeAttr=(Integer) request.getSession().getAttribute("pageSize");
if(pageSizeAttr==null){
request.getSession().setAttribute("pageSize", pageSize);
}else{
pageSize=pageSizeAttr;
}
}
return pageSize;
}
6) 請求處理
PagerContext.setOffset(getOffset(request));
PagerContext.setPageSize(getPageSize(request));
然後就是查詢數據庫
注意分頁需要知道數據的總量,要爲jsp傳一個名爲total的參數。ActionContext.getContext().put("total", total);這個是struts2的寫法,放在request裏。
7) 帶參數的分頁查詢
<jsp:include page="/WEB-INF/common/pager.jsp">
<jsp:param value="${ article_list }" name="servletUrl"/>
<jsp:param value="title" name="queryParam"/>
</jsp:include>
假如分頁查詢所有文章,那麼 <jsp:param value="title" name="queryParam"/>
完全可以不要。當要查詢文章名中帶param的文章時,就要附加一個參數url?title=param,這時如果仍不加這句,那麼生成的分頁鏈接,上一頁,下一頁等都沒有這個參數,這樣就不是條件查詢了。<jsp:param value="title" name="queryParam"/>表示把請求中名爲title的參數附加到分頁鏈接中,有多個時用逗號隔開。