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入门到精通教程
查看: 456|回复: 0

[JSTL学习]详细讲解自定义分页标签实例

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

    [LV.1]初来乍到

    发表于 2014-10-28 23:55:59 | 显示全部楼层 |阅读模式
    我们先分析一下分页标签的需求:


       
         
        用自定义标签实现分页
    如果我们要写出分页标签,最少我们要有三个变量,

    curPage//当前页 --也就是说现在用户正在浏览第几页.
    total //总记录数 -- 我们从数据库得到的总记录数
    PAGE_SIZE//页大小 --也就是说每页我们用来显示多少数据,这一般是常量,有时在Servlet指定,有时在properties文件里读取.
    总页数=total/PAGE_SIZE+1

    有了上面的数据,那么实现上面图片的需求应该就没有问题了.
    首页 -- 把当前页设为1;
    上一页--把当前页-1,如果当前页小于1则当前页还是为1;
    下一页--把当前页+1,如果当前页大于总页数,当前页不变
    末页--把当前页设为总页数

    显示最近的9个页面-- 把(当前页-4)到(当前页+4)的页码显示出来.
    指定跳转 -- 把当前页设为指定的页数.如果指定页数小于1,则为1,如果大于总页数,则为总页数

        其实,我们分页标签的主要目的就是把我们的数据分成N页,并方便用户快速访问自己需要的页面,也就是说,告诉接受处理显示数据的Serlvet,他要负责处理显示的那一页的数据(也就是我们上面提到的当前页).具体实现的语句很简单,在这里,假设处理数据的Servlet的名字叫做PageSerlvet,那么我们通过Get方法显示传参访问PageSerlvet,语句为:PageSerlvet?curpage=当前页

    上面我们讲了很多的业务处理方式,现在提下自定义标签.如果你根本不会写自定义标签的话,那么你先找点浅的例子,这个例子不适合学习自定义标签~

    用标签来实现以上的需求,我们必须得到我们要得到的三个参数(curPage,total,PAGE_SZIE),当然,用过自定义标签的朋友都知道,用标签属性来传是最好的!那么,我们确定了用属性来传参,就不要用到标签体,所以,处理分页标签问题,我们还是用TagSupport来解决分页标签.

    下面,是我们的标签处理类:PageTag.java

    public class PageTag extends TagSupport {
    /**
       * 当前页
       */
    private String curPage;

    /**
       * 总页数
       */
    private String totalPage;

    /**
       * 页大小(一页显示的大小)
       */
    private String pageSize;

      
    public void setCurPage(String curPage) {
       this.curPage = curPage;
    }

      
    public void setPageSize(String pageSize) {
       this.pageSize = pageSize;

    public void setTotalPage(String totalPage) {
       this.totalPage = totalPage;
    }

    @Override
    public int doStartTag() throws JspException {
       JspWriter out = pageContext.getOut();
       // 得到分页后的页数,(总页数/页大小)+1
       
    if (pageSize == null || pageSize == "") {
       pageSize = "1";
       }

       int pageNumber = (Integer.parseInt(totalPage) / Integer
         .parseInt(pageSize));

       if (Integer.parseInt(curPage) > pageNumber) {
       curPage = String.valueOf(pageNumber);
       }

       if (Integer.parseInt(curPage) < 1) {
       curPage = "1";
       }

       // 显示给用户操作的页面开始端
       int start = Integer.parseInt(curPage) - 4;

       // 显示给用户操作的页面结束端
       int end = Integer.parseInt(curPage) + 4;

       // 特殊情况处理(开始端小于0)
       if ((Integer.parseInt(curPage) - 4) <= 0) {
       start = 1;
       }
       // 特殊情况处理(结束端大于总页数)
       if ((Integer.parseInt(curPage) + 4) > pageNumber) {
       end = pageNumber;
       }


      try {
       out
         .print("<form action="bbs/SubjectListServlet"><table align=center><tr height=10 align=justify ><td width=100>");
       out
         .print("<a href="bbs/SubjectListServlet?curpage=1">[首页]</a>  <a href="bbs/SubjectListServlet?curpage="
           + (((Integer.parseInt(curPage) - 1) == 0) ? curPage
             : (Integer.parseInt(curPage) - 1))
           + "">[上一页]</a></td><td width=180 align=center>");
       for (int i = start; i <= end; i++) {
         if(i != Integer.parseInt(curPage)){
         out.print("<a href="bbs/SubjectListServlet?curpage=" + i + "">["
           + i + "]</a>  ");
         }else{
         out.print("<b>"+i+"</b>  ");
         }
         
       }
       out
         .print("</td><td width=100><a href="bbs/SubjectListServlet?curpage="
           + (((Integer.parseInt(curPage) + 1) > pageNumber) ? curPage
             : (Integer.parseInt(curPage) + 1))
           + "">[下一页]</a>  <a href="bbs/SubjectListServlet?curpage="
           + pageNumber + "">[末页]</a>");
       out
         .print("</td><td width=100><input name="curpage" style="width:22px;height:22px;" /><input type=submit value=go /></td></tr></table></form>");
       } catch (IOException e) {
       e.printStackTrace();
       }

      return super.doStartTag();
    }
    }


    也许看上去比较复杂,但是大家是否还记得在Serlvet里面输出HTML代码的例子,我们学Servlet的时候都是这么过来的, 虽然现在不推荐在java类里再写HTML语法, 但是分页标签就是用的这种理念去实现的,有点像include.

    上面的代码一共分三总色.紫色主要是初始代标签属性,因为我们在用标签时,他会自己调用setter方法给属性传值.红色为doStartTag()方法.主要是输出我们想要的格式.在红色中有一块蓝色的代码.那都是给属性在特殊情况下赋初值.

    下面是tag的tld文件.记住.这个文件一定要放在WEB-INF/tlds目录下.tlds是默认不存在的,手动创建!
    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <taglib 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/j2eehttp://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    <description>My Taglib For Holle Word!</description>
    <tlib-version>1.0</tlib-version>
    <short-name>page</short-name>
    <uri></uri>
    <tag>
       <name>outpage</name>
       <tag-class>com.tag.PageTag</tag-class>
       <body-content>JSP</body-content>
       <attribute>
       <name>curPage</name>
       <required>true</required>
       <rtexprvalue>true</rtexprvalue>
       <type>java.lang.String</type>
       </attribute>
       <attribute>
       <name>totalPage</name>
       <required>true</required>
       <rtexprvalue>true</rtexprvalue>
       <type>java.lang.String</type>
       </attribute>
       <attribute>
       <name>pageSize</name>
       <required>true</required>
       <rtexprvalue>true</rtexprvalue>
       <type>java.lang.String</type>
       </attribute>
    </tag>

    </taglib>


    一个attribute表示定义一个属性.
    name -属性名
    required-是否为空
    rtexprvalue-是不能用EL语言或表达式(这个是个人理解,因为我如果不加这对标签,那我就用不了EL给属性赋值)
    type-属性类型

    然后你就在你要用的JSP页面上加上
    <%@ taglib prefix="page" uri="/WEB-INF/tlds/pageTag.tld" %>

    <page:outpage pageSize="" totalPage="" curPage=""></page:outpage>

    如果你在测试的时候你可以不用EL语言测试,直接给值就可以了.比如写成
    <page:outpage pageSize="10" totalPage="270" curPage="9"></page:outpage>
    这样.显示出来的效果为:



       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/10/28/235559265.zip
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-2-26 04:24 , Processed in 0.369349 second(s), 52 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

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