Posted on 2011-02-27 18:26
viery 閱讀(4006)
評論(5) 編輯 收藏 所屬分類:
JavaEE
手動編寫分頁挺好,不過太累。于是在搜索了很多網上開源分頁插件后選擇pager-taglib-2.0,此分頁插件因為用法簡單功能強大能快速上手,下面逐步實現快速jsp頁面的分頁。
整體效果(因為記錄比較少,所以只有兩頁):

第二頁:

1.下載pager-taglib-2.0.war
在
http://jsptags.com/tags/navigation/pager/上可以看到demo和war包下載,在war中解壓出jar包,粘貼入項目的lib文件夾中。
2.在顯示的jsp上需要引入
<%@ taglib prefix="pg" uri="http://jsptags.com/tags/navigation/pager" %>
3.建立JSPPageModel模型,用于在jsp頁面上返回對象集和總記錄數
package com.v.oa.common;

import java.util.List;


public class JSPPageModel
{
private int total;
private List list;


public int getTotal()
{
return total;
}


public void setTotal(int total)
{
this.total = total;
}


public List getList()
{
return list;
}


public void setList(List list)
{
this.list = list;
}

}
4.建立SystemContext類,將系統啟動時顯示起始記錄數和每頁顯示行數設置在ThreadLocal中。
package com.v.oa.common;


public class SystemContext
{
private static ThreadLocal offset = new ThreadLocal();
private static ThreadLocal pagesize = new ThreadLocal();

public static void setOffset(int _offset)
{
offset.set(_offset);
}

public static int getOffset()
{
Integer _offset = (Integer)offset.get();

if(_offset == null)
{
return 0;
}
return _offset;
}

public static void removeOffset()
{
offset.remove();
}

public static void setPagesize(int _pagesize)
{
pagesize.set(_pagesize);
}

public static int getPagesize()
{
Integer _pagesize = (Integer)pagesize.get();

if(_pagesize == null)
{
return Integer.MAX_VALUE;
}
return _pagesize;
}

public static void removePagesize()
{
pagesize.remove();
}
}

5.建立過濾器,讀出ThreadLocal中的顯示的起始記錄數和每頁顯示行數。這里沒有在界面中去設置用戶可以選擇每頁顯示多少條記錄的功能,此處固定為每頁顯示5條記錄。
package com.v.oa.common;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;


public class PagerFilter implements Filter
{

@Override

public void destroy()
{
// TODO Auto-generated method stub

}

@Override
public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException
{
HttpServletRequest httpRequest = (HttpServletRequest)request;
SystemContext.setOffset(getOffset(httpRequest));
SystemContext.setPagesize(getPagesize(httpRequest));

try
{
chain.doFilter(request, response);

}finally
{
SystemContext.removeOffset();
SystemContext.removePagesize();
}
}

private int getOffset(HttpServletRequest request)
{
int offset = 0;

try
{
offset = Integer.parseInt(request.getParameter("pager.offset"));

} catch (Exception ignore)
{
}
return offset;
}

private int getPagesize(HttpServletRequest request)
{
return 5;
}


public void init(FilterConfig arg0) throws ServletException
{
}
}

6.action中:
protected ActionForward unspecified(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)

throws Exception
{
OrgForm of=(OrgForm)form;
int parentId=of.getParentId();
String keyWords=request.getParameter("keyWords");

if(keyWords==null)
{
keyWords="";

}else
{
keyWords=java.net.URLDecoder.decode(keyWords,"UTF-8");
}
//PageModel pm=orgManager.findAll(parentId, pageSize, pageNo, keyWords);
JSPPageModel pm=orgManager.findAll(parentId, keyWords);
request.setAttribute("keyWords", keyWords);
request.setAttribute("pm", pm);
我這里傳了兩個參數,一個是作為父類id的parentId,一個是搜索的關鍵字keyWords
7.ManagerImpl實現類,須繼承下面的類
@Override

public JSPPageModel findAll(int parentId,String keyWords)
{
keyWords="%"+keyWords+"%";

if(parentId!=0)
{

return this.getPage("from Organization o where o.parent.id=? and o.name like ?", new Object[]
{parentId,keyWords});
}
return this.getPage("from Organization o where o.parent.id is null and o.name like ?",keyWords);
}
8.實現封裝的核心class:
package com.v.oa.manager.impl;

import java.util.List;

import org.hibernate.Query;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.v.oa.common.JSPPageModel;
import com.v.oa.common.SystemContext;


/** *//**
* 此類用于封裝Hibernate的分頁查詢
* @author Administrator
*
*/


public class PageModelManager extends HibernateDaoSupport
{

public JSPPageModel getPage(String hql)
{
return this.getPage(hql, null,SystemContext.getOffset(),SystemContext.getPagesize());
}

public JSPPageModel getPage(String hql,int offset,int pageSize)
{
return this.getPage(hql, null, offset, pageSize);
}

public JSPPageModel getPage(String hql,Object o,int offset,int pageSize)
{

return this.getPage(hql, new Object[]
{o}, offset, pageSize);
}

public JSPPageModel getPage(String hql,Object o)
{

return this.getPage(hql, new Object[]
{o}, SystemContext.getOffset(),SystemContext.getPagesize());
}

public JSPPageModel getPage(String hql,Object[] params)
{
return this.getPage(hql, params, SystemContext.getOffset(),SystemContext.getPagesize());
}

public JSPPageModel getPage(String hql,Object[] params,int offset,int pageSize)
{
JSPPageModel pm=new JSPPageModel();
String countHql=null;
int index=hql.indexOf("from");

if(index!=-1)
{
countHql= "select count(*) "+hql.substring(index);
}
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();
pm.setTotal(total);
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 list=query.list();
pm.setList(list);
return pm;
}

}

整個過程結束, 最后jsp上的分頁代碼如下:
共 ${pm.total } 條記錄
<pg:pager url="org.do" items="${pm.total }" export="currentPageNumber=pageNumber" maxPageItems="5">
<pg:param name="parentId"/>
<pg:param name="keyWords"/>
<pg:first>
<a href="${pageUrl}">首頁</a>
</pg:first>
<pg:prev>
<a href="${pageUrl}">上頁</a>
</pg:prev>
<pg:pages>
<c:choose>
<c:when test="${currentPageNumber 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>
</pg:pager>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>


<!-- Standard Action Servlet Mapping -->
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GB18030</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>pagerFilter</filter-name>
<filter-class>com.v.oa.common.PagerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>pagerFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
附:
pg:pager【這個標簽用來設置分頁的總體參數】重要參數說明:
url:分頁的鏈接根地址,pager標簽會在這個鏈接的基礎上附加分頁參數
items:總記錄數,pager標簽正是根據這個值來計算分頁參數的
maxPageItems:每頁顯示的行數,默認為10
maxIndexPages:在循環輸出頁碼的時候,最大輸出多少個頁碼,默認是10
pg:first【第一頁的標簽】重要參數說明:
export變量的意義:
pageUrl - 分頁鏈接URL地址(最重要的export參數)
pageNumber - 頁碼
firstItem - 首頁第一行的索引值
lastItem - 首頁最后一行的索引值
pg:pre【上一頁標簽】重要參數說明:
export變量的意義:
pageUrl - 分頁鏈接URL地址(最重要的export參數)
pageNumber - 頁碼
firstItem - 前頁第一行的索引值
lastItem - 前頁最后一行的索引值
pg:next【下一頁標簽】重要參數說明:
export變量的意義:
pageUrl - 分頁鏈接URL地址(最重要的export參數)
pageNumber - 頁碼
firstItem - 下頁第一行的索引值
lastItem - 下頁最后一行的索引值
pg:last重要參數說明:
export變量的意義:
pageUrl - 分頁鏈接URL地址(最重要的export參數)
pageNumber - 頁碼
firstItem - 尾頁第一行的索引值
lastItem - 尾頁最后一行的索引值
pg:pages【這個標簽用來循環輸出頁碼信息】重要參數說明:
export變量的意義:
pageUrl - 分頁鏈接URL地址(最重要的export參數)
pageNumber - 頁碼
firstItem - pageNumber這個頁碼指定的那一頁的第一行的索引值
lastItem - pageNumber這個頁碼指定的那一頁的最后一行的索引值