一、环境的搭建:
将pager-taglib-2.0.war包拷贝到Tomcat的webapps下。启动Tomcat后会将其解压成pager-taglib-2.0文件夹。
从解压文件中的lib目录下拷贝pager-taglib.jar包到项目的lib下。
在JSP页面中使用taglib指令引入pager-taglib标签库。
二、重要参数的说明:
Offset:传过来的值是偏移量,是选择的页面的页数。比如你的记录/页pageSize=3,那么传过来的offset应该如下处理:offset/3+1 这样得到的就是要生成的页数!
pg:pager设置分页的总体参数
url:分页的链接根地址,pager标签会在这个链接的基础上附加分页参数,但不允许像给页面跳转的url那样,在后面直接添加参数,而参数的传递时需要使用pg:param来指定。
items:总记录数,pager标签正是根据这个值来计算分页参数,很重要。
maxPageItems:每页显示的行数,默认为10
maxIndexPages:在循环输出页码的时候,最大输出多少个页码,默认是10
pg:first 第一页的标签
pg:pre 上一页标签
pg:next 下一页标签
pg:last 最后一页标签
pg:pages 循环输出页码信息
对于上面的标签都有类似的export变量:
pageUrl - 分页链接URL地址(最重要的export参数)
pageNumber- 页码
firstItem –对应页第一行的索引值
lastItem -对应页最后一行的索引值
三、项目中使用pager-taglib:
1、引入对应的标签库:
- <span style="font-size:18px"><%@taglibprefix="pg" uri="http://jsptags.com/tags/navigation/pager"%>
- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %></span>
2、使用标签布置页面:
- <pg:pager url="org.do"items="${pm.total}"export="currentPageNumber=pageNumber">
- <pg:paramnamepg:paramname="parentId"/>
- <pg:first>
- <ahrefahref="${pageUrl}">首页</a>
- </pg:first>
- <pg:prev>
- <ahrefahref="${pageUrl }">前页</a>
- </pg:prev>
- <pg:pages>
- <c:choose>
- <c:whentestc:whentest="${currentPageNumber eq pageNumber }">
- <fontcolorfontcolor="red">${pageNumber }</font>
- </c:when>
- <c:otherwise>
- <ahrefahref="${pageUrl }">${pageNumber }</a>
- </c:otherwise>
- </c:choose>
- </pg:pages>
- <pg:next>
- <ahrefahref="${pageUrl }">后页</a>
- </pg:next>
- <pg:last>
- <ahrefahref="${pageUrl }">尾页</a>
- </pg:last>
- </pg:pager>
需要注意的是:
很多时候,在不同的页面中跳转的时候,需要传递一个id,在保持这个数据的时候,不能直接跟在url后面,需要使用<pg:param name="parentId"/>来传递。
为了给当前页添加一些特殊的效果,使用currentPageNumber给pageNumber指定了一个别名,这是为了test="${currentPageNumber eq pageNumber }判断的需要。
Items表示:返回来的总记录数,由此,该框架采用的是假分页。
url:指明了请求的入口地址,是与struts的配置文件struts-config.xml中的配置相关联。
3、设置offset和pagesize变量的值:
比较好的做法是在系统变量类中,将其设置到ThreadLocal变量中。这里将其封装到了SystemContext类中:
- <span style="font-size:18px">public class SystemContext {
- privatestatic ThreadLocal offset = new ThreadLocal();
- privatestatic ThreadLocal pagesize = new ThreadLocal();
- publicstatic int getOffset(){
- Integeros = (Integer)offset.get();
- if(os== null){
- return0;
- }
- returnos;
- }
- publicstatic void setOffset(int offsetvalue){
- offset.set(offsetvalue);
- }
- publicstatic void removeOffset(){
- offset.remove();
- }
- publicstatic int getPagesize(){
- Integerps = (Integer)pagesize.get();
- if(ps== null){
- returnInteger.MAX_VALUE;
- }
- returnps;
- }
- publicstatic void setPagesize(int pagesizevalue){
- pagesize.set(pagesizevalue);
- }
- publicstatic void removePagesize(){
- pagesize.remove();
- }
- }</span>
4、定义分页过滤器PagerFilter:
该过滤器调用SystemContext类的方法,给offset和pagesize变量赋值。
- <span style="font-size:18px">publicclass PagerFilter implements Filter {
- @Override
- publicvoid destroy() {
- }
- @Override
- publicvoid doFilter(ServletRequest request, ServletResponseresponse,
- FilterChain chain) throws IOException, ServletException{
- HttpServletRequest httpRequest = (HttpServletRequest)request;
- SystemContext.setOffset(getOffset(httpRequest));
- SystemContext.setPagesize(getPagesize(httpRequest));
- try{
- chain.doFilter(request, response);
- }finally{
- //清空ThreadLocal中的值
- SystemContext.removeOffset();
- SystemContext.removePagesize();
- }
- }
- protectedint getOffset(HttpServletRequest request){
- int offset = 0;
- try {
- offset = Integer.parseInt(request.getParameter("pager.offset"));
- } catch (NumberFormatException ignore) {
- }
- return offset;
- }
- protectedint getPagesize(HttpServletRequest request){
- return 10;
- }
- @Override
- publicvoid init(FilterConfig arg0) throws ServletException {
- }
- }</span>
offset = Integer.parseInt(request.getParameter("pager.offset"));中的参数是固定的。
5、将过滤器配置到web.xml文件中,使之生效:
- <filter>
- <filter-name>pagerFilter</filter-name>
- <filter-class>com.bjsxt.oa.web.PagerFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>pagerFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
6、定义封装不同实体类数据的分页类PagerModel:
该类使用List封装了返回的不同实体类型。这里如果使用泛型,可以在编程的时候检查类型及早给出提示,不使用也是可以的,根据个人的编程习惯吧。
- publicclass PagerModel{
- /**
- * 总记录数
- */
- privateinttotal;
- /**
- * 当前页结果集
- */
- private List datas;
- public List getDatas() {
- returndatas;
- }
- publicvoid setDatas(List datas) {
- this.datas = datas;
- }
- publicint getTotal() {
- returntotal;
- }
- publicvoid setTotal(int total) {
- this.total = total;
- }
- }
7、抽象分页服务类AbstractManager:
在业务逻辑的实现类中,只是传入的查询语句和参数不同,所以,可以对这个变化的部分抽象。
- publicclass AbstractManager extends HibernateDaoSupport {
- /**
- * 私有的给查询语句赋值的方法
- * @param query
- * @param hql
- * @param params
- */
- publicvoid setParams(Query query,String hql,Object[] params){
- if(params!=null && params.length>0){
- for(int i =0;i<params.length;i++){
- query.setParameter(i, params[i]);
- }
- }
- }
- //*****************************************分页公共方法开始*****************************************
- public PagerModel searchPaginated(String hql){
- return searchPaginated(hql,null,SystemContext.getOffset(),SystemContext.getPagesize());
- }
- public PagerModel searchPaginated(String hql,Object param){
- return searchPaginated(hql,new Object[]{param},SystemContext.getOffset(),SystemContext.getPagesize());
- }
- public PagerModel searchPaginated(String hql,Object[] params){
- return searchPaginated(hql,params,SystemContext.getOffset(),SystemContext.getPagesize());
- }
- public PagerModel searchPaginated(String hql,int offset,int pagesize){
- return searchPaginated(hql,null,offset,pagesize);
- }
- public PagerModel searchPaginated(String hql,Object obj,int offset,int pagesize){
- return searchPaginated(hql,new Object[]{obj},offset,pagesize);
- }
- /**
- * 根据HQL语句进行分页查询
- * @param hql HQL语句
- * @param params HQL语句带的多个参数值
- * @param offset 从第几条记录开始查询
- * @param pagesize 每页显示多少行
- * @return
- */
- public PagerModel searchPaginated(String hql,Object[] params,int offset,int pagesize){
- //获取记录总数
- String countHql = getCountQuery(hql);
- Query query = getSession().createQuery(countHql);
- if(params != null && params.length > 0){
- for(int i=0; i<params.length; i++){
- query.setParameter(i, params[i]);
- }
- }
- int total = ((Long)query.uniqueResult()).intValue();
- //获取当前页的结果集
- query = getSession().createQuery(hql);
- if(params != null && params.length > 0){
- for(int i=0; i<params.length; i++){
- query.setParameter(i, params[i]);
- }
- }
- query.setFirstResult(offset);
- query.setMaxResults(pagesize);
- List datas = query.list();
- PagerModel pm = new PagerModel();
- pm.setTotal(total);
- pm.setDatas(datas);
- return pm;
- }
- /**
- * 根据HQL语句,获得查找总记录数的HQL语句
- * 如:
- * select ... from Orgnizationo where o.parent is null
- * 经过转换,可以得到:
- * select count(*) from Orgnizationo where o.parent is null
- * @param hql
- * @return
- */
- private String getCountQuery(String hql){
- int index = hql.indexOf("from");
- if(index != -1){
- return"selectcount(*) " + hql.substring(index);
- }
- thrownew SystemException("无效的HQL查询语句!");
- }
- //*****************************************分页公共方法结束*****************************************
- }
当然这个类中还可以定义其他的服务方法,相当于.net中常用的sqlHelp类。
8、在业务逻辑实现类中查询分页数据:
- <span style="font-size:18px"> @Override
- public PagerModelfindOrgs(int parentId) {
- //如果parentId=0,则查找顶级机构列表
- if(parentId == 0){
- return searchPaginated("from Organization owhere o.parent is null");
- }
- return searchPaginated("from Organization o where o.parent.id = ?", parentId);
- }</span>
我们可以看到经过上面的封装,分页查询变得如此简洁。
总结:
上文中首先介绍了分页框架pager-taglib的环境搭建,然后介绍了一些重点参数的意义。
如然后结合一个项目中与之相关的部分进行了完整的代码展示。
诸如此类的小的框架很多很多,有了ssh基础后,对这类框架的学习应该会看官方文档,并从一些简单的demo开始,学习使用起来应该是比较快的,这些框架就像是夜空中的星星给java程序添加一些灿烂的点缀。
实例:
<!-- 分页标签 -->
<div style="text-align: right; border: 0;padding: 4px 12px;" class="pageDiv">
<pg:pager url="${pager.pagerUrl}" items="${pager.total}"
export="currentPageNumber=pageNumber"
maxPageItems="${pager.pageSize}" maxIndexPages="10" isOffset="true">
总共:${pager.total}条,共:${pager.pagerSize}页
<%-- <pg:param name="key" value="${ }" />带条件的分页 --%>
<pg:first>
<a href="${pageUrl}" class="pageLink">首页</a>
</pg:first>
<pg:prev>
<a href="${pageUrl}" class="pageLink">上一页</a>
</pg:prev>
<%-- <pg:next>
<a href="${pageUrl}" class="pageLink">上一页</a>
</pg:next> --%>
<pg:pages>
<c:choose>
<c:when test="${currentPageNumber==pageNumber}">
<span class="selectPageLink">${pageNumber}</span>
</c:when>
<c:otherwise>
<a href="${pageUrl}" class="pageLink">${pageNumber}</a>
</c:otherwise>
</c:choose>
</pg:pages>
<pg:next>
<a href="${pageUrl}" class="pageLink">下一页</a>
</pg:next>
<pg:last>
<a href="${pageUrl}" class="pageLink">尾页</a>
</pg:last>
<input type="text" id="pageno" name="pageno" style="width:32px;height:22px;"/>
<a onclick="goto_page_no()" class="pageLink">GO</a>
</pg:pager>
<script type="text/javascript">
function goto_page_no()
{
var pgno = $("#pageno").val();
var pgsize = "${pager.pageSize}";
var offset = pgsize*(pgno-1);
window.location.href='${pageUrl}?pager.offset='+offset;
}
</script>
本文介绍了一个轻量级的Java分页框架pager-taglib的使用方法,包括环境搭建、重要参数说明及项目实践。通过示例展示了如何在项目中引入并使用该框架完成分页功能。
218

被折叠的 条评论
为什么被折叠?



