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

首先我们需要在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"/>

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索tag
分页标签
jsp自定义分页标签、jsp 自定义tag、jsp自定义标签 tag、jsp 自定义tag文件、displaytag 分页,以便于您获取更多的相关知识。

时间: 2024-09-24 19:06:33

JSP自定义分页标签TAG全过程_JSP编程的相关文章

Struts2自定义标签4自定义分页标签

第一步:webroot/web-inf下的str.tld文件 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd

JSP自定义简单标签入门之带有属性

上面写的那个简单标签来控制页面中标签内容的重复次数是固定的,这就是权限"写死了",这是非常不好的行为,因为其灵活性太差.所以下面就介绍一种使用属性来控制标签内容输出次数的方法. 准备工作 创建实现了SimpleTag接口的实现类(或者是继承了SimpleTagSupport类的子类) 在类中为相应的属性字段添加setter方法,注意字段名称一定要一致.否则会出错滴 在tld文件中进行相关约束项的声明,不同于不带属性的简单标签的声明方式,这里多了一个attribute子标签,内有name

JSP自定义标签案例分析_JSP编程

本文为大家介绍了JSP自定义标签的案例,供大家参考,具体内容如下 案例一:实现一个基本防盗链标签 1. 标签处理类 public class MyReferer extends BodyTagSupport { private String site; private String back; public String getSite() { return site; } public void setSite(String site) { this.site = site; } public

JSP自定义标签入门学习_JSP编程

本文为大家分享了JSP自定义标签入门学习教程,希望大家喜欢. 1.JSP自定义标签: 自定义标签是用户定义的JSP语言元素.当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时Web container调用那些操作.JSP标签扩展可以让你创建新的标签并且可以直接插入到一个JSP页面. JSP 2.0规范中引入Simple Tag Handlers来编写这些自定义标记.你可以继承SimpleTagSupport类

JSP中一些JSTL核心标签用法总结_JSP编程

一.JSTL介绍JSTL(JavaServer Pages Standard Tag Library)由JCP(Java Community Process)指定标准,提供给 Java Web 开发人员一个标准通用的标签函数库.和 EL 来取代传统直接在页面上嵌入 Java 程序(Scripting)的做法,以提高程序可读性.维护性和方便性.JSTL 主要由Apache组织的Jakarta Project 实现,容器必须支持Servlet 2.4 且JSP 2.0 以上版本. JSTL下载地址:

JSP通用高大上分页代码(超管用)_JSP编程

先给大家展示下分页效果,如果亲们还很满意请参考以下代码. 在超链接中要保留参数 当使用多条件查询后,然后在点击第2 页时,这个第2页超链接没有条件了,所以会丢失条件,所以我们需要在页面上的所有链接都要保留条件! 我们要把条件以一个字符串的形式保存到PageBean的url中!这个任务交给Servlet! pagebean package cn.itcast.cstm.domain; import java.util.List; public class PageBean<T> { privat

页面自定义分页标签,第一次进入页面取不到参数。

问题描述 最近在用SSH做一个项目的时候,使用到一个自定义的分页标签,它先从数据库查询结果,然后将分页参数传到一个pageBean中,然后跳转到页面的时候,根据tld的配置转向PageTag标签类,不过在第一次或者前两次进入页面的时候,action传到页面的值,PageTag类无法接收,之后几次就正常了.用<inputtype="text"name="urlPath"value="<s:propertyvalue="urlPath&q

提升JSP应用程序的七大绝招_JSP编程

你时常被客户抱怨JSP页面响应速度很慢吗?你想过当客户访问次数剧增时,你的WEB应用能承受日益增加的访问量吗?本文讲述了调整JSP和servlet的一些非常实用的方法,它可使你的servlet和JSP页面响应更快,扩展性更强.而且在用户数增加的情况下,系统负载会呈现出平滑上长的趋势.在本文中,我将通过一些实际例子和配置方法使得你的应用程序的性能有出人意料的提升.其中,某些调优技术是在你的编程工作中实现的.而另一些技术是与应用服务器的配置相关的.在本文中,我们将详细地描述怎样通过调整servlet

JSP/Servlet应用程序优化八法_JSP编程

你的J2EE应用是不是运行的很慢?它们能不能承受住不断上升的访问量?本文讲述了开发高性能.高弹性的JSP页面和Servlet的性能优化技术.其意思是建立尽可能快的并能适应数量增长的用户及其请求.在本文中,我将带领你学习已经实践和得到证实的性能调整技术,它将大大地提高你的servlet和jsp页面的性能,进而提升J2EE的性能.这些技术的部分用于开发阶段,例如,设计和编码阶段.另一部分技术则与配置相关. 技术1:在HttpServletinit()方法中缓存数据 服务器会在创建servlet实例之