关于分页,网上看了很多文章,相信所有人都会觉得J2EE中实现分页相对于ASP.NET中处理分页实在是一件很痛苦的事..
下面就结合我做的例子说明一下通用的分页标签实现.
先说明一下J2EE实现分页所需要用到的文件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}" /> 即可。
这样就在J2EE中实现了分页功能。
【编辑推荐】