JSP自定义分页标签TAG全过程

首先我们需要在WEB-INF/tld/目录下创建page.tld文件

<?xml version="1.0" encoding="ISO-8859-1"?>
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>page</short-name>
<uri>http://www.kevin.com/taglibs/page</uri>
<tag>
<name>htmlPage</name>
<tag-class>com.lss.common.tag.PageTag</tag-class>
<body-content>JSP</body-content>
<description>htmlPage Tag</description>
<attribute>
<name>pageNo</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>pageSize</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>totalSum</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>url</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>showPage</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>

package com.lss.common.tag; 

import java.io.IOException; 

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport; 

import com.lss.common.page.HtmlPage;
import com.lss.common.page.Page;
import com.lss.common.page.VariablePage; 

/**
* 分页处理标签
*
* @description
* @DATE 2012-3-11下午09:08:46
*/
public class PageTag extends TagSupport {
private int pageNo;
private int pageSize = 10;
private int totalSum;
private int showPage = 10;
private String url; 

public int getPageNo() {
return pageNo;
} 

public void setPageNo(int pageNo) {
this.pageNo = pageNo;
} 

public int getPageSize() {
return pageSize;
} 

public void setPageSize(int pageSize) {
this.pageSize = pageSize;
} 

public int getTotalSum() {
return totalSum;
} 

public void setTotalSum(int totalSum) {
this.totalSum = totalSum;
} 

public int getShowPage() {
return showPage;
} 

public void setShowPage(int showPage) {
this.showPage = showPage;
} 

public String getUrl() {
return url;
} 

public void setUrl(String url) {
this.url = url;
} 

@Override
public int doEndTag() throws JspException {
if (pageSize == 0) {
return TagSupport.SKIP_PAGE;// 不显示分页
} else if (pageSize > totalSum) {
return TagSupport.SKIP_BODY;// 不显示分页
}
JspWriter out = pageContext.getOut();
try {
if (url.indexOf(";jsessionid=") == -1) {
if (url.indexOf("?") == -1) {
url += ";jsessionid=" + pageContext.getSession().getId() + "?pageNo=";
} else {
url = url.replaceFirst("\\?", ";jsessionid=" + pageContext.getSession().getId() + "?");
if (url.indexOf("pageNo=") == -1) {
url += "&pageNo=";
}
}
}
url = pageContext.getServletContext().getContextPath() + url;
VariablePage variablePage = new VariablePage(pageNo, totalSum, pageSize, url);
variablePage.setShowPageNum(showPage);
Page page = new HtmlPage(variablePage);
out.print(page.getFirstNo() + " " + page.getBackpageNum() + " " + page.pagination() + " " + page.getNextpageNum() + " " + page.getLastNo());
} catch (IOException ex) {
ex.printStackTrace();
}
return super.doEndTag();
} 

@Override
public void release() {
url = null;
pageNo = 0;
totalSum = 0;
pageSize = 10;
super.release();
} 

private static final long serialVersionUID = -2642907859641024483L;
}
/**
* HTML 分页类
*
* @description
* @DATE 2012-3-11下午10:33:14
*/
public class HtmlPage extends Page {
public HtmlPage(VariablePage variablePage) {
super(variablePage);
} 

public String pagination() {
String printNo = "";
// 如果已分页;并且页数小于等于要显示的页数
if (variablePage.totalPage > 1 && variablePage.totalPage <= variablePage.showPageNum) {
return displayAll();
// 如果分页数:大于显示的页码数
} else if (variablePage.totalPage > 1 && variablePage.totalPage > variablePage.showPageNum) {
if (variablePage.pageNo == 1) {// 当前页等于第一页
return fromFirstPagePrint();
} else if (variablePage.pageNo == variablePage.totalPage) {// 当前页等于最后一页
return fromLastPagePrint();
} else {// 如果当前页:即不是首页也不是尾页
if (variablePage.showPageNum % 2 == 0) {// 可以平分页码
int print$No = variablePage.showPageNum / 2;
if (variablePage.pageNo >= print$No) {
int index$No = variablePage.pageNo - print$No;
if (variablePage.pageNo + print$No >= variablePage.totalPage) {
return fromLastPagePrint();
} else {
if (index$No == 0)
index$No = 1;
for (int i = index$No; i < (variablePage.showPageNum + index$No); i++) {
if (i == variablePage.pageNo) {// 如果是当前页:不添加连接URL
printNo += (i + variablePage.split);
} else {
printNo += (buildA(variablePage, i) + variablePage.split);
}
}
}
} else {
return fromFirstPagePrint();
}
} else {// 打印页数不是偶数时:
int print$No = variablePage.showPageNum / 2 + 1;
if (variablePage.pageNo >= print$No && variablePage.pageNo + print$No < variablePage.totalPage) {
int index$No = variablePage.pageNo - print$No + 1;
for (int i = index$No; i < variablePage.showPageNum + index$No; i++) {
if (i == variablePage.pageNo) {// 如果是当前页:不添加连接URL
printNo += (i + variablePage.split);
} else {
printNo += (buildA(variablePage, i) + variablePage.split);
}
}
} else if (variablePage.pageNo <= print$No) {// 从第一页开始
return fromFirstPagePrint();
} else {
return fromLastPagePrint();
}
}
}
return (printNo);
} else {
return "1";
}
} 

public String getBackpageNum() {
if (variablePage.pageNo <= 1) {
return buildSpan("上一页", variablePage);
} else {
return buildA("上一页", (variablePage.url + (variablePage.pageNo - 1)));
}
} 

public String getNextpageNum() {
if (variablePage.pageNo >= variablePage.totalPage) {
return buildSpan("下一页", variablePage);
} else {
return buildA("下一页", variablePage.url + (variablePage.pageNo + 1));
}
} 

public String buildSpan(String text, VariablePage variablePage) {
return "<span style=\"color:gray;\">" + text + "</span>";
} 

public String buildA(String text, String url) {
return "<a href=\"" + url + "\">" + text + "</a>";
} 

public String buildA(VariablePage variablePage, int num) {
return ("<a href=\"" + variablePage.url + num + "\">" + num + "</a>");
}
}
public abstract class Page {
protected VariablePage variablePage; 

public Page(VariablePage variablePage) {
this.variablePage = variablePage;
calculateTotalPage();
} 

public int getStartIndex() {
return (getValidpageNum() - 1) * variablePage.pageSize;
} 

public String getBackpageNum() {
if (variablePage.pageNo <= 1) {
return buildSpan("上一页", variablePage);
} else {
return buildA("上一页", variablePage.getUrl() + (variablePage.pageNo - 1));
}
} 

public String getNextpageNum() {
if (variablePage.pageNo >= variablePage.totalPage) {
return buildSpan("下一页", variablePage);
} else {
return buildA("下一页", variablePage.getUrl() + (variablePage.pageNo + 1));
}
} 

/**
* 计算总页数
*/
private void calculateTotalPage() {
if (variablePage.totalSum % variablePage.pageSize == 0) {
variablePage.totalPage = variablePage.totalSum / variablePage.pageSize;
} else {
variablePage.totalPage = variablePage.totalSum / variablePage.pageSize + 1;
}
if (variablePage.totalPage < variablePage.pageNo) {
variablePage.pageNo = variablePage.totalPage;
} else if (variablePage.pageNo < 1) {
variablePage.pageNo = 1;
}
} 

protected String displayAll() {
StringBuilder sBuilder = new StringBuilder(10);
sBuilder.append(variablePage.split);
for (int i = 1; i <= variablePage.totalPage; i++) {
if (i == variablePage.pageNo) {
sBuilder.append(i + variablePage.split);
} else {
sBuilder.append(buildA(variablePage, i) + variablePage.split);
}
}
return sBuilder.toString();
} 

/**
* 抽象出分页方法
*
* @return
*/
public abstract String pagination(); 

/**
* 实现从第一页开始打印
*
* @return
*/
protected final String fromFirstPagePrint() {
StringBuffer buffer = new StringBuffer(100);
for (int i = 1; i <= variablePage.showPageNum; i++) {
if (i == variablePage.pageNo) {// 如果是当前页:不添加连接URL
buffer.append(i + variablePage.split);
} else {
buffer.append(buildA(variablePage, i) + variablePage.split);
}
}
return buffer.toString();
} 

/**
* 实现从最后一页开始打印
*
* @return
*/
protected final String fromLastPagePrint() {
StringBuffer buffer = new StringBuffer(100);
int startPage = variablePage.totalPage - (variablePage.showPageNum - 1);
for (int i = startPage; i <= variablePage.totalPage; i++) {
if (i == variablePage.pageNo) {// 如果是当前页:不添加连接URL
buffer.append(i + variablePage.split);
} else {
buffer.append(buildA(variablePage, i) + variablePage.split);
}
}
return buffer.toString();
} 

public String getFirstNo() {
if (isExistsPagination()) {
return buildA("首页", variablePage.url + 1);
} else {
return buildSpan("首页", variablePage);
}
} 

/**
* 判断是否存在分页
*
* @return
*/
private boolean isExistsPagination() {
if (variablePage.totalSum > 1 && variablePage.totalPage > 1) {
return true;
}
return false;
} 

public String getLastNo() {
if (isExistsPagination()) {
return buildA("尾页", variablePage.url + variablePage.totalPage);
} else {
return buildSpan("尾页", variablePage);
}
} 

protected int getValidpageNum() {
if (variablePage.totalPage < variablePage.pageNo) {
return variablePage.pageNo = variablePage.totalPage;
} else if (variablePage.pageNo < 1) {
return variablePage.pageNo = 1;
} else {
return variablePage.pageNo;
}
} 

public VariablePage getPageContant() {
return this.variablePage;
} 

public abstract String buildSpan(String text, VariablePage variablePage); 

public abstract String buildA(String text, String url); 

public abstract String buildA(VariablePage variablePage, int num); 

public String printModifyPageSize(int pageSize){
StringBuilder builder=new StringBuilder(100);
builder.append("每页<input type='text' id='pageSize' style='width:20px' maxlength='2' name='pageSize'");
if(pageSize>0){
builder.append(" value='"+pageSize+"' ");
}
builder.append("/>条");
return builder.toString();
}
}
/**
* 分页基础变量
*
* @description
* @DATE 2012-3-11下午10:34:00
*/
public class SimpleVariable {
/**
* 显示页码
*/
protected int showPageNum = 10;
/**
* 连接URL
*/
protected String url = null;
/**
* 当前页码
*/
protected int pageNo = 1;
/**
* 总页码
*/
protected int totalPage = 1;
/**
* 总条数
*/
protected int totalSum = 0;
/**
* 每页显示条数
*/
protected int pageSize = 10; 

public String getUrl() {
return url;
} 

public void setUrl(String url) {
this.url = url;
} 

public int getTotalPage() {
return totalPage;
} 

public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
} 

public int getTotalSum() {
return totalSum;
} 

public void setTotalSum(int totalSum) {
this.totalSum = totalSum;
} 

public int getPageSize() {
return pageSize;
} 

public void setPageSize(int pageSize) {
this.pageSize = pageSize;
} 

public int getShowPageNum() {
return showPageNum;
} 

public void setShowPageNum(int showPageNum) {
this.showPageNum = showPageNum;
} 

public int getPageNo() {
return pageNo;
} 

public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
} 
/**
* 分页变量
*
* @description
* @DATE 2012-3-11下午10:34:08
*/
public class VariablePage extends SimpleVariable {
protected String split = " ";
protected String style = "class='page'"; 

public VariablePage(int pageNo, int totalSum, int pageSize, String url) {
pageNo = pageNo < 1 ? 1 : pageNo;
super.pageNo = pageNo;
this.totalSum = totalSum;
this.url = url;
this.pageSize = pageSize;
} 

public VariablePage(int pageNum, int totalSum, String url) {
pageNum = pageNum < 1 ? 1 : pageNum;
super.pageNo = pageNum;
this.totalSum = totalSum;
this.url = url;
} 

public String getSplit() {
return split;
} 

public void setSplit(String split) {
this.split = split;
} 

}

#需要使用该分页标签的JSP 使用方法如下:

JSP 头部引入

<%@taglib uri="http://www.kevin.com/taglibs/page" prefix="page" %>

使用以下标签生成分页HTML代码

<page:htmlPage pageNo="${pageNo}" url="your_url" totalSum="${totalSum}" showPage="10" pageSize="12"/>
(0)

相关推荐

  • jsp读取数据库实现分页技术简析

    这篇文章介绍的是用javabean和jsp页面来实现数据的分页显示,例子中所使用的数据库是Mysql. 1.先看javabean 类名: databaseBean.java: 以下为databaseBean.java的代码: 复制代码 代码如下: package database_basic; import java.sql.*; import java.util.*; public class databaseBean { //这是默认的数据库连接方式 private String DBLoc

  • jsp分页显示完整实例

    本文实例讲述了jsp分页显示的实现方法.分享给大家供大家参考. 具体实现方法如下: 复制代码 代码如下: <%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %> <%@include file ="../inc/ChkPwd.jsp"%>

  • 一个实用的JSP分页代码

    有热心网友回复:str += " 转到<select name='page' onChange=\"window.location.href='" + fileName + temp + "cur_page='+this.options[this.selectedIndex].value\">"; 已经试过了,没问题 1.以下是实现分页的类PageResultSet 复制代码 代码如下: package page.bean; impo

  • JSP分页显示的实例代码

    1.mysql的limit关键字 (DAO) select * from tablename limit startPoint, numberPerPage; tablename 就是要分页显示的那张表的名称: startPoint 就是起始的位置 -1: numberPerPage 就是一页显示的条数. 例如: select * from comment limit 20,5; 则是从comment表中抽取21~25号评论: 2.jQuery load函数 (页面JS) MySQL的limit

  • 简单实现JSP分页显示效果

    本文实例为大家分享了JSP分页显示效果的具体代码,供大家参考,具体内容如下 1.mysql的limit关键字 (DAO) select * from tablename limit startPoint, numberPerPage; tablename 就是要分页显示的那张表的名称: startPoint 就是起始的位置 -1: numberPerPage 就是一页显示的条数. 例如: select * from comment limit 20,5; 则是从comment表中抽取21~25号

  • 一个通用的jsp分页PageBean

    package com.shaccp.web.util; import java.util.List; public class PageBean { /** * * * @author ppy 2008-10-18 14:3:56 * totalRecords 总记录数 * list 保存分页的数据 * pageNo 当前页 * pageSize 页大小 * query 保存用户查询的字符串 * pageAction 操作分页的Servlet或Action(struts) * method (

  • jsp+servlet+javabean实现数据分页方法完整实例

    本文实例讲述了jsp+servlet+javabean实现数据分页方法.分享给大家供大家参考,具体如下: 这里秉着且行且记的心态,记录下学习过程,学得快忘得快,生怕遗忘,以备日后使用. 用到的部分代码是自己在网上查找,并自己修改,加上自己的理解.也不知道算不算原创,只做自己学习记录. 使用相关:PostgreSQL数据库.dom4j.JSP.Servlet 一.首先是工程格局,来个全局视图方便读者与自己查看与使用 思路为: 以config.xml文件记录配置信息,以方便数据库更改,方便移植与重用

  • jsp hibernate的分页代码第1/3页

    可见使用Hibernate,在进行查询分页的操作上,是具有非常大的灵活性,Hibernate会首先尝试用特定数据库的分页sql,如果没用,再尝试Scrollable,如果不行,最后采用rset.next()移动的办法. (一)pager类 * @(#)Pager.java 2005-5-3 * * Copyright (c) 2005, Jeffrey Hsu */ package com.jeffrey.messagelove; /** * Pager holds the page info.

  • JSP实现的简单分页示例

    本文实例讲述了JSP实现的简单分页示例.分享给大家供大家参考,具体如下: <%@ page language="java" import="java.util.*" contentType="text/html; charset=gbk"%> <%@ page import="com.yx.page.db.*"%> <%@ page import="java.sql.*" %&

  • jsp分页显示的实现代码

    最近这几天在做JSP留言板设计的过程中,遇到了一个问题.先看一张截图: 这是随便在一个新闻的留言页面截的图,假如留言条数太多,那整个页面得排好长好长,这就直接给用户造成了麻烦.不舒服的感受,所以,解决这个问题,通常采用分页显示的方法.       要把页面显示方式设计成这样的方式,通常需要用到这几个基本变量:pageSize(每个页面所显示的记录数).pageCount(一共有多少个页面).showPage(目前显示第几页).recordCount(总的记录数),为了方便理解,画了一张图: 如果

随机推荐