<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    基于SSH+pager-taglib的分頁封裝

    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上的分頁代碼如下:
            共&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}">首頁</a>
            
    </pg:first>
            
    <pg:prev>
                
    <href="${pageUrl}">上頁</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}">下頁</a>
            
    </pg:next>
            
    <pg:last>
                
    <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這個頁碼指定的那一頁的最后一行的索引值

    Feedback

    # re: 基于SSH+pager-taglib的分頁封裝  回復  更多評論   

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

    # re: 基于SSH+pager-taglib的分頁封裝  回復  更多評論   

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

    # re: 基于SSH+pager-taglib的分頁封裝  回復  更多評論   

    2011-02-28 09:29 by vle
    @@joe
    中文參數參數肯定會出現亂碼,有幾種方法,1,更改tomcat server.xml配置文件 2 改分頁插件的class 3 增加過濾器

    # re: 基于SSH+pager-taglib的分頁封裝  回復  更多評論   

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

    # re: 基于SSH+pager-taglib的分頁封裝[未登錄]  回復  更多評論   

    2011-02-28 11:50 by @joe
    我們項目也一直再用,還行。
    主站蜘蛛池模板: eeuss影院免费92242部| 亚洲成AV人片久久| 狠狠入ady亚洲精品| 九九九精品成人免费视频| 亚洲精品一区二区三区四区乱码| 久久午夜免费鲁丝片| 亚洲第一中文字幕| 91青青青国产在观免费影视| 亚洲视频在线观看| 久视频精品免费观看99| 亚洲制服丝袜在线播放| 毛片免费在线视频| 美女无遮挡免费视频网站| 亚洲成a人片在线观看久| 国产精品美女久久久免费| 亚洲AV午夜成人影院老师机影院| 久久成人免费大片| 亚洲国产精品成人精品软件| 在线看片免费不卡人成视频 | 无码日韩人妻av一区免费| 色老板亚洲视频免在线观| 黄网址在线永久免费观看 | 黄色网页免费观看| 国产日产亚洲系列最新| 最近免费中文字幕MV在线视频3| 亚洲第一福利网站| 成人免费无码大片a毛片| 麻豆91免费视频| 亚洲AV无码成人精品区蜜桃| 免费专区丝袜脚调教视频| 亚洲AV日韩综合一区| 中文字幕亚洲电影| 亚欧色视频在线观看免费| 亚洲AV无码之国产精品| 在线观看国产区亚洲一区成人| 一区二区三区观看免费中文视频在线播放 | 7777久久亚洲中文字幕| 午夜国产羞羞视频免费网站| 在线观看片免费人成视频无码| 亚洲国产成人久久综合一区| 又粗又黄又猛又爽大片免费|