自定义标签分页源代码
第一步:创建一个计算分页总数和生成分页脚本的类;PageControllerTag.java
源代码如下:
package org.luojs.tag;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class PageControllerTag extends BodyTagSupport {
/** 每页显示的记录数(标签的属性) */
private int pageSize = 5;
/** 目的地(标签的属性) */
private String gotoURI;
/** 总记录数名 */
public static final String TOTAL = "total";
/** 当前页号名 */
public static final String PAGNENO = "pageNo";
/** 每页要显示的记录数名 */
public static final String RECORDCOUNT = "pageSize";
/** 目的地名 */
public static final String GOTOURI = "gotoURI";
// 标签处理程序
public int doStartTag() throws JspException {
/** 当前页号(从请求对象中得到) */
int pageNo = 1;
/** 总记录数(从请求对象中得到) */
int total = 0;
/** 总页数(计算得出) */
int totalPage = 1;
HttpServletRequest request = (HttpServletRequest) pageContext
.getRequest();
// 要输出到页面的HTML文本
StringBuffer sb = new StringBuffer();
sb.append("\r\n<form method='post' action='' ").append(
"name='pageController'>\r\n");
// 获取所有提交的参数(包括查询条件参数)
Enumeration enumeration = request.getParameterNames();
String name = null;
String value = null;
while (enumeration.hasMoreElements()) {
name = (String) enumeration.nextElement();
value = request.getParameter(name);
if (name.equals(RECORDCOUNT)) {
continue;
}
// 从请求对象中获取要跳转到的页号
if (name.equals(PAGNENO)) {
if (null != value && !"".equals(value)) {
pageNo = Integer.parseInt(value);
}
continue;
}
sb.append("<input type='hidden' name='").append(name).append(
"' value='").append(value).append("'/>\r\n");
}
// 把当前页号设置成请求参数
sb.append("<input type='hidden' name='").append(PAGNENO).append(
"' value='").append(pageNo).append("'/>\r\n");
// 从请求对象中获取总记录数
String tot = (String) request.getAttribute(TOTAL);
if (null != tot && !"".equals(tot)) {
total = Integer.parseInt(tot);
}
// 计算总页数
totalPage = getTotalPage(total);
System.out.println("total-->" + total);
sb.append("<br/>\r\n");
sb
.append(" \r\n");
sb.append("共 ").append(totalPage).append(" 页 当前第 ").append(pageNo)
.append(" 页\r\n");
sb
.append(" \r\n");
if (pageNo == 1) {
sb.append("首页");
sb.append(" ");
sb.append("上一页\r\n");
} else {
sb.append("<a href='#' onclick='turnOverPage(1)'>首页</a>\r\n");
sb.append(" ");
sb.append("<a href='#' onclick='turnOverPage(")
.append((pageNo - 1)).append(")'>上一页</a>\r\n");
}
sb.append(" ");
if (pageNo == totalPage) {
sb.append("下一页");
sb.append(" ");
sb.append("尾页\r\n");
} else {
sb.append("<a href='#' onclick='turnOverPage(")
.append((pageNo + 1)).append(")'>下一页</a>\r\n");
sb.append(" ");
sb.append("<a href='#' onclick='turnOverPage(").append(totalPage)
.append(")'>尾页</a>\r\n");
}
sb.append(" ");
sb.append("跳转到<select onChange='turnOverPage(this.value)'>\r\n");
for (int i = 1; i <= totalPage; i++) {
if (i == pageNo) {
sb.append(" <option value='").append(i).append("' selected>第")
.append(i).append("页</option>\r\n");
} else {
sb.append(" <option value='").append(i).append("'>第")
.append(i).append("页</option>\r\n");
}
}
sb.append("</select>\r\n");
sb.append(" \r\n");
sb.append("</form>\r\n");
// 生成提交表单的JS
sb.append("<script language='javascript'>\r\n");
sb.append(" function turnOverPage(no){\r\n");
sb.append(" var form = document.pageController;\r\n");
sb.append(" //页号越界处理\r\n");
sb.append(" if(no").append(">").append(totalPage).append(") {\r\n");
sb.append(" no=").append(totalPage).append(";\r\n");
sb.append(" }\r\n");
sb.append(" if(no").append("<=0){\r\n");
sb.append(" no=1;\r\n");
sb.append(" }\r\n");
sb.append(" form.").append(PAGNENO).append(".value=no;\r\n");
sb.append(" form.action='").append(gotoURI).append("';\r\n");
sb.append(" form.submit();\r\n");
sb.append(" }\r\n");
sb.append("</script>\r\n");
try {
pageContext.getOut().println(sb.toString());
} catch (IOException e) {
e.printStackTrace();
}
return super.doStartTag();
}
public String getGotoURI() {
return gotoURI;
}
public void setGotoURI(String gotoURI) {
this.gotoURI = gotoURI;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
/**
* 根据总记录数得到总页数
*
* @return int 总页数
*/
private int getTotalPage(int total) {
int totalPage = 1;
if (total == 0) {
totalPage = 1;
} else {
totalPage = (total % pageSize == 0) ? (total / pageSize) : (total
/ pageSize + 1);
}
return totalPage;
}
}
发表评论
-
Url传递参数和接收参数时的中文乱码处理
2010-05-27 14:17 8733今天一个朋友又问及url传递中文参数,jsp接收参数时的乱码处 ... -
自定义标签分页源代码---第三章
2009-09-29 14:46 1486五;一个简单的小demo演示分页效果, 1,新建PageCo ... -
自定义标签分页源代码---第二章
2009-09-29 14:44 1354第二步;编写标签描述符文件。标签文件luojspage.tld ... -
在windows下jBoss的安装
2009-09-26 15:40 9871在windows下jBoss的安装 在本文中,我JBo ... -
Jboss+oracle 的JNDI的配置
2009-09-26 15:35 3602Jboss+oracle 的JNDI的配置 1,在jb ... -
Proxool连接池完成一个简单的例子
2009-09-26 15:33 2268很多读者朋友都觉得连接池很神秘,本例将采用Proxool连接池 ... -
事件监听器--监听同一个用户重复登陆
2009-09-26 15:30 2850事件监听器 一;监听同一个用户重复登陆 下面以一个用 ... -
java -- jdbc链接各种数据库
2009-09-26 15:25 1062JDBC连接--Mysql private stat ...
相关推荐
这个压缩包包含了MFC程序开发参考大全的第13至16章的源代码,这四章通常会涵盖MFC中的核心概念、高级主题以及实际应用技巧。现在,我们将深入探讨这些章节可能涉及的知识点。 第13章:对话框和控件 这一章通常会...
在这一章中,读者将学习到ASP.NET中丰富的服务器控件,如按钮、文本框、复选框等,以及如何通过这些控件与用户进行交互。事件处理机制是ASP.NET的核心部分,它允许开发者在用户触发特定操作时执行自定义代码。此外...
《精通ASP.NET+2.0典型模块设计与实现源代码》是一本深入探讨ASP.NET 2.0技术的专业书籍,其光盘资料包含了从第1章到第16章的完整源代码,旨在帮助读者通过实际操作理解并掌握ASP.NET 2.0的关键技术和模块设计。...
相信大家找得到该书的源代码部分 也就是这部分内容 因此我便无偿奉送 让大家下载试试。 若感觉可以方可继续下载电子书部分。 1.本书1~21章所附代码的运行环境 操作系统:Windows Server 2003或Windows XP ...
第1章 逻辑查询处理1 1.1 逻辑查询处理的各个阶段2 1.1.1 逻辑查询处理阶段简介2 1.2 客户/订单场景下的查询示例4 1.3 逻辑查询处理阶段详解5 1.3.1 步骤1:FROM阶段5 1.3.2 步骤2:WHERE阶段9 1.3.3 步骤3:...
Excel VBA与数据库整合应用范例精讲(书及范例源代码) 内容简介 《Excel VBA 数据库整合应用范例精讲》用180个实例介绍了利用Excel VBA来操作数据库(包括Access、SQL Server和FoxPro)的实用方法和技巧。 全书共11...
【标题】:“挑战ASP.NET2.0 for C# 动态网站开发(第6章互动论坛源代码)” 【描述】中的“第5章”可能是输入错误,因为标题提到的是第6章的源代码,所以我们重点讨论的是基于ASP.NET 2.0和C#的动态网站开发中的第...
《精通javaweb整合开发源代码》这一主题深入探讨了如何高效地进行Java Web应用程序的集成开发,特别是在Java EE环境中运用JSP 2.0的高级特性。在第06章“JSP2.0在Java EE中的高级应用”中,我们将重点关注以下几个...
第一章 VC++.NET 编程基础 案例1 第一个Windows程序 案例2 基数转换计数器 案例3 打印杨晖三角形 案例4 确定一个月的天数 案例5 石头、剪子、布猜拳游戏 案例6 创建动态菜单 案例7 创建工具栏 案例8 递归...
光盘源程序9-12章的RAR压缩包文件包含了书中对应章节的源代码,这对于学习者理解和实践这些实例非常有帮助。 9至12章的知识点涵盖了ASP.NET的多个重要主题: 1. **控件与事件处理**:在9章中,可能会讲解如何使用...
028第一个 Docker 应用程序 029运行交互式的容器 030后台运行与停止容器 031Docker 客户端帮助命令 032运行 Web 容器 033指定 Web 容器映射端口 034查看容器进程 035查看容器状态 036批量移除容器 037...
028第一个 Docker 应用程序 029运行交互式的容器 030后台运行与停止容器 031Docker 客户端帮助命令 032运行 Web 容器 033指定 Web 容器映射端口 034查看容器进程 035查看容器状态 036批量移除容器 037Docker Hub ...
第1章 逻辑查询处理1 1.1 逻辑查询处理的各个阶段2 1.1.1 逻辑查询处理阶段简介2 1.2 客户/订单场景下的查询示例4 1.3 逻辑查询处理阶段详解5 1.3.1 步骤1:FROM阶段5 1.3.2 步骤2:WHERE阶段9 1.3.3 步骤3:GROUP ...
1.4 第一个ASENET程序 1.5 本章小结 第2章 C#程序设计基础 2.1 C#语言简介 2.2 C#中的数据类型 2.2.1 值类型 2.2.2 引用类型 2.2.3 装箱和拆箱 2.3 C#语言中的变量和常量 2.3.1 变量 2.3.2 常量 2.4...
实例1 开发第一个Java程序 7 第2章 Java基础类型与运算符(教学视频:39分钟) 9 2.1 基础类型 9 实例2 自动提升 9 实例3 自动转换 10 实例4 常用基础类型之强制转换 11 2.2 运算符 12 ...
第一篇 入门篇 第2章 Hello Grails 6 2.1 Grails的安装 6 2.1.1 JDK的安装与配置 6 2.1.2 Grails的安装 7 2.2 创建Grails工程 8 2.3 Grails的MVC架构 11 2.4 Scaffold应用程序 14 2.5 开发工具的使用 17 2.6 本章小...
#### 第1章 JSP简介 - **1.1 什么是JSP** - JavaServer Pages(简称JSP)是一种基于Java的服务器端脚本技术,用于生成动态网页内容。 - JSP允许开发人员将业务逻辑与表示层分离,使代码更易于维护和扩展。 - **...
Bootstrap使用LESS预处理器编写,源代码组织清晰,方便开发者理解其工作原理。同时,Bootstrap提供了一系列开发工具,如Sass转换、Grunt任务自动化、以及在线定制器,帮助开发者快速构建符合项目需求的定制版...
在"第7章 BLOG"的源代码中,我们可以预期看到有关于博客系统的开发实践。博客系统通常包括用户注册登录、发布文章、评论互动等功能,涉及到的ASP.NET 2.0技术可能有: 1. **用户身份验证与授权**:使用ASP.NET 2.0...
在本资源中,"VC++2005编程实例精粹源代码Part15"主要聚焦于使用Microsoft Visual C++ 2005进行水晶报表(Crystal Reports)的开发。这个部分涵盖了第7章的内容,提供了160到185个具体的编程实例,旨在帮助开发者...