1、把pager-taglib.jar拷贝到项目的lib目录下
2、在要使用的jsp页面中引入标签库
<%@ taglib prefix="pg" uri="http://jsptags.com/tags/navigation/pager" %>
3、在html中静态使用演示:
<body>
<pg:pager items="1001" export="currentPageNo = pageNumber">
<pg:first>
<a href="${pageUrl }" />首页</a>
</pg:first>
<pg:prev>
<a href="${pageUrl }" />上页</a>
</pg:prev>
<pg:pages>
<c:choose>
<c:when test="${currentPageNo == pageNumber}">
<font color="red">${pageNumber }</font>
</c:when>
<c:otherwise>
<a href="${pageUrl }"/>${pageNumber }</a>
</c:otherwise>
</c:choose>
</pg:pages>
<pg:next>
<a href="${pageUrl }" />下页</a>
</pg:next>
<pg:last>
<a href="${pageUrl }" />尾页</a>
</pg:last>
</pg:pager>
</body>
4、在和struts结合动态的使用
最终效果:
[img]http://dl.iteye.com/upload/attachment/219263/6940aef1-d2d9-38a7-94ba-eccfa3ae97e0.jpg[/img]
每页显示的条数可以在下拉框中动态的指定
<!--url:是指要将这些分页数据提交到的action,如果不写这个url他会默认把当前页面作为转向地址,这是错误的 items:从dao层取回来的数据 export:进行了一个变量的赋值 maxPageItems:每页最多显示的条数,默认10 ,注意这个参数的取值要和服务器端的值保持一致,否则会出现一些莫名奇妙的错误-->
<pg:pager url="org.action" items="${pm.total}" export="currentPageNo = pageNumber" maxPageItems="${pagesize}">
<!-- 当进入到机构的下一级子机构的时候分页要查询的是当前机构下所有的数据然后分页,所以要带着pid,他会自动把这个参数的值加入到url串中 -->
<pg:param name="pid"/>
<pg:param name="pagesize"/>
<pg:first>
<a href="${pageUrl }" />首页</a>
</pg:first>
<pg:prev>
<a href="${pageUrl }" />上页</a>
</pg:prev>
<pg:pages>
<c:choose>
<c:when test="${currentPageNo eq pageNumber}">
<font color="red">${pageNumber }</font>
</c:when>
<c:otherwise>
<a href="${pageUrl }" />${pageNumber }</a>
</c:otherwise>
</c:choose>
</pg:pages>
<pg:next>
<a href="${pageUrl }" />下页</a>
</pg:next>
<pg:last>
<a href="${pageUrl }" />尾页</a>
</pg:last>
每页显示:
<select id="pagesize" onchange="javascript:changeItem(this)">
<option value="3">3</option>
<option value="5">5</option>
<option value="10">10</option>
<option value="15">15</option>
<option value="20">20</option>
</select>
条
</pg:pager>
在下拉框中用一个onchange时间调用一个JavaScript函数吧用户当前选择的数据组装成一个url地址然后向后台发送一个请求,查询数据:
<script type="text/javascript">
function changeItem(pagesize) {
var i = document.getElementById("pagesize").value;
window.location.href = "org.action?pid=" + '<s:property value="pid" />' + "&pagesize=" + i;
}
</script>
接下来我们定义一个拦截器把用户提交的pagesize这个属性设置到一个TheradLocal中然后再dao层取数据的时候从ThreadLocal中取出相应的数据进行分页就可以了(别忘了把我们自己定义的拦截器加入到struts.xml配置文件中):
public class PageModelInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invoke) throws Exception {
int offset = 0;
try {
offset = Integer.parseInt(ServletActionContext.getRequest()
.getParameter("pager.offset"));
} catch (NumberFormatException e) {
}
//默认为5
int pageSize = 5;
try {
pageSize = Integer.parseInt(ServletActionContext.getRequest().getParameter("pagesize"));
} catch (Exception e) {
}
//在这个地方要把pagesize设置到request中,因为这个数据是设定<pg:pager>标签中maxPageItems值的依据,一定要保持一致。
ServletActionContext.getRequest().setAttribute("pagesize", pageSize);
PageModel pm = MyThreadLocal.getValue();
pm.setOffset(offset<0 ? 0 : offset);
pm.setPageSize(pageSize<0 ? Integer.MAX_VALUE : pageSize);
MyThreadLocal.setValue(pm);
try {
return invoke.invoke();
}finally {
//注意等到整个拦截器执行完成即一个ThreadLocal完成它的工作后要清除里面的内容
MyThreadLocal.remove();
}
}
}
//用javascript保证下拉列表中显示的值与当前用户的选择一致:这一句要放到后面等到下拉框加载完成之后才能起作用
<script type="text/javascript">
var pagesize = document.getElementById("pagesize").options;
for(var i=0; i<pagesize.length; i++) {
if(pagesize[i].value == ${pagesize})
pagesize[i].selected = true;
}
</script>