Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 629|回复: 0

Jsp实现自定义标签分页

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-9-30 16:21:22 | 显示全部楼层 |阅读模式

      
       
       

       
       

       
      
      
      
       
             很少自己写分页标签,又不想用现成框架。所以自己参考了些资料,写了个分页例子测试了一下。
    (代码完整,可以参考。只是应该用jsp2.0规范)
              代码主要分为三个类:
         
         PageTag 分页标签类
         Page 分页bean
         Constant 设置常量  
         
             Page代码:
        /**
    *
    * @author byyang
    *
    */
    public class Page
    {
            private int current = 0;  //当前页,默认为第一页
            private int size;     //记录总数
            private int length;   //每页的长度
            private String url;   //访问路径
           
            public Page(int offset, int size, int length) {
                    super();
                    this.current = offset;
                    this.size = size;
                    this.length = length;
            }
           
            /**
             * 获取总页数
             * @return
             */
            public int pageCount(){
                    int pagecount = 0;
                    if(this.size % this.length == 0){
                            pagecount = this.size / this.length;
                    }else{
                            pagecount = this.size / this.length + 1;
                    }
                   
                    return pagecount;
            }
           
            //最后一页开始条数
            public int lastPageOffset(){
                    return this.size - lastPageSize();
            }
           
            //最后一页页大小
            public int lastPageSize(){
                    int lastpagesize = 0;
                    if(this.size % this.length == 0){
                            lastpagesize = this.length;
                    }else{
                            lastpagesize = this.size % this.length;
                    }
                    return lastpagesize;
            }
           
            //获取起始页
            public int getOffset() {
                    return current;
            }
            //总记录数
            public int getSize() {
                    return size;
            }
            //每页大小
            public int getLength() {
                    return length;
            }
            //获取访问路径
            public String getUrl() {
                    return url;
            }
           
            //上一页
            public int getLastOffset(){
                    int offset = this.getOffset() - this.getLength();
                    if(offset > 0){
                            return offset;
                    }else{
                            return 0;
                    }
                   
            }
            //下一页
            public int getNextOffset(){
                    int offset =  this.getOffset() + this.getLength();
                    if(offset > this.getSize()){
                            return getLastOffset();
                    }else{
                            return offset;
                    }
            }
           
            public String getPageNavigation(){
                    String pageNavigation = "";
                    return pageNavigation;
            }
            public void setOffset(int offset) {
                    this.current = offset;
            }
            public void setSize(int size) {
                    this.size = size;
            }
            public void setLength(int length) {
                    this.length = length;
            }
            public void setUrl(String url) {
                    this.url = url;
            }
    }[/pre]
          现在我们要实现PageTag标签类,自定义标签有两种实现TagSupport和SimpleTagSupport,两个都能实现这个功能,这个看个人选择了。
        import java.io.IOException;
    import javax.Servlet.http.HttpServletRequest;
    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.JspWriter;
    import javax.servlet.jsp.tagext.TagSupport;
    import com.byyang.util.Constants;
    /**
    *  doStartTag()和doEndTag()返回值处理:
    * SKIP_BODY (0) :跳过了开始和结束标签之间的代码。
    * EVAL_BODY_INCLUDE(1):将body的内容输出到存在的输出流中
    * SKIP_PAGE(5): 忽略剩下的页面。
    * EVAL_PAGE隐含(6):继续执行下面的页
    * @author yangby
    *
    */
    public class PageTag extends TagSupport{
      
       private String url;

       public String getUrl(){
         return this.url;
       }

       public void setUrl(String url) {
         this.url = url;
       }

       public int doEndTag()throws JspException{
         return EVAL_PAGE;
       }
      
    public int doStartTag() throws JspException{
         HttpServletRequest request = (HttpServletRequest)this.pageContext.getRequest();
         //获取分页bean
         Page page = (Page)request.getAttribute("pager");
         
         JspWriter out = this.pageContext.getOut();
         //拼接分页信息
         StringBuilder s = new StringBuilder();
         s.append("共 " + ((page.getSize() - 1) / page.getLength() + 1) + " 页   ");

         //设置当前页第一条记录索引
         String current = request.getParameter("current");
         if(current != null && !"".equals(current)){
          page.setOffset(Integer.parseInt(current));
         }
         if (page.getSize() > page.getLength()){
        //获取连接符pref
        String pref;
        if (this.url.indexOf("?") > -1){
        pref = "&";
        }else {
        pref = "?";
        }
        this.doStart(s, page, pref);
        this.doBody(s, page, pref);
        this.doEnd(s,page,pref);
         }else{
           s.append("    ");
         }
         s.append(" 共 " + page.getSize() + " 条记录");
         try{
           out.println(s.toString());
         }catch (IOException e){
           e.printStackTrace();
         }
         
         return SKIP_BODY;
       }

    /**
      * //拼接&quot;首页&quot;和&quot;<&quot;
      * @param s
      * @param page
      * @param pref
      */
    public void doStart(StringBuilder s,Page page,String pref){
           if (page.getOffset() > 0){
            s.append(&quot;<a href="&quot; + this.url + pref +
               &quot;current=0">[首页]</a>
    &quot; + &quot;<a href="&quot; + this.url + pref +
               &quot;current=&quot; + page.getLastOffset() + &quot;">[<]</a>
    &quot;);
           }else{
            s.append(&quot;<a href="&quot; + this.url + pref + &quot;current=0">[首页]</a>
    &quot; );
           }
    }

    /**
      * 拼接&quot;尾页&quot;和&quot;>&quot;
      * @param s
      * @param page
      * @param pref
      */
    public void doEnd(StringBuilder s,Page page,String pref){
    if (page.getOffset() < page.getSize() - page.getLength()) {
       s.append(&quot;<a href="&quot; + this.url + pref + &quot;current=&quot; + page.getNextOffset()
       + &quot;">[>]</a>
    &quot; + &quot;<a href="&quot; +
               this.url + pref + &quot;current=&quot; + page.lastPageOffset() + &quot;">[尾页]</a>
    &quot;);
           }else{
            s.append(&quot;
    &quot;+ &quot;<a href="&quot; +  this.url + pref +
                    &quot;current=&quot; + page.lastPageOffset() + &quot;">[尾页]</a>
    &quot;);
           }
    }

    /**
      * 数字连接
      * @param s
      * @param page
      * @param pref
      */
    public void doBody(StringBuilder s,Page page,String pref){
       //显示半径
           int radius = Constants.MAX_PAGE_INDEX / 2 * page.getLength();
          
           //显示数字的连接从第几条开始
           int startOffset;
           if ((page.getOffset() < radius) || (page.pageCount() <= Constants.MAX_PAGE_INDEX)){
            startOffset = 0;
           }else{
             if (page.getOffset() < page.getSize() - radius){
               startOffset = page.getOffset() - radius;
             }else{
               startOffset = (page.getSize() / page.getLength() - Constants.MAX_PAGE_INDEX) *
                 page.getLength();
             }
           }
           for (int i = startOffset; (i < page.getSize()) && (i < startOffset
               + Constants.MAX_PAGE_INDEX * page.getLength()); ){
             if (i == page.getOffset()){
               s.append(&quot;<b>&quot; + (i / page.getLength() + 1) + &quot;</b>
    &quot;);
             }else{
              s.append(&quot;<a href="&quot; + this.url + pref + &quot;current=&quot; + i +
                &quot;">&quot; + (i / page.getLength() + 1) + &quot;</a>
    &quot;);
             }
             i += page.getLength();
           }
    }
    }
                          [/pre]
        编写tld文件mypage.tld:  
        [pre]<?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?>
    <!DOCTYPE taglib PUBLIC &quot;-//Sun Microsystems,
    Inc.//DTD JSP Tag Library 1.2//EN&quot; &quot;http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd&quot;>
    <taglib>
            <tlib-version>2.5</tlib-version>
            <jsp-version>1.2</jsp-version>
            <short-name>mypage</short-name>
            <uri>        ag-page</uri>
            <tag>
                    <name>page</name>
                    <tag-class>com.byyang.tag.PageTag</tag-class>
                    <body-content>pg</body-content>
                    <attribute>
                            <name>url</name>
                            <required>true</required>
                            <rtexprvalue>true</rtexprvalue>
                    </attribute>
            </tag>
    </taglib>        [/pre]
           配置web.xml  
         <!-- 自定义标签 -->
    <jsp-config>
      <taglib>
        <taglib-uri>/tag-page</taglib-uri>
        <taglib-location>/WEB-INF/mypage.tld</taglib-location>
      </taglib>
    </jsp-config>[/pre]
        在jsp页面中添加如下代码:
        <%@ taglib uri=&quot;/tag-page&quot; prefix=&quot;pg&quot;%>[/pre]
        你可以放到一个公共jsp里面一块引。现在咱们可以测试一下了:
        在jsp页面代码:
        <div align=&quot;center&quot;>
      <h2>图书列表</h2>
      <table border=1>
       <s:iterator var=&quot;book&quot; status=&quot;index&quot; value=&quot;books&quot;>
        <s:if test=&quot;#index.odd == true&quot;>
        <tr style=&quot;background-color: yellow&quot;>   
        </s:if>
        <s:else>
        <tr>
        </s:else>
         <td align=&quot;right&quot;>图书名称:</td>
         <td align=&quot;left&quot;><s:property value=&quot;book&quot;/></td>
        </tr>
       </s:iterator>
      </table>
      <pg:page url=&quot;getBookList.action&quot;></pg:page>
    </div>
                          [/pre]
        Action中咱们设一个测试数据:
        public class BookAction extends BaseAction {

    private String[] books;
    private BookService bookService = new BookService();

    public String execute() throws Exception {
      
      setBooks(bookService.getBookList());
      Page page = new Page(1,65,5);
      request.setAttribute(&quot;pager&quot;, page);
      
      return SUCCESS;

    }
    public String[] getBooks() {
      return books;
    }
    public void setBooks(String[] books) {
      this.books = books;
    }
    }
                          [/pre]
         好的,接下来启动tomcat,查看页面效果.
          
       

       
         
         
          
          

            
          

            
          
         
       

      
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-18 10:22 , Processed in 0.474874 second(s), 48 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表