zoukankan      html  css  js  c++  java
  • 一个相当好的自定义标签分页

    发现在系统中有好多写得很好的代码,也不知道是哪位前辈留下来的.整理一下...
    自定义分页标签库

    1:在配置文件中配置

    <!-- self Tag Library Descriptors -->
      
    <taglib>
        
    <taglib-uri>/WEB-INF/self-html.tld</taglib-uri>
        
    <taglib-location>/WEB-INF/self-html.tld</taglib-location>
      
    </taglib>


    2:在self-html.tld中page标签的配置

    <tag>
            
    <name>page</name>
            
    <tagclass>com.jbbis.netedu.common.util.taglib.PageTag</tagclass>
            
    <bodycontent>empty</bodycontent>
            
    <info>tag here</info>
            
    <attribute>
            
    <name>name</name>
            
    <required>true</required>
            
    <rtexprvalue>false</rtexprvalue>
            
    </attribute>    
            
    <attribute>
            
    <name>pageNum</name>
            
    <required>false</required>
            
    <rtexprvalue>false</rtexprvalue>
            
    </attribute>        
            
    <attribute>
            
    <name>method</name>
            
    <required>false</required>
            
    <rtexprvalue>false</rtexprvalue>
            
    </attribute>    
            
    <attribute>
            
    <name>methodValue</name>
            
    <required>false</required>
            
    <rtexprvalue>true</rtexprvalue>
            
    </attribute>    
            
    <attribute>
            
    <name>form</name>
            
    <required>true</required>
            
    <rtexprvalue>false</rtexprvalue>
            
    </attribute>        
            
    <attribute>
            
    <name>action</name>
            
    <required>flase</required>
            
    <rtexprvalue>true</rtexprvalue>
            
    </attribute>
            
    <attribute>
            
    <name>returnLevel</name>
            
    <required>flase</required>
            
    <rtexprvalue>true</rtexprvalue>
            
    </attribute>                                    
        
    </tag>


    其实从这儿也可以看到在PageTag文件中是一些什么值了...

    3:PageTag中的具体操作(精华全部在这儿啦)

    /*
     * Created on 2004-6-25
     *
     
    */

    package com.jbbis.netedu.common.util.taglib;

    import java.io.IOException;

    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.JspWriter;
    import javax.servlet.jsp.tagext.TagSupport;

    import com.jbbis.netedu.common.page.NullPage;
    import com.jbbis.netedu.common.page.Page;

    /**
     * 
    @author leo_deng
     *
     
    */

    public class PageTag extends TagSupport {
        

        
    /* (non-Javadoc)
         * @see javax.servlet.jsp.tagext.Tag#doStartTag()
         
    */

        
    private String name;
        
    private String pageNum="pageNum";
        
    private String method="method";
        
    private String methodValue;
        
    private String form="mainForm";
        
    private String action;
        
    private String returnLevel;
        
        
    private final int CONST_FIRST=1;
        
    private final int CONST_NEXT=2;
        
    private final int CONST_PRIOR=3;
        
    private final int CONST_LAST=4;
        
        
        
        
        
    public int doStartTag() throws JspException {
            
    // TODO Auto-generated method stub
            try{
                JspWriter out 
    = pageContext.getOut() ;
                Page page
    =(Page)pageContext.getRequest().getAttribute(name);
                
    if(page==null)
                    page
    =NullPage.instance();
                out.print(getHtml(page.getPageNumber(),page.getPageCount()));
                out.print(getJs(page.getPageNumber(),page.getPageCount()));
                
    //jspwriter是一个隐含对象,用于向jsp网页输出内容。输出的目标由
                
    // pagecontext.getout提供
                
                
    //向jsp网页上下文输出
              }
    catch(IOException ioException){
                
    throw new JspException(ioException.getMessage() );
              }
    //catch
              return(SKIP_BODY);
        }

        
    /*
         * <
         * <!--
         * function page_next(){
         *  form.action=""
         *     form.pageNum=""
         *     form.method.value=""
         *     form.submit;
         * 
         * }
         * function page_prior()
         * function page_first()
         * funciotn page_last()
         * 
         * //-->
         * <div class="listbox_page">
                <a class="page" ><img src="public/icon/first.gif" alt="首页" align="absmiddle" border="0" onclick="page_first()"/></a>
                <a class="page" ><img src="public/icon/previous.gif" alt="上页" align="absmiddle" border="0" onclick="page_first()"/></a>
                第<input class="page_number" name="pageNum" value="">    <img src="page_go.gif" class="page_go">页
                <a class="page" ><img src="public/icon/next.gif" alt="下页" align="absmiddle" border="0"/ onclick="page_next()"></a>
                <a class="page" ><img src="public/icon/last.gif" alt="末页" align="absmiddle" border="0"/ onclick="page_prior()"></a>
                共 <span class="page_sum">1000</span> 页 
            </div>
         *
         * 
    */

        
    private String getJs(int pageNum,int totalNum){
            StringBuffer sb
    =new StringBuffer();
            sb.append(
    "\n<script language=\"JavaScript\">\n<!--");
                sb.append(printFunction(
    "page_first",pageNum,totalNum,CONST_FIRST));
                sb.append(printFunction(
    "page_next",pageNum,totalNum,CONST_NEXT));
                sb.append(printFunction(
    "page_prior",pageNum,totalNum,CONST_PRIOR));
                sb.append(printFunction(
    "page_last",pageNum,totalNum,CONST_LAST));
                getGoJs(sb,pageNum,totalNum);
            sb.append(
    "\n //-->\n</script>");

            
    return sb.toString();
        }

        
    private void getGoJs(StringBuffer sb,int pageNum,int totalNum){
            sb.append(
    "function page_go(obj){\n");
            sb.append(
    "var page_number=document.getElementById(\"page_number\");\n");
            sb.append(
    "if( page_number.value != new Number(page_number.value))return alert(\"请输入正确的页数\");\n");
            sb.append(
    "if(page_number.value<1) page_number.value=1;if(page_number.value>");
            sb.append(totalNum);
            sb.append(
    ")page_number.value=");
            sb.append(totalNum);
            sb.append(
    ";\n");
            sb.append(
    "if(page_number.value!="+pageNum+")");
            sb.append(
    "submitForPageNum(obj);\n");
            sb.append(
    "}");
        }

        
    private StringBuffer printFunction(String function,int pageNumber,int totalNumber,int pageConst){
            StringBuffer sb
    =new StringBuffer();
            sb.append(
    "\nfunction "+function+"(){");
            sb.append(
    "\nevent.returnValue=false;");
            sb.append(printAction());
            sb.append(printMethod());
            
    //sb.append("\n"+this.form+".submit();\n}");
            if(totalNumber>1){
                
    switch(pageConst){
                    
    case CONST_FIRST:
                        
    if(pageNumber>1){
                            sb.append(printPageNum(String.valueOf(
    1)));
                            sb.append(
    "\n submitForPageNum("+this.form+");");
                        }

                        
    break;
                    
    case CONST_LAST:
                        
    if(pageNumber<totalNumber){
                            sb.append(printPageNum(String.valueOf(totalNumber)));
                            sb.append(
    "\n submitForPageNum("+this.form+");");
                        }

                        
    break;
                    
    case CONST_PRIOR:
                        
    if(pageNumber>1){
                            sb.append(printPageNum(String.valueOf(pageNumber
    -1)));
                            sb.append(
    "\n submitForPageNum("+this.form+");");
                        }

                        
    break;                        
                    
    case CONST_NEXT:
                        
    if(pageNumber<totalNumber){
                            sb.append(printPageNum(String.valueOf(pageNumber
    +1)));
                            sb.append(
    "\n submitForPageNum("+this.form+");");
                        }

                        
    break;
                }

            }

            
            sb.append(
    "\n}");
            
    return sb;        
        }

        
    /*
        private StringBuffer printFunction(String function,String pageNum,int pageConst){
            StringBuffer sb=new StringBuffer();
            sb.append("\nfunction "+function+"(){");
            sb.append("\nevent.returnValue=false;");
            sb.append(printAction());
            sb.append(printMethod());
            sb.append(printPageNum(pageNum));
            //sb.append("\n"+this.form+".submit();\n}");

                    
                    sb.append("\n submitForPageNum("+this.form+");\n}");

            
            sb.append("\n}");
            
            return sb;
        }
        
    */

        
    private String printAction(){
            
    if(this.action!=null)
                
    return ("\n"+this.form+".action=\""+action+"\";");
            
    else
                
    return "";
        }

        
    private String printMethod(){
            
    if(this.methodValue!=null)
                
    return ("\n"+this.form+"."+this.method+".value=\""+this.methodValue+"\";");
            
    else
                
    return "";
        }
        
        
    private String printPageNum(String num){
            
    return "\n"+this.form+"."+this.pageNum+".value=\""+num+"\";";
        }

        
    private String getHtml(int pageNum,int totalNum){
            StringBuffer sb
    =new StringBuffer();
            sb.append(
    "\n<a class=\"page\" href=\"javascript:void(0)\" onclick=\"page_first()\" ><img src=\"public/icon/first.gif\" alt=\"首页\" align=\"absmiddle\" border=\"0\" /></a>");
            sb.append(
    "\n<a class=\"page\" href='javascript:void(0)' onclick='page_prior()' ><img src=\"public/icon/previous.gif\" alt=\"上页\" align=\"absmiddle\" border=\"0\" /></a>");
            sb.append(
    "\n第<input id=\"page_number\" class=\"page_number\" name=\"pageNum\" value=\"");
            sb.append(String.valueOf(pageNum));
            sb.append(
    "\"><button class='page_go' onclick='page_go(this.form);'></button>页    ");
            //sb.append(""<img src=\"page_go.gif\" class=\"page_go\">");
            sb.append("\n<a class=\"page\" href=\"javascript:void(0)\" onclick=\"page_next()\"><img src=\"public/icon/next_page.gif\" alt=\"下页\" align=\"absmiddle\" border=\"0\"/></a>");
            sb.append(
    "\n<a class=\"page\" href=\"javascript:void(0)\" onclick=\"page_last()\"><img src=\"public/icon/last.gif\" alt=\"末页\" align=\"absmiddle\" border=\"0\"/></a>");
            sb.append(
    "\n共 <span class=\"page_sum\">");
            sb.append(String.valueOf(totalNum));
            sb.append(
    "</span> 页");
            
    return sb.toString();
        }


        
    /**
         * 
    @return Returns the pageNum.
         
    */

        
    public String getPageNum() {
            
    return pageNum;
        }

    ... ....(other getter and setter method ^_^)    
    }


    4:在JSP布面中导入:

    <%@ taglib uri="/WEB-INF/self-html.tld" prefix="netedu" %>


    5:在JSP页面中引用:

    <form name="newsForm" method="post" action="<%=request.getContextPath() %>/portal/newsAction.page" id="newsForm">
    <!-- TIP008:
      翻页部分
     
    -->
       
    <div class="listbox_page">
        
    <netedu:page name="page" form="newsForm" />
       
    </div>
    <!-- TIP008:END-->
     
    </form>


    6:page文件


    7:其它
    7.1
    可以注意到在标签的定义文件中用到了名为page_go的css层来美化界面,可能是出于满足不同用户对界面的不同要求所以在此没有对此css定义,你可以在JSP布面中重写此css.这儿有个可以参考一下.下载
    7.2
    根据标签的定义可以看到,此page应该放到form中.
    7.3
    根据在标签库中的

    Page page=(Page)pageContext.getRequest().getAttribute(name);

    语句,可见page应该在request.setAttribute("pageattribute",page);中定义.

    7.4
    如何通过对DB的操作得到了page ?通过DB操作可以获得一系统的data(应该注意到了在page文件夹中有个data属性,高人就是高人^_^),当然在得到这些data之前,先可能得进行一系统逻辑处理,比如说当前页码(pagenum),页长(pagesize)等等.通过这些数据就可以得到一个page实例了! ~ ~ : )

    ... ...

    上一个介绍里面主要讲到了分页标签的配置,逻辑处理,引用。
    我们在action中:

     // JSP中引用此attribute分页处理 
     

    request.setAttribute(
     " page " ,page);


    然后在JSP中引用此page。
    这次主要看如何能过对DB操作实现此page。

    处理逻辑:
    1:根据SQL语句,当前页面,页面大小等参数,得到一系统data。
    2:根据得到的data,再加上当前页面,页面大小可以实例化一个page类实体。
    3:将此实体转换成便于到前台显示的DTO。

    具体如下:

    首先,我们根据查询语句从DB中得到一系列相关数据

    ......

    Query query = getSession().createQuery(sql);
                setParams(query, paramNames, params);
                
    if (pageSize > -1{
                    query.setFirstResult(PageManager.getStartIndex(pageNumber,
                            totalCount, pageSize));
                    query.setMaxResults(pageSize);
                }

                List data 
    = doQuery(query);
                
                
    if (pageSize < 0{
                    totalCount 
    = data.size();
                }

    ......


    可以看到其中除了createQuery,setFirstResult,setMaxResults外其实都是用户自定义的一些函数。
    其它函数,顾名思义应该知道它想实现一个什么功能,象doQuery(query)就是得到一个结果集也许是得到一个按列表方式抽取结果集 query.list(),or 按迭代方式抽取结果集query.iterate().函数getStartIndex(args[])返回数据第一条记录的起点位置。其它的也都差不多!

    其次得到一个page的实体类(entity),或者说得到其DAO对象。
    其实得到一个DTO的page对象比较简单。前面列出了page,而上面已经从DB中得到了一系列数据(data),再加上页面的相关信息就可以实例化一个page实体了:

     .

     public  DefaultPage( int  pageSize,  int  pagesCount,  int  pageNumber, Collection data,
                         
     int  totalSize)  {
        
     this .pageSize  =  pageSize;
        
     this .pagesCount  =  pagesCount;
        
     this .pageNumber  =  pageNumber;
        
     this .totalSize  =  totalSize;
        
     this .data  =  data;
      }
     

     
     .


    当然在此前,对面页数据得处理一下,象pageNumber可能如下: 

     /** 
         * 
     @param  pageNumber
         * 
     @param  pageSize
         * 
     @param  totalCount
         * Return PageNumber
         
     */ 

         
     protected   static   int  calcPageNumber( int  pageNumber,  int  pageSize,  int  totalCount)  {
            
     int  maxPageNumber  =  calcMaxPageNumber(pageSize, totalCount);
            
            pageNumber 
     =  pageNumber > maxPageNumber ? maxPageNumber:pageNumber;
            
            
     if (pageNumber <= 0 )
                pageNumber
     = 1 ;
            
            
     return  pageNumber;
        }


    easy吧!

    最后将此实体转换成适合前台显示的DTO对象。
    这个侧是依据不同的需求去做相应的转换了,一般来说从DB取出来的实体(DAO)直接与DB中的数据对应。而在DTO中我们可以提供许多更加符合实际的字段与方法,使得我们的JSP页面显示更加得心应手!同时也避免了直与DB交互。它们之间的关系

    “一般人的标签我不看,高手写的东西真的值得借鉴,学习!”

  • 相关阅读:
    element 树形控件使用
    js粘贴图片并显示
    vue-element Tree树形控件通过id默认选中
    解决win10shift+右键显示在此处打开powershell而不是命令窗口的问题
    maven安装与配置
    解决dos窗口中文乱码问题
    vue单页面应用刷新网页后vuex的state数据丢失的解决方案
    vue 单个倒计时组件
    js将秒转换为时分秒
    vue3.0用vue-awesome-swiper
  • 原文地址:https://www.cnblogs.com/duanxz/p/2933538.html
Copyright © 2011-2022 走看看