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的参数附加到分页链接中,有多个时用逗号隔开。