分页标签的使用和配置(手动狗头)

今天去找了分页标签的使用,发现和老师上课发的差不多,然后我就配置一下,顺手写一个小文章吧,希望对各位看官有所帮助。

新建一个PageModel类

public class PageModel {
    /*当前页码*/
    private int pageIndex;
    /*页面大小*/
    private int pageSize = 4;
    /*总页数*/
    private int totalSize;
    /*总记录数*/
    private int recordCount;

    public int getPageIndex() {
        return pageIndex;
    }

    public void setPageIndex(int pageIndex) {
        this.pageIndex = pageIndex;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
    /*总页数的获取用总记录数和页面大小计算所得*/
    public int getTotalSize() {
        if (recordCount%pageSize == 0){
            totalSize = recordCount/pageSize;
        }else{
            totalSize = recordCount/pageSize + 1;
        }
        return totalSize;
    }

    /*public void setTotalSize(int totalSize) {
        this.totalSize = totalSize;
    }*/

    public int getRecordCount() {
        return recordCount;
    }

    public void setRecordCount(int recordCount) {
        this.recordCount = recordCount;
    }
    /*起始的行坐标*/
    public int getFirstLimitParam(){
        return (this.getPageIndex() - 1) * this.pageSize;
    }
}

页面大小和起始行条数主要是limit语句的使用

select *from user
Limit #{pageModel.firstLimitParam},#{pageModel.pageSize}

limit 0,5 就是所查到数据的前五条数据记录

PageTag类的建立

这段代码超级长,我也咩仔细看,当时老师也是直接导入直接用的,有点长,这个类继承了一个普通标签栏,这个真的长要是记得话也不好记,通过我敏锐的观察发现,这个应该和URl的地址的跳转还有一些前台的显示有点关系,感兴趣的可以仔细看看,也可以直接用
这个的话要导入jsp-apij的ar包

<dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>jsp-api</artifactId>
          <version>2.0</version>
          <scope>provided</scope>
</dependency>
public class PageTag extends SimpleTagSupport {
    /** 定义请求URL中的占位符常量 */
    private static final String TAG = "{0}";

    /** 当前页码 */
    private int pageIndex;
    /** 每页显示的数量 */
    private int pageSize;
    /** 总记录条数 */
    private int recordCount;
    /** 请求URL page.action?pageIndex={0}*/
    private String submitUrl;
    /** 样式 */
    private String style = "sabrosus";

    /** 定义总页数 */
    private int totalPage = 0;

    /**  在页面上引用自定义标签就会触发一个标签处理类   */
    @Override
    public void doTag() throws JspException, IOException {
        /** 定义它拼接是终的结果 */
        StringBuilder res = new StringBuilder();
        /** 定义它拼接中间的页码 */
        StringBuilder str = new StringBuilder();
        /** 判断总记录条数 */
        if (recordCount > 0){   //1499 / 15  = 100
            /** 需要显示分页标签,计算出总页数 需要分多少页 */
            totalPage = (this.recordCount - 1) / this.pageSize + 1;

            /** 判断上一页或下一页需不需要加a标签 */
            if (this.pageIndex == 1){ // 首页
                str.append("<span class='disabled'>上一页</span>");

                /** 计算中间的页码 */
                this.calcPage(str);

                /** 下一页需不需要a标签 */
                if (this.pageIndex == totalPage){
                    /** 只有一页 */
                    str.append("<span class='disabled'>下一页</span>");
                }else{
                    String tempUrl = this.submitUrl.replace(TAG, String.valueOf(pageIndex + 1));
                    str.append("<a href='"+ tempUrl +"'>下一页</a>");
                }
            }else if (this.pageIndex == totalPage){ // 尾页
                String tempUrl = this.submitUrl.replace(TAG, String.valueOf(pageIndex - 1));
                str.append("<a href='"+ tempUrl +"'>上一页</a>");

                /** 计算中间的页码 */
                this.calcPage(str);

                str.append("<span class='disabled'>下一页</span>");
            }else{ // 中间
                String tempUrl = this.submitUrl.replace(TAG, String.valueOf(pageIndex - 1));
                str.append("<a href='"+ tempUrl +"'>上一页</a>");

                /** 计算中间的页码 */
                this.calcPage(str);

                tempUrl = this.submitUrl.replace(TAG, String.valueOf(pageIndex + 1));
                str.append("<a href='"+ tempUrl +"'>下一页</a>");
            }

            /** 拼接其它的信息 */
            res.append("<table width='100%' align='center' style='font-size:13px;' class='"+ style +"'>");
            res.append("<tr><td style='COLOR: #0061de; MARGIN-RIGHT: 3px; PADDING-TOP: 2px; TEXT-DECORATION: none'>" + str.toString());
            res.append("&nbsp;跳转到&nbsp;&nbsp;<input style='text-align: center;BORDER-RIGHT: #aaaadd 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #aaaadd 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 2px; MARGIN: 2px; BORDER-LEFT: #aaaadd 1px solid; COLOR: #000099; PADDING-TOP: 2px; BORDER-BOTTOM: #aaaadd 1px solid; TEXT-DECORATION: none' type='text' size='2' id='pager_jump_page_size'/>");
            res.append("&nbsp;<input type='button' style='text-align: center;BORDER-RIGHT: #dedfde 1px solid; PADDING-RIGHT: 6px; BACKGROUND-POSITION: 50% bottom; BORDER-TOP: #dedfde 1px solid; PADDING-LEFT: 6px; PADDING-BOTTOM: 2px; BORDER-LEFT: #dedfde 1px solid; COLOR: #0061de; MARGIN-RIGHT: 3px; PADDING-TOP: 2px; BORDER-BOTTOM: #dedfde 1px solid; TEXT-DECORATION: none' value='确定' id='pager_jump_btn'/>");
            res.append("</td></tr>");
            res.append("<tr align='center'><td style='font-size:13px;'><tr><td style='COLOR: #0061de; MARGIN-RIGHT: 3px; PADDING-TOP: 2px; TEXT-DECORATION: none'>");
            /** 开始条数 */
            int startNum = (this.pageIndex - 1) * this.pageSize + 1;
            /** 结束条数 */
            int endNum = (this.pageIndex == this.totalPage) ? this.recordCount : this.pageIndex * this.pageSize;

            res.append("总共<font color='red'>"+ this.recordCount +"</font>条记录,当前显示"+ startNum +"-"+ endNum +"条记录。");
            res.append("</td></tr>");
            res.append("</table>");
            res.append("<script type='text/javascript'>");
            res.append("   document.getElementById('pager_jump_btn').onclick = function(){");
            res.append("      var page_size = document.getElementById('pager_jump_page_size').value;");
            res.append("      if (!/^[1-9]\\d*$/.test(page_size) || page_size < 1 || page_size > "+ this.totalPage +"){");
            res.append("          alert('请输入[1-"+ this.totalPage +"]之间的页码!');");
            res.append("      }else{");
            res.append("         var submit_url = '" + this.submitUrl + "';");
            res.append("         window.location = submit_url.replace('"+ TAG +"', page_size);");
            res.append("      }");
            res.append("}");
            res.append("</script>");


        }else{
            res.append("<table align='center' style='font-size:13px;'><tr><td style='COLOR: #0061de; MARGIN-RIGHT: 3px; PADDING-TOP: 2px; TEXT-DECORATION: none'>总共<font color='red'>0</font>条记录,当前显示0-0条记录。</td></tr></table>");
        }
        this.getJspContext().getOut().print(res.toString());
    }


    /** 计算中间页码的方法 */
    private void calcPage(StringBuilder str) {
        /** 判断总页数 */
        if (this.totalPage <= 11){
            /** 一次性显示全部的页码 */
            for (int i = 1; i <= this.totalPage; i++){
                if (this.pageIndex == i){
                    /** 当前页码 */
                    str.append("<span class='current'>"+ i +"</span>");
                }else{
                    String tempUrl = this.submitUrl.replace(TAG, String.valueOf(i));
                    str.append("<a href='"+ tempUrl +"'>"+ i +"</a>");
                }
            }
        }else{
            /** 靠近首页 */
            if (this.pageIndex <= 8){
                for (int i = 1; i <= 10; i++){
                    if (this.pageIndex == i){
                        /** 当前页码 */
                        str.append("<span class='current'>"+ i +"</span>");
                    }else{
                        String tempUrl = this.submitUrl.replace(TAG, String.valueOf(i));
                        str.append("<a href='"+ tempUrl +"'>"+ i +"</a>");
                    }
                }
                str.append("...");
                String tempUrl = this.submitUrl.replace(TAG, String.valueOf(this.totalPage));
                str.append("<a href='"+ tempUrl +"'>"+ this.totalPage +"</a>");
            }
            /** 靠近尾页 */
            else if (this.pageIndex + 8 >= this.totalPage){
                String tempUrl = this.submitUrl.replace(TAG, String.valueOf(1));
                str.append("<a href='"+ tempUrl +"'>1</a>");
                str.append("...");

                for (int i = this.totalPage - 10; i <= this.totalPage; i++){
                    if (this.pageIndex == i){
                        /** 当前页码 */
                        str.append("<span class='current'>"+ i +"</span>");
                    }else{
                        tempUrl = this.submitUrl.replace(TAG, String.valueOf(i));
                        str.append("<a href='"+ tempUrl +"'>"+ i +"</a>");
                    }
                }
            }
            /** 在中间 */
            else{
                String tempUrl = this.submitUrl.replace(TAG, String.valueOf(1));
                str.append("<a href='"+ tempUrl +"'>1</a>");
                str.append("...");

                for (int i = this.pageIndex - 4; i <= this.pageIndex + 4; i++){
                    if (this.pageIndex == i){
                        /** 当前页码 */
                        str.append("<span class='current'>"+ i +"</span>");
                    }else{
                        tempUrl = this.submitUrl.replace(TAG, String.valueOf(i));
                        str.append("<a href='"+ tempUrl +"'>"+ i +"</a>");
                    }
                }

                str.append("...");
                tempUrl = this.submitUrl.replace(TAG, String.valueOf(this.totalPage));
                str.append("<a href='"+ tempUrl +"'>"+ this.totalPage +"</a>");
            }
        }
    }

    /** setter 方法 */
    public void setPageIndex(int pageIndex) {
        this.pageIndex = pageIndex;
    }
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
    public void setRecordCount(int recordCount) {
        this.recordCount = recordCount;
    }
    public void setSubmitUrl(String submitUrl) {
        this.submitUrl = submitUrl;
    }
    public void setStyle(String style) {
        this.style = style;
    }
}

page.tid的使用

这个tld我找到一个比较详细的解释,这里就来引用了一下
TLD术语解释:标签库描述文件. 如要在JSP页面中实现JSP标签,必须首先定义实现标签的类,然后在标签库描述文件(TLD)中将写好的类映射成jsp标签,最后在JSP文件中使用定义好的标签,就可以生成动态的JSP内容.
比如,我自定义一个out标签,用tld文件描述.
————————————————
版权声明:本文为CSDN博主「盖世小可爱」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qqqnzhky/article/details/80563823
这个文档我放在了WEB-INF目录下
这个hc的话就是自定义的方便在jsp页面引用
在这里插入图片描述
在这里插入图片描述
这个就是写成我们PageTag类所在的位置
这个就是写成我们PageTag类所在的位置

<?xml version="1.0" encoding="utf-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    					http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
   						version="2.1">
   
  <!-- 描述 自定义标签版本的一种描述 --> 
  <description>Pager 1.0 core library</description>
  <!-- 显示的名称 导包进行的一个展示 -->
  <display-name>Pager core</display-name>
  <!-- 版本号 -->
  <tlib-version>1.0</tlib-version>
  <!-- 短名 -->
  <short-name>fkjava</short-name>
  <!-- uri :导包 -->
  <uri>http://hc.pager-tags</uri>
  
  <!-- 定义一个标签 -->
  <tag>
  		<!-- 标签名 -->
  		<name>pager</name>
  		<!-- 标签处理类 -->
  		<tag-class>com.hrm.utils.PageTag</tag-class>
  		<!-- 设置标签为空 -->
  		<body-content>empty</body-content>
  		
  		<!-- 定义标签的属性 -->
  		<attribute>
  			<!-- 属性名 表示分页的第几页 -->
  			<name>pageIndex</name>
  			<!-- 必须的 -->
  			<required>true</required>
  			<!-- run time expression value 为true支持EL表达式 -->
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  		
  		<!-- 定义标签的属性 -->
  		<attribute>
  			<!-- 属性名 表示分页标签 ,每页显示多少条数据 -->
  			<name>pageSize</name>
  			<!-- 必须的 -->
  			<required>true</required>
  			<!-- run time expression value 为true支持EL表达式 -->
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  		<!-- 定义标签的属性 -->
  		<attribute>
  			<!-- 属性名  记录分页的总数 -->
  			<name>recordCount</name>
  			<!-- 必须的 -->
  			<required>true</required>
  			<!-- run time expression value 为true支持EL表达式 -->
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  		<!-- 定义标签的属性 -->
  		<attribute>
  			<!-- 属性名 -->
  			<name>submitUrl</name>
  			<!-- 必须的 -->
  			<required>true</required>
  			<!-- run time expression value 为true支持EL表达式 -->
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  		<!-- 定义标签的属性 -->
  		<attribute>
  			<!-- 属性名 -->
  			<name>style</name>
  			<!-- 必须的 -->
  			<required>false</required>
  			<!-- run time expression value 为true支持EL表达式 -->
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  </tag>
</taglib>

controller层的使用

使用的话我要先从页面获取到起始页也就是pageIndex这里我们设置了默认值“1”,然后使用service层方法给PageModel类的每个属性进行赋值,使用service层方法对总记录数进行查询然后赋值给recordCount,查询数据的话要把PageModel和查询条件给传过去,因为SQL语句的limit要根据PageModel中的PageIndex和PageSize对查询数据进行截取记录
这就是limit的效果
在这里插入图片描述

 @RequestMapping("/findUser")
    public String findUser(@RequestParam(defaultValue = "1") int pageIndex, User user,Model model){
        PageModel pageModel = new PageModel();
        pageModel.setPageIndex(pageIndex);
        int recordCount = userService.findUserCount(user);
        pageModel.setRecordCount(recordCount);
        model.addAttribute("pageModel",pageModel);
        List <User> users = userService.findUser(user,pageModel);
        model.addAttribute("users",users);
        model.addAttribute("user",user);
        return "/jsp/user/user.jsp";
    }

jsp的使用

首先和C标签一样都要引用

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="f" %>
<%@taglib prefix="hc" uri="http://hc.pager-tags" %>

一共四个属性
前三个属性从Controller处理时model添加的PageModel中获取就行
然后提交地址的话就是我们的查询地址并把参数个传过去
pageIndex的值传{0}就行他会自己加减,在PageTag中有定义

<tr valign="top">
		  <td align="center" class="font3">
		  <hc:pager pageIndex="${pageModel.pageIndex}"
					pageSize="${pageModel.pageSize}"
					recordCount="${pageModel.recordCount}"
					submitUrl="${pageContext.request.contextPath}/user/findUser?pageIndex={0}&username=${user.username}&status=${user.status}">

		  </hc:pager>
	  	</td>
	  </tr>

显示结果

在这里插入图片描述
在这里插入图片描述
重新把老师给的标签走了一遍,理解了当时不清楚的属性,学到了很多,对这个标签的使用更加熟练(感觉在写项目总结可能习惯了)
然后小伙伴们可以试一下,有问题可以问我,我现在基本都在线,不是查BUG,就是查一些用法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值