posts - 68, comments - 19, trackbacks - 0, articles - 1

          基于SSH+pager-taglib的分頁(yè)封裝

          Posted on 2011-02-27 18:26 viery 閱讀(4012) 評(píng)論(5)  編輯  收藏 所屬分類: JavaEE
          手動(dòng)編寫(xiě)分頁(yè)挺好,不過(guò)太累。于是在搜索了很多網(wǎng)上開(kāi)源分頁(yè)插件后選擇pager-taglib-2.0,此分頁(yè)插件因?yàn)橛梅ê?jiǎn)單功能強(qiáng)大能快速上手,下面逐步實(shí)現(xiàn)快速jsp頁(yè)面的分頁(yè)。
          整體效果(因?yàn)橛涗洷容^少,所以只有兩頁(yè)):

          第二頁(yè):

          1.下載pager-taglib-2.0.war
              在http://jsptags.com/tags/navigation/pager/上可以看到demo和war包下載,在war中解壓出jar包,粘貼入項(xiàng)目的lib文件夾中。


          2.在顯示的jsp上需要引入
          <%@ taglib prefix="pg"  uri="http://jsptags.com/tags/navigation/pager" %>

          3.建立JSPPageModel模型,用于在jsp頁(yè)面上返回對(duì)象集和總記錄數(shù)
          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類,將系統(tǒng)啟動(dòng)時(shí)顯示起始記錄數(shù)和每頁(yè)顯示行數(shù)設(shè)置在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.建立過(guò)濾器,讀出ThreadLocal中的顯示的起始記錄數(shù)和每頁(yè)顯示行數(shù)。這里沒(méi)有在界面中去設(shè)置用戶可以選擇每頁(yè)顯示多少條記錄的功能,此處固定為每頁(yè)顯示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);
          我這里傳了兩個(gè)參數(shù),一個(gè)是作為父類id的parentId,一個(gè)是搜索的關(guān)鍵字keyWords

          7.ManagerImpl實(shí)現(xiàn)類,須繼承下面的類
          @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.實(shí)現(xiàn)封裝的核心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的分頁(yè)查詢
           * 
          @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;
                  
              }

               
              

          }


          整個(gè)過(guò)程結(jié)束, 最后jsp上的分頁(yè)代碼如下:
                  共&nbsp;${pm.total }&nbsp;條記錄       &nbsp;&nbsp;
            
          <pg:pager url="org.do" items="${pm.total }" export="currentPageNumber=pageNumber" maxPageItems="5">
                  
          <pg:param name="parentId"/>
                  
          <pg:param name="keyWords"/>
                  
          <pg:first>
                      
          <href="${pageUrl}">首頁(yè)</a>
                  
          </pg:first>
                  
          <pg:prev>
                      
          <href="${pageUrl}">上頁(yè)</a>
                  
          </pg:prev>
                  
          <pg:pages>
                      
          <c:choose>
                          
          <c:when test="${currentPageNumber eq pageNumber}">
                              
          <font color="red">${pageNumber }</font>
                          
          </c:when>
                          
          <c:otherwise>
                              
          <href="${pageUrl}">${pageNumber }</a>
                          
          </c:otherwise>
                      
          </c:choose>
                  
          </pg:pages>
                  
          <pg:next>
                      
          <href="${pageUrl}">下頁(yè)</a>
                  
          </pg:next>
                  
          <pg:last>
                      
          <href="${pageUrl}">尾頁(yè)</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【這個(gè)標(biāo)簽用來(lái)設(shè)置分頁(yè)的總體參數(shù)】重要參數(shù)說(shuō)明:
           url:分頁(yè)的鏈接根地址,pager標(biāo)簽會(huì)在這個(gè)鏈接的基礎(chǔ)上附加分頁(yè)參數(shù)
           items:總記錄數(shù),pager標(biāo)簽正是根據(jù)這個(gè)值來(lái)計(jì)算分頁(yè)參數(shù)的
           maxPageItems:每頁(yè)顯示的行數(shù),默認(rèn)為10
           maxIndexPages:在循環(huán)輸出頁(yè)碼的時(shí)候,最大輸出多少個(gè)頁(yè)碼,默認(rèn)是10
           
          pg:first【第一頁(yè)的標(biāo)簽】重要參數(shù)說(shuō)明:
           export變量的意義:
           pageUrl - 分頁(yè)鏈接URL地址(最重要的export參數(shù))
           pageNumber - 頁(yè)碼
           firstItem - 首頁(yè)第一行的索引值
           lastItem - 首頁(yè)最后一行的索引值
           
          pg:pre【上一頁(yè)標(biāo)簽】重要參數(shù)說(shuō)明:
           export變量的意義:
           pageUrl - 分頁(yè)鏈接URL地址(最重要的export參數(shù))
           pageNumber - 頁(yè)碼
           firstItem - 前頁(yè)第一行的索引值
           lastItem - 前頁(yè)最后一行的索引值

          pg:next【下一頁(yè)標(biāo)簽】重要參數(shù)說(shuō)明:
           export變量的意義:
           pageUrl - 分頁(yè)鏈接URL地址(最重要的export參數(shù))
           pageNumber - 頁(yè)碼
           firstItem - 下頁(yè)第一行的索引值
           lastItem - 下頁(yè)最后一行的索引值
           
          pg:last重要參數(shù)說(shuō)明:
           export變量的意義:
           pageUrl - 分頁(yè)鏈接URL地址(最重要的export參數(shù))
           pageNumber - 頁(yè)碼
           firstItem - 尾頁(yè)第一行的索引值
           lastItem - 尾頁(yè)最后一行的索引值
           
          pg:pages【這個(gè)標(biāo)簽用來(lái)循環(huán)輸出頁(yè)碼信息】重要參數(shù)說(shuō)明:
           export變量的意義:
           pageUrl - 分頁(yè)鏈接URL地址(最重要的export參數(shù))
           pageNumber - 頁(yè)碼
           firstItem - pageNumber這個(gè)頁(yè)碼指定的那一頁(yè)的第一行的索引值
           lastItem - pageNumber這個(gè)頁(yè)碼指定的那一頁(yè)的最后一行的索引值

          Feedback

          # re: 基于SSH+pager-taglib的分頁(yè)封裝  回復(fù)  更多評(píng)論   

          2011-02-28 09:18 by @joe
          這個(gè)工具確實(shí)好用,不過(guò)在使用中還是有很多問(wèn)題需要解決,比如參數(shù)的傳遞等等問(wèn)題!

          # re: 基于SSH+pager-taglib的分頁(yè)封裝  回復(fù)  更多評(píng)論   

          2011-02-28 09:27 by d
          一看頁(yè)面樣式就知道是尚學(xué)堂的東西!

          # re: 基于SSH+pager-taglib的分頁(yè)封裝  回復(fù)  更多評(píng)論   

          2011-02-28 09:29 by vle
          @@joe
          中文參數(shù)參數(shù)肯定會(huì)出現(xiàn)亂碼,有幾種方法,1,更改tomcat server.xml配置文件 2 改分頁(yè)插件的class 3 增加過(guò)濾器

          # re: 基于SSH+pager-taglib的分頁(yè)封裝  回復(fù)  更多評(píng)論   

          2011-02-28 09:30 by vle
          @d
          是的,是在李騰飛老師的代碼上做了改動(dòng)

          # re: 基于SSH+pager-taglib的分頁(yè)封裝[未登錄](méi)  回復(fù)  更多評(píng)論   

          2011-02-28 11:50 by @joe
          我們項(xiàng)目也一直再用,還行。
          主站蜘蛛池模板: 双柏县| 乌兰浩特市| 阿克| 田阳县| 彭山县| 浦北县| 馆陶县| 大连市| 永修县| 钟祥市| 师宗县| 江山市| 钟山县| 沁水县| 贡山| 瑞丽市| 吴忠市| 汉阴县| 贵阳市| 信宜市| 罗田县| 崇阳县| 闻喜县| 镇宁| 双流县| 九台市| 太谷县| 衡阳市| 和龙市| 玛曲县| 新余市| 石泉县| 平度市| 太白县| 巴彦县| 潜山县| 巴青县| 和硕县| 临江市| 中阳县| 盐城市|