一个相当好的自定义标签---分页

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

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" οnclick="page_first()"/></a>
            <a class="page" ><img src="public/icon/previous.gif" alt="上页" align="absmiddle" border="0" οnclick="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"/ οnclick="page_next()"></a>
            <a class="page" ><img src="public/icon/last.gif" alt="末页" align="absmiddle" border="0"/ οnclick="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)\" οnclick=\"page_first()\" ><img src=\"public/icon/first.gif\" alt=\"首页\" align=\"absmiddle\" border=\"0\" /></a>");
        sb.append("\n<a class=\"page\" href='javascript:void(0)' οnclick='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)\" οnclick=\"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)\" οnclick=\"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交互。它们之间的关系

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值