Java标签实现分页

Java实现标签分页

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

代码主要分为三个类:

  1. PageTag 分页标签类

  2. Page 分页bean

  3. Constant 设置常量

Page代码:

Java代码  

  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,两个都能实现这个功能,这个看个人选择了。

Java代码  

  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. }

静态参数类:

Java代码  

  1. public class Constants {
  2. public static int PAGE_SIZE = 5; //每页大小

  3. public static int MAX_PAGE_INDEX = 5;//最多显示5个数字连接
  4. }

编写tld文件mypage.tld:

Xml代码  

  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

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页面中添加如下代码:

Js代码  

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

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

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

在jsp页面代码:

Html代码  

  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中咱们设一个测试数据:

Java代码  

  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,查看页面效果:

时间: 2024-08-24 19:01:31

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

公共字串计算——String.regionMatches方法 &amp; Java标签

题目:输入两个字符串,计算两个字符串的最大公共字串的长度,并输出,字符不区分大小写 eg:输入abcde  xxxBcyyy,输出 2. 完整Java代码: import java.util.*; public class Main { public static void main(String arg[]){ Scanner s=new Scanner(System.in); String str1=s.next(); String str2=s.next(); s.close(); Str

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

用bootstrap做了用户电话号码查询的前端页面. 并且用了MVCPager分页. Bootstrap前端页如下: 一开始使用了用A标签,分页成功后,我进入第二页,点击这个A标签,页面会自动跳转到第一页.相当无解..想不通.经过和群里高手交流说可能是A标签的问题..我换成button,问题解决. 其实也可以使用A标签.只需要修改href="javascript:void(0)",就可以了,让A标签不会跳转! <div class="list-group"&g

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

java标签库分分为上述几种,一般经常使用的是核心和函数,接下来会分别讲解这几种,和常见的用法. 一般标签库会和el表达式一起使用,所以在学习标签库前最后也学习下el表达式的使用. 导入后展开 可以从jar包查看相对应的标签库得tld文档,里面会描述每个标签的说明和用法 先从核心标签库开始 tld文档有几个重点,第一个就是uri,这是等下在jsp页面引入标签库时是的uri 基本一个tld文档的重点内容就这么多了,分开看其实也不是很难 1 <%@taglib uri="http://java

Java Web的分页工具类

最近写一个java web项目,以前分页的工具类,都是基础架构的人写好了的.也没有去细看,现在遇到这个状况. 就整理一下思路,自己写了一个分页的工具类.写的不好之处,还望斧正. 下面是我的代码: PageUtil.java 1 package util; 2 3 import java.util.Map; 4 5 /** 6 * 分页工具类 7 * @author lyh 8 * 9 */ 10 public class PageUtil { 11 private int total; //总数

Java学习之分页查询

Java学习之分页查询 一先做数据库的实体类 Userinfo.java <span style="font-size:14px;">package com.zhu.books.jdbc; import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; public class Pagation extends DBCon

Java标签分页实现

Java实现标签分页(转自http://ybyonline.iteye.com/blog/1745049) 最近为了开发一个网站,里面要用分页功能,但是之前很少自己写分页标签,又不想用现成框架.所以自己参考了些资料,写了个分页例子测试了一下. 代码主要分为三个类: PageTag 分页标签类 Page 分页bean Constant 设置常量 Page代码: /** * * @author byyang * */ public class Page { private int current =

标签引入分页

public class PageModel { /** 分页总数据条数 */ private int recordCount; /** 当前页面 */ private int pageIndex; /** 每页分多少条数据 */ private int pageSize = 5; /** 总页数 */ private int totalSize; public int getRecordCount() { this.recordCount = this.recordCount <= 0 ? 0

java web页码分页

开始显示的是1,2,3,4,5 第二页就是当我单击2,3的时候显示的还是1,2.3,4,5 单击4的时候显示的则是2,3,4,5,6 5的时候显示的是3,4,5,6,7 6的时候是4,5,6,7,8 package com.kt.servlet_qt; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import javax.ser

java MYSQL做分页

MySql中查询语句实现分页功能 语句: select * from 表名 where 条件 limit 要找第几页,每页多少行; import java.util.*; import java.sql.*; public class FruitDao { private Connection conn; private PreparedStatement pre; private ResultSet rs; public FruitDao() throws Exception { conn =