J2EE實(shí)現(xiàn)分頁(yè):Hibernate自定義標(biāo)簽
關(guān)于分頁(yè),網(wǎng)上看了很多文章,相信所有人都會(huì)覺(jué)得J2EE中實(shí)現(xiàn)分頁(yè)相對(duì)于ASP.NET中處理分頁(yè)實(shí)在是一件很痛苦的事..
下面就結(jié)合我做的例子說(shuō)明一下通用的分頁(yè)標(biāo)簽實(shí)現(xiàn).
先說(shuō)明一下J2EE實(shí)現(xiàn)分頁(yè)所需要用到的文件Pager.java (不用說(shuō),肯定是保存分頁(yè)信息的了),PagerHelper.java(處理頁(yè)面信息) ,PageTag.java(自定義分頁(yè)標(biāo)簽),還有一個(gè)是pagetag.tld文件,分頁(yè)標(biāo)簽描述文件.
先帖出這四個(gè)文件的源碼
1、Pager.java
- package org.awc.commns;
- /**
- * 保存分頁(yè)信息的類(lèi)
- *
- * @author Administrator
- *
- */
- public class Pager {
- private int totalRows; // 總行數(shù)
- private int pageSize; // 每頁(yè)顯示的行數(shù)
- private int currentPage; // 當(dāng)前頁(yè)號(hào)
- private int totalPages; // 總頁(yè)數(shù)
- private int startRow; // 當(dāng)前頁(yè)在數(shù)據(jù)庫(kù)中的起始行
- private String linkUrl; // 要跳轉(zhuǎn)的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方法
- /**
- * 設(shè)定hibernate查詢的起始行數(shù)
- *
- * @param currentPage
- */
- public void setStart(int currentPage) {
- this.currentPage = currentPage;
- startRow = (currentPage - 1) * pageSize;
- }
- }
2、PagerHelper.java
- import javax.servlet.http.*;
- /**
- * 控制分頁(yè)的類(lèi)
- *
- * @author Administrator
- *
- */
- public class PagerHelper {
- public static Pager getPager(HttpServletRequest httpServletRequest,
- int totalRows,int pageSize) {
- // 定義pager對(duì)象,用于傳到頁(yè)面
- Pager pager = new Pager(totalRows,pageSize);
- // 從Request對(duì)象中獲取當(dāng)前頁(yè)號(hào)
- String currentPage = httpServletRequest.getParameter("cpage");
- // 如果當(dāng)前頁(yè)號(hào)為空,表示為***查詢?cè)擁?yè)
- // 如果不為空,則刷新pager對(duì)象,輸入當(dāng)前頁(yè)號(hào)等信息
- 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() + " 頁(yè)/共 "
- + (pager.getTotalPages()) + " 頁(yè)");
- if (pager.getCurrentPage() == 1) {
- out.print("[最首頁(yè)]");
- out.print("[上一頁(yè)]");
- }
- if (pager.getCurrentPage() != 1) {
- out.print("[< a href='" + pager.getLinkUrl()
- + "&cpage=1'>最首頁(yè)< /a>]");
- out.print("[< a href='" + pager.getLinkUrl() + "&cpage="
- + (pager.getCurrentPage() - 1) + "'>上一頁(yè)< /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("[下一頁(yè)]");
- out.print("[最末頁(yè)]");
- }
- if (pager.getCurrentPage() != pager.getTotalPages()
- && pager.getTotalPages() != 0) {
- out.print("[< a href='" + pager.getLinkUrl() + "&cpage="
- + (pager.getCurrentPage() + 1) + "'>下一頁(yè)< /a>]");
- out.print("[< a href='" + pager.getLinkUrl() + "&cpage="
- + (pager.getTotalPages()) + "'>最末頁(yè)< /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具體項(xiàng)目路徑-->
- < body-content>empty< /body-content>
- < attribute>
- < name>pager< /name>
- < required>true< /required>
- < rtexprvalue>true< /rtexprvalue>
- < type>org.awc.commns.Pager< /type>< !-- Pager.java具體項(xiàng)目路徑-->
- < /attribute>
- < /tag>
- < /taglib>
以上四個(gè)文件為固定,其余部分代碼示例如下:
Action或者Servlet部分:
- public ActionForward display(ActionMapping mapping, ActionForm form,
- HttpServletRequest request, HttpServletResponse response) {
- //不相關(guān)代碼略去
- int totalRows;// 記錄總行數(shù)
- Pager pager = null; // 頁(yè)面信息
- int pageSize = 15;
- try {
- totalRows = tservice.getTotalRowsBySubType(tsid); // 獲取指定主題總行數(shù)
- pager = PagerHelper.getPager(request, totalRows, pageSize); // 初始化分頁(yè)對(duì)象
- pager.setLinkUrl("index.asp?method=display&stid=" + tsid); // 設(shè)置跳轉(zhuǎn)路徑
- request.setAttribute("pb", pager); // 將分頁(yè)信息保存在Request對(duì)象
- topicList = tservice.findTopicByStid(tsid, pager); // 根據(jù)分頁(yè)信息查詢指定的主題
- request.setAttribute("results", topicList);
- return mapping.findForward("index");
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return mapping.findForward("fail");
- }
JSP 頁(yè)面部分:
1、在頁(yè)面開(kāi)始部分導(dǎo)入標(biāo)簽庫(kù)文件 :< %@ taglib prefix="page" uri="WEB-INF/pageTld/pagetag.tld"%> --具體路徑視具體項(xiàng)目而定
2、在需要加入分頁(yè)信息的部分加上< page:page pager="${pb}" /> 即可。
這樣就在J2EE中實(shí)現(xiàn)了分頁(yè)功能。
【編輯推薦】