J2EE实现分页:Hibernate自定义标签

开发 后端
本文通过例子讲述了通用的分页标签实现。相信所有人都会觉得J2EE实现分页相对于ASP.NET中处理分页实在是一件很痛苦的事,本文代码通过四个文件,一个action或Servlet,完成了在JSP页面上的分页。

关于分页,网上看了很多文章,相信所有人都会觉得J2EE中实现分页相对于ASP.NET中处理分页实在是一件很痛苦的事..

下面就结合我做的例子说明一下通用的分页标签实现.

先说明一下J2EE实现分页所需要用到的文件Pager.java (不用说,肯定是保存分页信息的了),PagerHelper.java(处理页面信息) ,PageTag.java(自定义分页标签),还有一个是pagetag.tld文件,分页标签描述文件.

先帖出这四个文件的源码

1、Pager.java

  1. package org.awc.commns;  
  2.  
  3. /**  
  4. * 保存分页信息的类  
  5.  
  6. * @author Administrator  
  7.  
  8. */ 
  9. public class Pager {  
  10. private int totalRows; // 总行数  
  11.  
  12. private int pageSize; // 每页显示的行数  
  13.  
  14. private int currentPage; // 当前页号  
  15.  
  16. private int totalPages; // 总页数  
  17.  
  18. private int startRow; // 当前页在数据库中的起始行  
  19.  
  20. private String linkUrl; // 要跳转的URL  
  21.  
  22. public Pager() {  
  23. }  
  24.  
  25. public Pager(int _totalRows,int _pageSize) {  
  26.    totalRows = _totalRows;  
  27.    pageSize = _pageSize;  
  28.    totalPages = totalRows / pageSize;  
  29.    int mod = totalRows % pageSize;  
  30.    if (mod > 0) {  
  31.     totalPages++;  
  32.    }  
  33.    currentPage = 1;  
  34.    startRow = 0;  
  35. }  
  36.  
  37. //此处略去属性的getter和setter方法  
  38.  
  39.    /**  
  40. * 设定hibernate查询的起始行数  
  41.  
  42. * @param currentPage  
  43. */ 
  44.  
  45. public void setStart(int currentPage) {  
  46.    this.currentPage = currentPage;  
  47.    startRow = (currentPage - 1) * pageSize;  
  48. }  
  49. }  

2、PagerHelper.java

  1. import javax.servlet.http.*;  
  2.  
  3. /**  
  4. * 控制分页的类  
  5.  
  6. * @author Administrator  
  7.  
  8. */ 
  9. public class PagerHelper {  
  10.  
  11. public static Pager getPager(HttpServletRequest httpServletRequest,  
  12.     int totalRows,int pageSize) {  
  13.  
  14.    // 定义pager对象,用于传到页面  
  15.    Pager pager = new Pager(totalRows,pageSize);  
  16.  
  17.    // 从Request对象中获取当前页号  
  18.    String currentPage = httpServletRequest.getParameter("cpage");  
  19.  
  20.    // 如果当前页号为空,表示为***查询该页  
  21.    // 如果不为空,则刷新pager对象,输入当前页号等信息  
  22.    if (currentPage != null) {  
  23.     pager.setStart(Integer.parseInt(currentPage));  
  24.    }  
  25.    else {  
  26.     pager.setStart(1);  
  27.    }  
  28.     
  29.    return pager;  
  30. }  
  31. }  

3、PageTag.java

  1. import java.io.IOException;  
  2.  
  3. import javax.servlet.jsp.JspWriter;  
  4. import javax.servlet.jsp.tagext.TagSupport;  
  5.  
  6. public class PageTag extends TagSupport {  
  7. /**  
  8.  
  9. */ 
  10. private static final long serialVersionUID = 1L;  
  11.  
  12. private Pager pager;  
  13.  
  14. public int doStartTag() {  
  15.    try {  
  16.     JspWriter out = pageContext.getOut();  
  17.  
  18.     out.print("第 " + pager.getCurrentPage() + " 页/共 " 
  19.       + (pager.getTotalPages()) + " 页");  
  20.  
  21.     if (pager.getCurrentPage() == 1) {  
  22.      out.print("[最首页]");  
  23.      out.print("[上一页]");  
  24.     }  
  25.     if (pager.getCurrentPage() != 1) {  
  26.      out.print("[< a href='" + pager.getLinkUrl()  
  27.        + "&cpage=1'>最首页< /a>]");  
  28.      out.print("[< a href='" + pager.getLinkUrl() + "&cpage=" 
  29.        + (pager.getCurrentPage() - 1) + "'>上一页< /a>]");  
  30.     }  
  31.  
  32.     for (int i = pager.getCurrentPage() - 3; i < = pager  
  33.       .getCurrentPage() + 3; i++) {  
  34.      if (i < = 0 || i > pager.getTotalPages()) {  
  35.       continue;  
  36.      }  
  37.      if (i == pager.getCurrentPage()) {  
  38.       out  
  39.         .print("[< span style='color:#FF0000; border: 1px solid #cccccc; font-weight:bold; width:15px;text-align: center;'> " 
  40.           + i + " < /span>]");  
  41.      } else {  
  42.       out.print("[< a href='" + pager.getLinkUrl() + "&cpage=" + i  
  43.         + "'> " + i + " < /a>]");  
  44.      }  
  45.     }  
  46.     if (pager.getCurrentPage() == pager.getTotalPages()  
  47.       || pager.getTotalPages() == 0) {  
  48.      out.print("[下一页]");  
  49.      out.print("[最末页]");  
  50.  
  51.     }  
  52.     if (pager.getCurrentPage() != pager.getTotalPages()  
  53.       && pager.getTotalPages() != 0) {  
  54.      out.print("[< a href='" + pager.getLinkUrl() + "&cpage=" 
  55.        + (pager.getCurrentPage() + 1) + "'>下一页< /a>]");  
  56.      out.print("[< a href='" + pager.getLinkUrl() + "&cpage=" 
  57.        + (pager.getTotalPages()) + "'>最末页< /a>]");  
  58.     }  
  59.     out.flush();  
  60.    } catch (IOException ex) {  
  61.     ex.printStackTrace();  
  62.    }  
  63.    return super.SKIP_BODY;  
  64. }  
  65.  
  66. public int doEndTag() {  
  67.    return super.EVAL_PAGE;  
  68. }  
  69.  
  70. public void setPager(Pager pager) {  
  71.    this.pager = pager;  
  72. }  
  73.  
  74. public Pager getPager() {  
  75.    return pager;  
  76. }  
  77. }  

4、pagetag.tld

  1. < !DOCTYPE taglib  
  2. PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"  
  3.    "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> 
  4. < taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor"> 
  5. < tlib-version>1.0< /tlib-version> 
  6. < jsp-version>1.2< /jsp-version> 
  7. < short-name>My Tags< /short-name> 
  8. < tag> 
  9.     < name>page< /name> 
  10.     < tag-class>org.awc.commns.PageTag< /tag-class>< !-- PageTag.java具体项目路径--> 
  11.     < body-content>empty< /body-content> 
  12.     < attribute> 
  13.       < name>pager< /name> 
  14.       < required>true< /required> 
  15.       < rtexprvalue>true< /rtexprvalue> 
  16.       < type>org.awc.commns.Pager< /type>< !-- Pager.java具体项目路径--> 
  17.     < /attribute> 
  18. < /tag> 
  19. < /taglib> 

以上四个文件为固定,其余部分代码示例如下:

Action或者Servlet部分:

  1. public ActionForward display(ActionMapping mapping, ActionForm form,  
  2.     HttpServletRequest request, HttpServletResponse response) {  
  3. //不相关代码略去  
  4.    int totalRows;// 记录总行数  
  5.    Pager pager = null// 页面信息  
  6.    int pageSize = 15;  
  7.    try {  
  8.     totalRows = tservice.getTotalRowsBySubType(tsid); // 获取指定主题总行数  
  9.     pager = PagerHelper.getPager(request, totalRows, pageSize); // 初始化分页对象  
  10.     pager.setLinkUrl("index.asp?method=display&stid=" + tsid); // 设置跳转路径  
  11.     request.setAttribute("pb", pager); // 将分页信息保存在Request对象  
  12.  
  13.     topicList = tservice.findTopicByStid(tsid, pager); // 根据分页信息查询指定的主题  
  14.     request.setAttribute("results", topicList);  
  15.     return mapping.findForward("index");  
  16.    } catch (Exception e) {  
  17.     // TODO Auto-generated catch block  
  18.     e.printStackTrace();  
  19.    }  
  20.    return mapping.findForward("fail");  
  21. }  

JSP 页面部分:

1、在页面开始部分导入标签库文件 :< %@ taglib prefix="page" uri="WEB-INF/pageTld/pagetag.tld"%> --具体路径视具体项目而定

2、在需要加入分页信息的部分加上< page:page pager="${pb}" /> 即可。

这样就在J2EE中实现了分页功能。

【编辑推荐】

  1. Hibernate中使用Criteria查询实例
  2. Hibernate中使用DetchedCriteria
  3. Hibernate之Criteria进阶查询
  4. Hibernate之Criteria基本查询
  5. Criteria查询语句的补充:高级特性
责任编辑:book05 来源: 百度博客
相关推荐

2009-06-16 13:27:59

Hibernate x

2009-06-23 08:06:46

J2EE体系架构J2EE模型J2EE设计模式

2009-06-16 11:14:00

Hibernate+SJ2EE应用开发

2009-06-10 14:10:23

J2EE学习J2EE是什么

2009-06-11 17:06:11

J2EE历史Java EE概述

2009-06-10 13:37:06

J2EE可伸缩性J2EE灵活性J2EE维护

2009-06-23 16:48:26

J2EE常见问题J2EE平台

2009-06-22 17:05:41

Java EEJava企业应用

2009-06-18 16:13:14

J2EE开发

2009-06-22 16:21:02

J2EE线程

2009-06-18 15:54:57

J2EE下使用JNDI

2009-06-22 17:34:40

J2EE架构

2009-06-23 08:12:48

J2EE调用存储过程

2013-05-28 11:29:19

struts2

2019-01-08 16:26:43

Java EEJ2EEJakarta EE

2009-06-23 16:50:24

2009-06-23 16:52:55

J2EE缩写名词

2009-06-25 13:22:00

J2EE常用Jar包

2009-06-10 13:30:32

J2EE四层模型客户层Web层

2009-06-08 21:34:09

J2EEJ2SEJ2ME
点赞
收藏

51CTO技术栈公众号