Java实现标签分页

最近为了开发一个网站,里面要用分页功能,但是之前很少自己写分页标签,又不想用现成框架。所以自己参考了些资料,写了个分页例子测试了一下。

代码主要分为三个类:

  1. PageTag 分页标签类
  2. Page 分页bean
  3. Constant 设置常量

Page代码:

  1. /**
  2. *
  3. * @author byyang
  4. *
  5. */
  6. public class Page
  7. {
  8. private int current = 0;  //当前页,默认为第一页
  9. private int size;     //记录总数
  10. private int length;   //每页的长度
  11. private String url;   //访问路径
  12. public Page(int offset, int size, int length) {
  13. super();
  14. this.current = offset;
  15. this.size = size;
  16. this.length = length;
  17. }
  18. /**
  19. * 获取总页数
  20. * @return
  21. */
  22. public int pageCount(){
  23. int pagecount = 0;
  24. if(this.size % this.length == 0){
  25. pagecount = this.size / this.length;
  26. }else{
  27. pagecount = this.size / this.length + 1;
  28. }
  29. return pagecount;
  30. }
  31. //最后一页开始条数
  32. public int lastPageOffset(){
  33. return this.size - lastPageSize();
  34. }
  35. //最后一页页大小
  36. public int lastPageSize(){
  37. int lastpagesize = 0;
  38. if(this.size % this.length == 0){
  39. lastpagesize = this.length;
  40. }else{
  41. lastpagesize = this.size % this.length;
  42. }
  43. return lastpagesize;
  44. }
  45. //获取起始页
  46. public int getOffset() {
  47. return current;
  48. }
  49. //总记录数
  50. public int getSize() {
  51. return size;
  52. }
  53. //每页大小
  54. public int getLength() {
  55. return length;
  56. }
  57. //获取访问路径
  58. public String getUrl() {
  59. return url;
  60. }
  61. //上一页
  62. public int getLastOffset(){
  63. int offset = this.getOffset() - this.getLength();
  64. if(offset > 0){
  65. return offset;
  66. }else{
  67. return 0;
  68. }
  69. }
  70. //下一页
  71. public int getNextOffset(){
  72. int offset =  this.getOffset() + this.getLength();
  73. if(offset > this.getSize()){
  74. return getLastOffset();
  75. }else{
  76. return offset;
  77. }
  78. }
  79. public String getPageNavigation(){
  80. String pageNavigation = "";
  81. return pageNavigation;
  82. }
  83. public void setOffset(int offset) {
  84. this.current = offset;
  85. }
  86. public void setSize(int size) {
  87. this.size = size;
  88. }
  89. public void setLength(int length) {
  90. this.length = length;
  91. }
  92. public void setUrl(String url) {
  93. this.url = url;
  94. }
  95. }

现在我们要实现PageTag标签类,自定义标签有两种实现TagSupport和SimpleTagSupport,两个都能实现这个功能,这个看个人选择了。

  1. import java.io.IOException;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.jsp.JspException;
  4. import javax.servlet.jsp.JspWriter;
  5. import javax.servlet.jsp.tagext.TagSupport;
  6. import com.byyang.util.Constants;
  7. /**
  8. *  doStartTag()和doEndTag()返回值处理:
  9. * SKIP_BODY (0) :跳过了开始和结束标签之间的代码。
  10. * EVAL_BODY_INCLUDE(1):将body的内容输出到存在的输出流中
  11. * SKIP_PAGE(5): 忽略剩下的页面。
  12. * EVAL_PAGE隐含(6):继续执行下面的页
  13. * @author yangby
  14. *
  15. */
  16. public class PageTag extends TagSupport{
  17. private String url;
  18. public String getUrl(){
  19. return this.url;
  20. }
  21. public void setUrl(String url) {
  22. this.url = url;
  23. }
  24. public int doEndTag()throws JspException{
  25. return EVAL_PAGE;
  26. }
  27. public int doStartTag() throws JspException{
  28. HttpServletRequest request = (HttpServletRequest)this.pageContext.getRequest();
  29. //获取分页bean
  30. Page page = (Page)request.getAttribute("pager");
  31. JspWriter out = this.pageContext.getOut();
  32. //拼接分页信息
  33. StringBuilder s = new StringBuilder();
  34. s.append("共 " + ((page.getSize() - 1) / page.getLength() + 1) + " 页   ");
  35. //设置当前页第一条记录索引
  36. String current = request.getParameter("current");
  37. if(current != null && !"".equals(current)){
  38. page.setOffset(Integer.parseInt(current));
  39. }
  40. if (page.getSize() > page.getLength()){
  41. //获取连接符pref
  42. String pref;
  43. if (this.url.indexOf("?") > -1){
  44. pref = "&";
  45. }else {
  46. pref = "?";
  47. }
  48. this.doStart(s, page, pref);
  49. this.doBody(s, page, pref);
  50. this.doEnd(s,page,pref);
  51. }else{
  52. s.append("    ");
  53. }
  54. s.append(" 共 " + page.getSize() + " 条记录");
  55. try{
  56. out.println(s.toString());
  57. }catch (IOException e){
  58. e.printStackTrace();
  59. }
  60. return SKIP_BODY;
  61. }
  62. /**
  63. * //拼接"首页"和"<"
  64. * @param s
  65. * @param page
  66. * @param pref
  67. */
  68. public void doStart(StringBuilder s,Page page,String pref){
  69. if (page.getOffset() > 0){
  70. s.append("<a href='" + this.url + pref +
  71. "current=0'>[首页]</a>\n" + "<a href='" + this.url + pref +
  72. "current=" + page.getLastOffset() + "'>[<]</a>\n");
  73. }else{
  74. s.append("<a href='" + this.url + pref + "current=0'>[首页]</a>\n" );
  75. }
  76. }
  77. /**
  78. * 拼接"尾页"和">"
  79. * @param s
  80. * @param page
  81. * @param pref
  82. */
  83. public void doEnd(StringBuilder s,Page page,String pref){
  84. if (page.getOffset() < page.getSize() - page.getLength()) {
  85. s.append("<a href='" + this.url + pref + "current=" + page.getNextOffset() + "'>[>]</a>\n" + "<a href='" +
  86. this.url + pref + "current=" + page.lastPageOffset() +
  87. "'>[尾页]</a>\n");
  88. }else{
  89. s.append("\n"+ "<a href='" +  this.url + pref + "current=" + page.lastPageOffset() + "'>[尾页]</a>\n");
  90. }
  91. }
  92. /**
  93. * 数字连接
  94. * @param s
  95. * @param page
  96. * @param pref
  97. */
  98. public void doBody(StringBuilder s,Page page,String pref){
  99. //显示半径
  100. int radius = Constants.MAX_PAGE_INDEX / 2 * page.getLength();
  101. //显示数字的连接从第几条开始
  102. int startOffset;
  103. if ((page.getOffset() < radius) || (page.pageCount() <= Constants.MAX_PAGE_INDEX)){
  104. startOffset = 0;
  105. }else{
  106. if (page.getOffset() < page.getSize() - radius){
  107. startOffset = page.getOffset() - radius;
  108. }else{
  109. startOffset = (page.getSize() / page.getLength() - Constants.MAX_PAGE_INDEX) *
  110. page.getLength();
  111. }
  112. }
  113. for (int i = startOffset; (i < page.getSize()) && (i < startOffset + Constants.MAX_PAGE_INDEX * page.getLength()); ){
  114. if (i == page.getOffset()){
  115. s.append("<b>" + (i / page.getLength() + 1) + "</b>\n");
  116. }else{
  117. s.append("<a href='" + this.url + pref + "current=" + i +
  118. "'>" + (i / page.getLength() + 1) + "</a>\n");
  119. }
  120. i += page.getLength();
  121. }
  122. }
  123. }

静态参数类:

  1. public class Constants {
  2. public static int PAGE_SIZE = 5; //每页大小
  3. public static int MAX_PAGE_INDEX = 5;//最多显示5个数字连接
  4. }

编写tld文件mypage.tld:

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
  3. <taglib>
  4. <tlib-version>2.5</tlib-version>
  5. <jsp-version>1.2</jsp-version>
  6. <short-name>mypage</short-name>
  7. <uri>\tag-page</uri>
  8. <tag>
  9. <name>page</name>
  10. <tag-class>com.byyang.tag.PageTag</tag-class>
  11. <body-content>pg</body-content>
  12. <attribute>
  13. <name>url</name>
  14. <required>true</required>
  15. <rtexprvalue>true</rtexprvalue>
  16. </attribute>
  17. </tag>
  18. </taglib>

配置web.xml

  1. <!-- 自定义标签 -->
  2. <jsp-config>
  3. <taglib>
  4. <taglib-uri>/tag-page</taglib-uri>
  5. <taglib-location>/WEB-INF/mypage.tld</taglib-location>
  6. </taglib>
  7. </jsp-config>

在jsp页面中添加如下代码:

  1. <%@ taglib uri="/tag-page" prefix="pg"%>

你可以放到一个公共jsp里面一块引。

现在咱们可以测试一下了:

在jsp页面代码:

  1. <div align="center">
  2. <h2>图书列表</h2>
  3. <table border=1>
  4. <s:iterator var="book" status="index" value="books">
  5. <s:if test="#index.odd == true">
  6. <tr style="background-color: yellow">
  7. </s:if>
  8. <s:else>
  9. <tr>
  10. </s:else>
  11. <td align="right">图书名称:</td>
  12. <td align="left"><s:property value="book"/></td>
  13. </tr>
  14. </s:iterator>
  15. </table>
  16. <pg:page url="getBookList.action"></pg:page>
  17. </div>

Action中咱们设一个测试数据:

  1. public class BookAction extends BaseAction {
  2. private String[] books;
  3. private BookService bookService = new BookService();
  4. public String execute() throws Exception {
  5. setBooks(bookService.getBookList());
  6. Page page = new Page(1,65,5);
  7. request.setAttribute("pager", page);
  8. return SUCCESS;
  9. }
  10. public String[] getBooks() {
  11. return books;
  12. }
  13. public void setBooks(String[] books) {
  14. this.books = books;
  15. }
  16. }

好的,接下来启动tomcat,查看页面效果:

Java标签实现分页的更多相关文章

  1. java 标签库(核心,xml,sql ,国际化,函数)

    java标签库分分为上述几种,一般经常使用的是核心和函数,接下来会分别讲解这几种,和常见的用法. 一般标签库会和el表达式一起使用,所以在学习标签库前最后也学习下el表达式的使用. 导入后展开 可以从 ...

  2. 一个关于A标签和分页的怪问题!

    用bootstrap做了用户电话号码查询的前端页面. 并且用了MVCPager分页. Bootstrap前端页如下: 一开始使用了用A标签,分页成功后,我进入第二页,点击这个A标签,页面会自动跳转到第 ...

  3. Java标签引起的陷阱

    请看下面的代码,请问下面的代码是否能够通过编译: package com.yonyou.test; /** * 测试类 * @author 小浩 * @创建日期 2015-3-2 */ public ...

  4. (转)java web自定义分页标签

    转载至http://liuxi1024.iteye.com/blog/707784 效果如图: 1.JSP规范1.1版本后增加了自定义标签库.实现自定义标签的步骤 (1)开发自定义标签处理类. (2) ...

  5. ssm+jsp+自定义标签实现分页,可以通用(前端实现)

    近期做了一些分页方面的开发,大致梳理一下 1 jsp页面上关于分页的代码 <tr> <td colspan="9"> <ule1:pagination ...

  6. Java Web -【分页功能】详解

    分页简介 分页功能在网页中是非常常见的一个功能,其作用也就是将数据分割成多个页面来进行显示. 使用场景: 当取到的数据量达到一定的时候,就需要使用分页来进行数据分割. 当我们不使用分页功能的时候,会面 ...

  7. java调用Oracle分页存储过程

    Java程序 package com.test; import java.sql.CallableStatement; import java.sql.Connection; import java. ...

  8. Java——标签组件:JLabel

    使用一个标签 import java.awt.Color; import java.awt.Dimension; import java.awt.Point; import javax.swing.J ...

  9. 在django中使用自定义标签实现分页功能

    效果演示: github地址:https://github.com/mncu/django_projects/tree/master/django_projects/pagination_test 本 ...

随机推荐

  1. git 对文件大小写修改无反应 不敏感解决办法

    git config core.ignorecase false 执行之后就能自动检测到了 2019-01-18

  2. 02.将python3作为centos7的默认python命令

    博客为日常工作学习积累总结: 由于个人兴趣爱好对python有了解: 1.安装Python3: 参考博客:https://zhuanlan.zhihu.com/p/47868341 安装依赖包: yu ...

  3. linux系统基础之--进程计划(基于centos7.4 1708)

  4. 5 替换空格 JavaScript

    题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy.   原来一个空格字符,替换之后 ...

  5. css3实现自定义滚动条样式详解

    在写页面的时候有时候滚动条的样式与页面风格不统一这时候就用到了自定义滚动条 1.首先弄清楚页面的滚动条分为哪些部分,在写的时候分为几块 定义滚动条的时候先进行宏观定义,定义滚动条,然后定义滑块,然后定 ...

  6. Array方法学习小结

    原生js forEach()和map()遍历 A:相同点: 1.都是循环遍历数组中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项item,当前 ...

  7. header()函数用处

    header() 函数向客户端发送原始的 HTTP 报头. 认识到一点很重要,即必须在任何实际的输出被发送之前调用 header() 函数(在 PHP 4 以及更高的版本中,您可以使用输出缓存来解决此 ...

  8. 集合之HashMap、Hashtable

    HashMap 基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了非同步和允许使用 null 之外,HashMap 类与 Hashtabl ...

  9. python-socket实现简单的ssh客户端

    客户端代码,监听端口号为 localhost 9999 #!/usr/local/bin/python3 # -*- coding:utf-8 -*- import socket client = s ...

  10. 从零开始一个http服务器(一)-开始

    从零开始一个http服务器 (一) 代码地址 : https://github.com/flamedancer/cserver git checkout step1 一个简单的socket serve ...