package com.jmail.code.util;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Enumeration;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
/**
* @author zero
*
* <pre>
* 分页类
* 使用:new Page(request).setRowsCount(120).useGroupPage(10).setNextPage(" >>").setPrePage("<< ").buildPagination();
* 控制器中可以使用Page 提供的getParameterValue() 等方法获取传来的数据
*
* 获取总记录数:${rowsCount}
* 获取总页数:${totalPages}
* 获取当前页数:${p}
* 获取当前页第一条记录序号:${firstRow}
* 获取分页代码:${pagesUrl}
* 获取Page对象:${page}
*
* 定义样式参考:
* .currentPage: 定义当前页样式
* .otherPage: 定义非当前页样式
* .prePage: 上一页
* .nextPage: 下一页
* </pre>
*/
public class Page {
private static final String PAGE = "p";
public static final String ENCODING_UTF8 = "utf-8";
public static final String ENCODING_GBK = "gbk";
public static final int PAGESIZE_5 = 5;
public static final int PAGESIZE_10 = 10;
public static final int PAGESIZE_15 = 15;
public static final int PAGESIZE_20 = 20;
public static final int PAGESIZE_30 = 30;
public static final int PAGESIZE_50 = 50;
public static final int PAGESIZE_100 = 100;
// private boolean useEncoding=false;
private String encoding = ENCODING_UTF8;
private int totalPages;
private int currentPage;
private StringBuilder pagesUrl = new StringBuilder();
// 配置项
private int pageSize = PAGESIZE_10;
private int groupPageSize = 5;
private boolean useGroupPage = false;
private HttpServletRequest request;
private int rowsCount;
private int currentPageFirstRow;
// 显示文本
private String prePage = "上一页";
private String nextPage = "下一页";
private String firstPage = "首页";
private String lastPage = "尾页";
private boolean displayPreAndNextPageLink = false;
// 当前页数据
private List<Object> data;
public Page(HttpServletRequest request) {
this.init(request);
this.request = request;
}
/**
* @param rowsCount
* 总记录数
* @param request
* HttpServletRequest
*/
public Page(int rowsCount, HttpServletRequest request) {
this.init(request);
this.rowsCount = rowsCount;
this.request = request;
}
private void init(HttpServletRequest request) {
String cp = request.getParameter(PAGE);
if (cp == null) {
request.setAttribute(PAGE, 1);
this.currentPage = 1;
} else {
this.currentPage = Integer.parseInt(request.getParameter(PAGE));
}
}
public boolean isDisplayPreAndNextPageLink() {
return displayPreAndNextPageLink;
}
/**
* 当当前页面为第一页时,是否显示"上一页".
*
* @return
*/
public Page displayPreAndNextPageLink() {
this.displayPreAndNextPageLink = true;
return this;
}
public HttpServletRequest getRequest() {
return request;
}
public String getPagesUrl() {
return this.pagesUrl.toString();
}
public int getTotalPages() {
return totalPages;
}
public int getCurrentPage() {
return currentPage;
}
public int getPageSize() {
return pageSize;
}
public int getRowsCount() {
return rowsCount;
}
public Page setRowsCount(int rowsCount) {
this.rowsCount = rowsCount;
return this;
}
public int getGroupPageSize() {
return groupPageSize;
}
public boolean isGroupPage() {
return useGroupPage;
}
public Page setPageSize(int pageSize) {
this.pageSize = pageSize;
return this;
}
/**
* 使用组分,默认不使用.
*
* @return
*/
public Page useGroupPage() {
this.useGroupPage = true;
return this;
}
public Page useGroupPage(int size) {
this.useGroupPage = true;
this.groupPageSize = size;
return this;
}
public int getCurrentPageFirstRow() {
return currentPageFirstRow = (this.currentPage - 1) * pageSize;
}
/**
* 设置上一页的显示文本
*
* @param prePage
*/
public Page setPrePage(String prePage) {
this.prePage = prePage;
return this;
}
/**
* 设置下一页的显示文本
*
* @param nextPage
*/
public Page setNextPage(String nextPage) {
this.nextPage = nextPage;
return this;
}
/**
* 同页面编码,默认为UTF-8
*
* @param encoding
* @return
*/
public Page useEncoding(String encoding) {
this.encoding = encoding;
return this;
}
public void setData(List<Object> data) {
this.data = data;
}
public void buildPagination() {
this.totalPages = (rowsCount + pageSize - 1) / pageSize;
StringBuilder next = new StringBuilder();
StringBuilder pre = new StringBuilder();
StringBuilder otherPageLinks = null;
StringBuilder url = new StringBuilder(128);
String baseUrl = request.getRequestURI();
// 构造查询字符串
StringBuilder query = new StringBuilder();
query.append(baseUrl);
query.append("?");
Enumeration<?> enume = request.getParameterNames();
try {
while (enume.hasMoreElements()) {
String parName = (String) enume.nextElement();
if ("uc".equalsIgnoreCase(parName))
continue;
if (!PAGE.equalsIgnoreCase(parName)) {
String v = request.getParameter(parName);
if (v == null || v.trim().length() == 0)
continue;
String value = getParameterValue(parName);
query.append(parName);
query.append("=");
query.append(URLEncoder.encode(value, encoding));
query.append("&");
request.setAttribute(parName, value);// ...
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
query.append("uc=y&p=");
url.append(query);
if (this.currentPage > this.totalPages || this.currentPage < 1) {
this.currentPage = 1;
}
// 下一页
if (this.currentPage > 0 && this.currentPage < totalPages) {
next.append("<a href='").append(url).append(this.currentPage + 1)
.append("' class='nextPage'>").append(nextPage)
.append("</a>");
} else {
if (this.displayPreAndNextPageLink && totalPages > 1) {
next.append("<a>").append(this.nextPage).append("</a>");
}
}
// 上一页
if (this.currentPage > 1 && this.currentPage <= totalPages) {
pre.append("<a href='").append(url).append(this.currentPage - 1)
.append("' class='prePage'>").append(prePage)
.append("</a>");
} else {
if (this.displayPreAndNextPageLink && totalPages > 1) {
pre.append("<a>").append(this.prePage).append("</a>");
}
}
this.pagesUrl.append(pre);// 上一页
// -----------------------组分页------------------
if (useGroupPage && this.totalPages > 1) {
otherPageLinks = new StringBuilder(64);
if (this.groupPageSize > this.totalPages) {
this.groupPageSize = this.totalPages;
}
int tmp = groupPageSize / 2;
int leftFirst = 1;
if (this.currentPage > tmp + 1) {
leftFirst = this.currentPage - tmp;// 最左边页码
}
if (this.currentPage + tmp > this.totalPages) {
leftFirst = this.totalPages - this.groupPageSize + 1;// 最左边页码
}
for (int i = leftFirst; i < this.groupPageSize + leftFirst; i++) {
if (i == this.currentPage) {
otherPageLinks.append("<a class='currentPage'><span>")
.append(i).append("</span></a>");
} else if (i <= this.totalPages) {
otherPageLinks.append("<a href='").append(url).append(i)
.append("' class='otherPage'><span>").append(i)
.append("</span></a>");
}
}
this.pagesUrl.append(otherPageLinks);// 组分页
}
this.pagesUrl.append(next);// 下一页
currentPageFirstRow = (this.currentPage - 1) * pageSize;
request.setAttribute(PAGE, this.currentPage);
request.setAttribute("firstRow", this.currentPageFirstRow);
request.setAttribute("totalPages", this.totalPages);
request.setAttribute("pageSize", this.pageSize);
request.setAttribute("rowsCount", this.rowsCount);
request.setAttribute("pagesUrl", this.pagesUrl);
System.out.println(pagesUrl);
request.setAttribute("data", data);
request.setAttribute("page", this);
}
public String getParameterValue(String name) {
return Page.getParameterValue(request, name, encoding);
}
public static String getParameterValue(HttpServletRequest request,String name) {
return Page.getParameterValue(request, name, ENCODING_UTF8);
}
public static String getParameterValue(HttpServletRequest request,
String name, String encoding) {
if (name == null)
return null;
String value = request.getParameter(name);
if (value == null)
return null;
if ("post".equalsIgnoreCase(request.getMethod())) {
return value.trim();
} else {
try {
return new String(value.trim().getBytes("iso8859-1"), encoding);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}// .....
return null;
}
}
分享到:
相关推荐
### JSP分页技术详解:初学者的完美指南 #### 引言 在现代Web开发中,数据展示的效率和用户体验至关重要。对于大型数据库或数据集的处理,一次性加载所有数据不仅消耗大量资源,还可能导致页面加载缓慢,严重影响...
二、JSP分页步骤 1. **计算总页数**:首先,我们需要知道所有数据的数量,然后根据每页显示的数据量来计算总页数。这可以通过执行SQL查询获取数据总数,然后用总数除以每页数量得到。 2. **接收用户请求**:用户...
java实现分页 jsp分页 分页java实现分页 jsp分页 分页java实现分页 jsp分页 分页java实现分页 jsp分页 分页java实现分页 jsp分页 分页java实现分页 jsp分页 分页
本篇文章将深入探讨“目前最好的JSP分页技术”,并介绍其核心概念、优势以及实现步骤。 首先,我们要明确的是,没有绝对“最好”的技术,只有最合适的解决方案。选择分页技术通常要考虑性能、易用性、可维护性和...
`jsp分页循环显示`就是一种这样的技术,它结合了`JSP(JavaServer Pages)`和`Servlet`,用于从数据库获取数据并以分页的方式在网页上呈现。本篇文章将深入讲解这一技术的实现原理及步骤。 首先,我们需要理解JSP和...
jsp 分页jsp 分页jsp 分页jsp 分页jsp 分页jsp 分页jsp 分页jsp 分页jsp 分页jsp 分页jsp 分页jsp 分页jsp 分页jsp 分页jsp 分页jsp 分页jsp 分页jsp 分页jsp 分页jsp 分页jsp 分页jsp 分页jsp 分页jsp 分页jsp 分页...
本文件“JSP分页技术(多种方法)”中,将探讨几种常见的JSP分页实现方法。 1. **基于SQL的分页** 这是最基础的分页方法,通过在SQL查询语句中添加`LIMIT`和`OFFSET`或`ROWNUM`(根据数据库类型)来实现。例如,在...
在"分页的实现.rtf"文件中,可能包含了一个具体的JSP分页实现案例,包括SQL查询、Servlet处理逻辑以及JSP页面的代码片段,通过阅读和理解这个案例,可以加深对JSP分页实现的理解。 总结,JSP分页实现是一个涉及到...
**JSP分页技术详解** 在Web开发中,分页是一种常见的用户界面设计技术,它使得大量数据可以按页展示,提高用户体验并减轻服务器压力。本示例是基于JSP(JavaServer Pages)和SQL Server 2005构建的一个简单易懂的...
本资源提供了一个非常好用的JSP分页标签,它简化了在JSP页面上实现分页的过程,无需编写过多的Java代码,只需在JSP页面上插入特定的标签即可。 1. **JSP分页标签**:JSP分页标签是一种预定义的、可重用的组件,可以...
"jsp 分页源码.rar"这个压缩包可能包含了一个完整的JSP分页实现的源代码示例,让我们来详细探讨一下JSP分页的相关知识点。 1. **分页原理**: - 分页的基本思想是将大量数据分成若干小块(每块称为一页),每次只...
【纯jsp分页技术详解】 在Java Web开发中,分页功能是不可或缺的一部分,它能够帮助用户有效地管理和浏览大量数据,提升用户体验。本教程将深入探讨如何在JSP(Java Server Pages)中实现纯jsp分页,不依赖任何封装...
**jsp分页技术算法详解** 在Web开发中,分页技术是必不可少的,尤其是在处理大量数据展示时。JSP(JavaServer Pages)作为Java的一种视图技术,提供了强大的功能来实现用户界面的动态生成。本篇文章将深入探讨JSP中...
**jsp分页插件**是一种在网页应用中实现数据分页显示的重要工具,尤其是在处理大量数据时,分页能够提高用户体验,避免一次性加载过多数据导致页面加载缓慢或资源浪费。这款名为"Codejia.Com"的插件因其简单易用和...
"通过servlet实现jsp分页技术"的主题旨在讲解如何在Java Web环境下,利用Servlet和JSP进行数据的分页显示。下面将详细介绍这个过程,包括基本概念、步骤和关键点。 首先,我们需要理解分页的基本概念。分页是将大量...
"封装好直接使用的jsp分页插件"正是一款针对这一需求设计的工具,它能够简化开发过程,使开发者能够快速实现分页功能,而无需关注底层复杂的逻辑。 该插件适用于jsp与servlet的原生组合,同时对流行的SSH(Struts2 ...
### JSP分页技术详解与实现 #### 一、引言 JSP(JavaServer Pages)是一种基于Java的服务器端动态网页技术标准,用于生成动态HTML页面。在处理大量数据时,分页显示是一个非常实用的功能,它可以提高用户体验,减少...
【纯jsp分页查询】是一种在Web开发中常见的技术,主要应用于数据量较大时,为了提高用户体验和页面加载速度,将大量数据分为多个部分(页)进行显示。在这个项目中,开发者使用了JSP(JavaServer Pages)技术,这是...