在ssh架構中利用pager-taglib和filter根據用戶需求顯示進行分頁,在次將實現一個根據用戶在下拉類表用選擇每頁將要顯示多少行進行分頁
首先介紹pager-taglib標簽:
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這個頁碼指定的那一頁的最后一行的索引值
pager-taglib組件默認的每頁顯示數目為10,相應的屬性是maxPageItems="10",因此我可以將用戶自己的顯示行數放在session內,并將其賦值給maxPageItems就可以實現用戶自己的分頁類型。例如httpRequest.getSession().setAttribute("ps", 10);然后maxPageItems="ps"
下面是一個具體的例子:
首先下載pager-taglib-2.0.war ,地址http://jsptags.com/tags/navigation/pager/download.jsp,然后將lib下面的包lib下的jar包放到自己項目的lib下面。
生成測試表:t_person,其中實體類Person類有id,name,phone屬性,具體在hibernate配置文件中的配置略..。
創建PagerModel類用于存放從數據庫查詢的所有person,和總記錄數。代碼如下:
package com.test;
import java.util.List;
public class PagerModel {
private int total;//總記錄數
private List datas;//所有用戶集合
...get和set方法
}
下面一個類用于得到每頁個顯示數和用于查詢的首記錄數
package com.test.filter;
public class SystemContext {
private static ThreadLocal<Integer> offset = new ThreadLocal<Integer>();//用于query.setFirstResult(offset)
private static ThreadLocal<Integer> pagesize = new ThreadLocal<Integer>();//pagesize每頁顯示的行數用于
query.setMaxResults(pagesize);-----ThreadLocal線程局部變量,就是為每一個使用該變量的線程都提供一個變量值的副本,每一個線程都可以獨立地改變自己的副本,而不會和其它線程的副本沖突,也就是每一個用戶都可以改變自己的每頁顯示的行數而不會影響到其他人
public static void setOffset(int offsetvalue){
offset.set(offsetvalue);
}
public static int getOffset(){
Integer ov = offset.get();
if(ov == null){
return 0;
}
return ov;
}
public static void setPagesize(int pagesizevalue){
pagesize.set(pagesizevalue);
}
public static int getPagesize(){
Integer ps = pagesize.get();
if(ps == null){
return Integer.MAX_VALUE;//將pagesize設置為無窮大,也就是顯示在一頁上
}
return ps;
}
public static void removeOffset(){//清除為每個用戶分配的副本
offset.remove();
}
public static void removePagesize(){
pagesize.remove();
}
}
主要的類PagerFilter:用于設置加載用戶自定義的pagesize和offset
package com.test.filter;
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 {
public static final String PAGE_SIZE_NAME = "ps";
public void destroy() {
}
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 httpRequest){
int offset = 0;
try {
offset = Integer.parseInt(httpRequest.getParameter("pager.offset"));//得到標簽自己計算出的pager.offset
} catch (Exception ignore) {
}
return offset;
}
//獲取每頁顯示的行數
private int getPagesize(HttpServletRequest httpRequest){
String pageSize = httpRequest.getParameter("pagesize");//得到用戶自己的每頁顯示的行數
if(pageSize != null){
Integer ps;
try {
ps = Integer.parseInt(pageSize);
httpRequest.getSession().setAttribute(PAGE_SIZE_NAME, ps);
} catch (Exception ignore) {
}
}
Integer pagesize = (Integer)httpRequest.getSession().getAttribute(PAGE_SIZE_NAME);
if(pagesize == null){//如果用戶沒有設置就每日顯示10行,并將其放入session供以便在顯示頁面賦值給maxPageItems使用
httpRequest.getSession().setAttribute(PAGE_SIZE_NAME, 10);
return 10;
}else{
return pagesize;
}
}
public void init(FilterConfig arg0) throws ServletException {
}
}
在web.xml中配置:
<filter>
<filter-name>pagerfilter</filter-name>
<filter-class>com.test.filter.PagerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>pagerfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
建立AbstractManager類用于封裝查詢數據庫的細節,管理類可以通過searchPaginated(String hql)就可以得到PagerModel :
public class AbstractManager extends HibernateDaoSupport {
public PagerModel searchPaginated(String hql){
return searchPaginated(hql,offset,pagesize);
}
public PagerModel searchPaginated(String hql,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(SystemContext.getOffset());//通過SystemContext得到Offset
query.setMaxResults(SystemContext.getPagesize();//通過SystemContext得到pagesize
List datas = query.list();
PagerModel pm = new PagerModel();
pm.setDatas(datas);
pm.setTotal(total);
return pm;
} //根據HQL語句,獲得查找總記錄數的HQL語句如:select .... from ...轉換為:select count(*) from ....
private String getCountQuery(String hql){
int index = hql.indexOf("from");
if(index != -1){
return "select count(*) " + hql.substring(index);
}
throw new SystemException("無效的HQL查詢語句!");
}
}
//下面是具體管理類//得到分頁數據PagerModel:
public class PersonManagerImpl extends AbstractManager implements PersonManager {//PersonManager為一個interface
public PagerModel searchPersons() {
PagerModel pm = new PagerModel();
String hql = "select p from Person p";
return this.searchPaginated(hql);
}
}
創建訪問頁面index.jsp
主要代碼:<a href="person.do">用戶分頁類表</a>
相應的action頁面:主要代碼:
public class PersonAction extends DispatchAction {
private PersonManager personManager;//利用spring注入person管理類
@Override
protected ActionForward unspecified(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
PagerModel pm = personManager.searchPersons();
request.setAttribute("pm", pm);
return mapping.findForward("index");//通過配置文件轉到list.jsp
}
public void setPersonManager(PersonManager personManager) {
this.personManager = personManager;
}
}
顯示頁面:list.jsp
<%@ taglib prefix="pg" uri="http://jsptags.com/tags/navigation/pager" %>//引入
...
<script type="text/javascript">
function selectPagesize(field){
document.location.href = document.all.firstpageurl.href + "&pagesize="+field.value;//得到用戶從下拉列表選擇的每頁顯示的行數,并刷新到轉到首頁
}
</script>
....
<table>
<!-- 列表標題欄 -->
<tr bgcolor="#EFF3F7" class="TableBody1">
<td >姓名</td>
<td >電話</td>
</tr>
<!-- 列表數據欄 -->
<c:forEach items="${pm.datas }" var="person">
<tr>
<td >${person.name }</td>
<td >${person.phone }</td>
</tr>
</c:forEach>
</table>
<TABLE>
<TBODY>
<TR>
<TD>
<!-- 分頁導航條 -->
<pg:pager url="person.do" items="${pm.total}" export="currentPageNumber=pageNumber" maxPageItems="${ps}">//得到session范圍內的每頁顯示的行數
<pg:first>
<a href="${pageUrl}" id="firstpageurl">首頁</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>
<!-- 用戶選擇每頁顯示行數下拉列表 -->
每頁顯示
<select name="pagesize" onchange="selectPagesize(this)" >
<c:forEach begin="5" end="50" step="5" var="i">
<option value="${i}"
<c:if test="${ps eq i }">selected</c:if>
>${i}</option>
</c:forEach>
</select>行
</TD>
</TR>
</TBODY>
</TABLE>
