关于分页,网上看了很多文章,相信所有人都会觉得J2EE中实现分页相对于ASP.NET中处理分页实在是一件很痛苦的事..
下面就结合我做的例子说明一下通用的分页标签实现.
先说明一下分页所需要用到的文件 Pager.java (不用说,肯定是保存分页信息的了),PagerHelper.java(处理页面信息) ,PageTag.java(自定义分页标签),还有一个是pagetag.tld文件,分页标签描述文件.
先帖出这四个文件的源码
1、Pager.java
package org.awc.commns;
/**
* 保存分页信息的类
*
* @author Administrator
*
*/
public class Pager {
private int totalRows; // 总行数
private int pageSize; // 每页显示的行数
private int currentPage; // 当前页号
private int totalPages; // 总页数
private int startRow; // 当前页在数据库中的起始行
private String linkUrl; // 要跳转的URL
public Pager() {
}
public Pager(int _totalRows,int _pageSize) {
totalRows = _totalRows;
pageSize = _pageSize;
totalPages = totalRows / pageSize;
int mod = totalRows % pageSize;
if (mod > 0) {
totalPages++;
}
currentPage = 1;
startRow = 0;
}
//此处略去属性的getter和setter方法
/**
* 设定hibernate查询的起始行数
*
* @param currentPage
*/
public void setStart(int currentPage) {
this.currentPage = currentPage;
startRow = (currentPage - 1) * pageSize;
}
}
2、PagerHelper.java
import javax.servlet.http.*;
/**
* 控制分页的类
*
* @author Administrator
*
*/
public class PagerHelper {
public static Pager getPager(HttpServletRequest httpServletRequest,
int totalRows,int pageSize) {
// 定义pager对象,用于传到页面
Pager pager = new Pager(totalRows,pageSize);
// 从Request对象中获取当前页号
String currentPage = httpServletRequest.getParameter("cpage");
// 如果当前页号为空,表示为首次查询该页
// 如果不为空,则刷新pager对象,输入当前页号等信息
if (currentPage != null) {
pager.setStart(Integer.parseInt(currentPage));
}
else {
pager.setStart(1);
}
return pager;
}
}
3、PageTag.java
import java.io.IOException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class PageTag extends TagSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
private Pager pager;
public int doStartTag() {
try {
JspWriter out = pageContext.getOut();
out.print("第 " + pager.getCurrentPage() + " 页/共 "
+ (pager.getTotalPages()) + " 页");
if (pager.getCurrentPage() == 1) {
out.print("[最首页]");
out.print("[上一页]");
}
if (pager.getCurrentPage() != 1) {
out.print("[<a href='" + pager.getLinkUrl()
+ "&cpage=1'>最首页</a>]");
out.print("[<a href='" + pager.getLinkUrl() + "&cpage="
+ (pager.getCurrentPage() - 1) + "'>上一页</a>]");
}
for (int i = pager.getCurrentPage() - 3; i <= pager
.getCurrentPage() + 3; i++) {
if (i <= 0 || i > pager.getTotalPages()) {
continue;
}
if (i == pager.getCurrentPage()) {
out
.print("[<span style='color:#FF0000; border: 1px solid #cccccc; font-weight:bold; width:15px;text-align: center;'> "
+ i + " </span>]");
} else {
out.print("[<a href='" + pager.getLinkUrl() + "&cpage=" + i
+ "'> " + i + " </a>]");
}
}
if (pager.getCurrentPage() == pager.getTotalPages()
|| pager.getTotalPages() == 0) {
out.print("[下一页]");
out.print("[最末页]");
}
if (pager.getCurrentPage() != pager.getTotalPages()
&& pager.getTotalPages() != 0) {
out.print("[<a href='" + pager.getLinkUrl() + "&cpage="
+ (pager.getCurrentPage() + 1) + "'>下一页</a>]");
out.print("[<a href='" + pager.getLinkUrl() + "&cpage="
+ (pager.getTotalPages()) + "'>最末页</a>]");
}
out.flush();
} catch (IOException ex) {
ex.printStackTrace();
}
return super.SKIP_BODY;
}
public int doEndTag() {
return super.EVAL_PAGE;
}
public void setPager(Pager pager) {
this.pager = pager;
}
public Pager getPager() {
return pager;
}
}
4、pagetag.tld
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>My Tags</short-name>
<tag>
<name>page</name>
<tag-class>org.awc.commns.PageTag</tag-class><!-- PageTag.java具体项目路径-->
<body-content>empty</body-content>
<attribute>
<name>pager</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>org.awc.commns.Pager</type><!-- Pager.java具体项目路径-->
</attribute>
</tag>
</taglib>
以上四个文件为固定,其余部分代码示例如下:
Action或者Servlet部分:
public ActionForward display(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
//不相关代码略去
int totalRows;// 记录总行数
Pager pager = null; // 页面信息
int pageSize = 15;
try {
totalRows = tservice.getTotalRowsBySubType(tsid); // 获取指定主题总行数
pager = PagerHelper.getPager(request, totalRows, pageSize); // 初始化分页对象
pager.setLinkUrl("index.asp?method=display&stid=" + tsid); // 设置跳转路径
request.setAttribute("pb", pager); // 将分页信息保存在Request对象
topicList = tservice.findTopicByStid(tsid, pager); // 根据分页信息查询指定的主题
request.setAttribute("results", topicList);
return mapping.findForward("index");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mapping.findForward("fail");
}
JSP 页面部分:
1、在页面开始部分导入标签库文件 :<%@ taglib prefix="page" uri="WEB-INF/pageTld/pagetag.tld"%> --具体路径视具体项目而定
2、在需要加入分页信息的部分加上<page:page pager="${pb}" /> 即可。
OK,分页搞定,效果如下:第 5 页/共 12 页[最首页][上一页][ 2 ][ 3 ][ 4 ][ 5 ][ 6 ][ 7 ][ 8 ][下一页][最末页]