Java实现标签分页
最近为了开发一个网站,里面要用分页功能,但是之前很少自己写分页标签,又不想用现成框架。所以自己参考了些资料,写了个分页例子测试了一下。
代码主要分为三个类:
- 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; } }
现在我们要实现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; } /** * //拼接"首页"和"<" * @param s * @param page * @param pref */ public void doStart(StringBuilder s,Page page,String pref){ if (page.getOffset() > 0){ s.append("<a href='" + this.url + pref + "current=0'>[首页]</a>\n" + "<a href='" + this.url + pref + "current=" + page.getLastOffset() + "'>[<]</a>\n"); }else{ s.append("<a href='" + this.url + pref + "current=0'>[首页]</a>\n" ); } } /** * 拼接"尾页"和">" * @param s * @param page * @param pref */ public void doEnd(StringBuilder s,Page page,String pref){ if (page.getOffset() < page.getSize() - page.getLength()) { s.append("<a href='" + this.url + pref + "current=" + page.getNextOffset() + "'>[>]</a>\n" + "<a href='" + this.url + pref + "current=" + page.lastPageOffset() + "'>[尾页]</a>\n"); }else{ s.append("\n"+ "<a href='" + this.url + pref + "current=" + page.lastPageOffset() + "'>[尾页]</a>\n"); } } /** * 数字连接 * @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("<b>" + (i / page.getLength() + 1) + "</b>\n"); }else{ s.append("<a href='" + this.url + pref + "current=" + i + "'>" + (i / page.getLength() + 1) + "</a>\n"); } i += page.getLength(); } } }
静态参数类:
public class Constants { public static int PAGE_SIZE = 5; //每页大小 public static int MAX_PAGE_INDEX = 5;//最多显示5个数字连接 }
编写tld文件mypage.tld:
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>2.5</tlib-version> <jsp-version>1.2</jsp-version> <short-name>mypage</short-name> <uri>\tag-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>
配置web.xml
<!-- 自定义标签 --> <jsp-config> <taglib> <taglib-uri>/tag-page</taglib-uri> <taglib-location>/WEB-INF/mypage.tld</taglib-location> </taglib> </jsp-config>
在jsp页面中添加如下代码:
<%@ taglib uri="/tag-page" prefix="pg"%>
你可以放到一个公共jsp里面一块引。
现在咱们可以测试一下了:
在jsp页面代码:
<div align="center"> <h2>图书列表</h2> <table border=1> <s:iterator var="book" status="index" value="books"> <s:if test="#index.odd == true"> <tr style="background-color: yellow"> </s:if> <s:else> <tr> </s:else> <td align="right">图书名称:</td> <td align="left"><s:property value="book"/></td> </tr> </s:iterator> </table> <pg:page url="getBookList.action"></pg:page> </div>
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("pager", page); return SUCCESS; } public String[] getBooks() { return books; } public void setBooks(String[] books) { this.books = books; } }
好的,接下来启动tomcat,查看页面效果:
相关推荐
采用自定义标签实现java代码轻松实现分页的功能,有图片详解有源码共享,有文档详细说明,源码详细易懂,
jsp 自定义分页查询 可以带查询条件 因为网上很多 都不能带查询条件 所以本人做了修改 可以实现自定义 带条件的查询
jsp和java联合实现了自定义标签的功能,主要技术继承了TagSupport类和编写对应bodytag.tld配置文件 实现了分页功能 当前功能点所在位置 循环遍历数据
自己为了方便而写的一个标签分页程序! 并且测试成功! 使用起来非常方便 可以直接导文件传入数据库以及每页的记录条数 就可以简单的实现分页 很适合学习中为分页而烦恼的朋友! 相互学习
在java里面,如何写一个公用的自定义分页标签的实现
Java web开发使用C标签实现分页的例子,很好用的分页实现方法
通过BodyTagSupport实现了自定义的标签,主要实现功能为分页技术以及当前功能点所在位置。
结合struts hibernate 自定义标签实现分页 可通用
很好利用tld文件实现了标签的分页功能更透彻的理解标签和配置文件信息
自定义标签实现jdbc的分页,使用的mysql数据库。
利用JSP自定义标签分页,把代码封装在底层,JSP页面没有一句java代码,使运行界面看起来十分简介美观和完美、、
Pager-taglib实际上是一个Jsp标签库,为在JSP上显示分页信息而设计的一套标签,通过这些标签的不同的组合支持多种风格的分页显示。会形成多种不一样的分页页面,风格各异,她自带的DEMO就有七种左右的分页风格,包括...
自定义标签实现分页,分页信息都封装在一个继承自TagSupport的java文件中,自定义一个tld文件,jsp页面通过taglib指令引入tld文件,使用自定义标签。
jh-plugins已实现标签库:分页 jh-plugins特点:高效、轻巧、简单、适用(可融合与任何B/S架构的java项目) jh-plugins使用详解: 导入jh-plugins.jar,引入标签库; 1.分页标签库 PageModel pagem = new PageModel();...
该实例使用自定义标签技术实现了功能强大的分页功能,希望对有需要的Java开发人员有所帮助
在 Myeclipse6.5 SQLServer2005 上成功测试通过
该项目是本人用SSH框架整理出来的,有源代码和数据库。其中重点演示了自定义分页标签的使用方法,该标签可以实现强大的分页功能,使用十分方便,页面效果比较好。
使用taglib标签库实现分页,能含taglib.jar
ActivityGroup 使用实现tab分页标签,保存Activity状态、使用子Activity的Menu
Aspose.words 实现插入文件,页面设置,替换 表格操作,分页等