Hibernate加Struts2分页查询

关于分页,网上看了很多文章,相信所有人都会觉得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 ][下一页][最末页]

你可能感兴趣的:(Hibernate,jsp,servlet,asp.net,asp)