Java标签实现分页
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标签实现分页的更多相关文章
- java 标签库(核心,xml,sql ,国际化,函数)
java标签库分分为上述几种,一般经常使用的是核心和函数,接下来会分别讲解这几种,和常见的用法. 一般标签库会和el表达式一起使用,所以在学习标签库前最后也学习下el表达式的使用. 导入后展开 可以从 ...
- 一个关于A标签和分页的怪问题!
用bootstrap做了用户电话号码查询的前端页面. 并且用了MVCPager分页. Bootstrap前端页如下: 一开始使用了用A标签,分页成功后,我进入第二页,点击这个A标签,页面会自动跳转到第 ...
- Java标签引起的陷阱
请看下面的代码,请问下面的代码是否能够通过编译: package com.yonyou.test; /** * 测试类 * @author 小浩 * @创建日期 2015-3-2 */ public ...
- (转)java web自定义分页标签
转载至http://liuxi1024.iteye.com/blog/707784 效果如图: 1.JSP规范1.1版本后增加了自定义标签库.实现自定义标签的步骤 (1)开发自定义标签处理类. (2) ...
- ssm+jsp+自定义标签实现分页,可以通用(前端实现)
近期做了一些分页方面的开发,大致梳理一下 1 jsp页面上关于分页的代码 <tr> <td colspan="9"> <ule1:pagination ...
- Java Web -【分页功能】详解
分页简介 分页功能在网页中是非常常见的一个功能,其作用也就是将数据分割成多个页面来进行显示. 使用场景: 当取到的数据量达到一定的时候,就需要使用分页来进行数据分割. 当我们不使用分页功能的时候,会面 ...
- java调用Oracle分页存储过程
Java程序 package com.test; import java.sql.CallableStatement; import java.sql.Connection; import java. ...
- Java——标签组件:JLabel
使用一个标签 import java.awt.Color; import java.awt.Dimension; import java.awt.Point; import javax.swing.J ...
- 在django中使用自定义标签实现分页功能
效果演示: github地址:https://github.com/mncu/django_projects/tree/master/django_projects/pagination_test 本 ...
随机推荐
- vue-cli使用swiper4在ie以及safari报错
vue-cli项目中,通过npm run swiper --save-dev安装的是swiper4版本的插件,这样安装以后在谷歌火狐等浏览器都可以正常运行,但是在safari浏览器(可能是版本太低)还 ...
- netfilter 学习摘要
netfilter 子系入口在L3,完成后把数据包发往L4 netfilter 主要功能: 数据包选择(iptables) 数据包过滤 网络地址转换(NAT) 数据包操纵(在路由选择之前或之后修改数据 ...
- Django学习之mysql应用基础
使用pip 安装mysql pip install mysql 使用命令行打开数据库且选择使用已有的数据库 显示已有数据库show databases; 选择已有数据库 use s23; 显示s23数 ...
- 《JQuery常用插件教程》系列分享专栏
<JQuery常用插件教程>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/201719.html 文章 使用jquery插件实现图 ...
- python--模块之基本
模块的概念: 在计算机程序开发过程中,随着程序代码越来越多,在一个文件里代码就会越来越长,不利于维护.为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样每个文件包含的代码就相对较少. ...
- 20145234黄斐《Java程序设计》第三周学习总结
教材学习内容总结 类与对象 定义:对象,与过程相对. Java中变量有2种类型,一个是基本类型,另一个则是类类型.基本类型在之前学过,本次学习类类型.使用Java撰写程序几乎都是在使用对象,要产生对象 ...
- POJ3259_Wormholes_KEY
题目传送门 题目大意:有F组数据,N表示有N点,M表示有M条边,走一遍边需要花费Ti个时间,还有W个虫洞,可以向前回溯Ti时间,求能否从1点出发,经过一些路或虫洞回到1点后时间为负. 建图后用SPFA ...
- P3379 【模板】最近公共祖先(LCA)
P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询 ...
- treetable--.net webform中树形table表管理的应用
好记性不如烂笔头. treetable 官网:http://ludo.cubicphuse.nl/jquery-treetable/#api 今天要做一个关于table的树节点展示,还有编辑,删除功能 ...
- 【Hadoop】Seondary NameNode不是备份NameNode!!
昨天和舍友聊天时无意中提起Secondary NameNode,他说这是备用NameNode.我当时就有点疑惑..之后查阅了相关资料和博客,算是基本理解了什么是Secondary NameNode. ...