`
aijun980204
  • 浏览: 97510 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Struts+Hibernate开发实践 分页的实现

    博客分类:
  • java
阅读更多

在进行web应用开发的时候经常要进行分页处理,经常看到一些人在问分页处理的问题,现在我把自己的处理方法写在这儿,希望能对需要进行分页处理的朋友有所帮助。

一、在struts中分页有两种结构:
1. 在Action中通过DAO查询出所有的记录,然后加到session或request对象中,传到客户端,由JSP进行分页。
这种方法对于在数据量少的时候很方便,也不影响速度。
2.在Action中每次通过DAO只查询出一页的记录,再传给JSP页面。
这种结构对于数据量大的程序很好,但对于数据量小的情况,会增加对服务器的请求,加大服务器的负载。
二、Hibernate查询
由于在Hibernate中直接提供了对数据库定点定量的查询方法,所以我采用的是第2种方法。

如:
从第1万条开始取出100条记录
Query q = session.createQuery("from Cat as c");

q.setFirstResult(10000);
q.setMaxResults(100);
List l = q.list();

三、具体实现

1.Pager类

package com.jpcf.db.helper;
import java.math.*;
public class Pager {
private int totalRows; //总行数
private int pageSize = 10; //每页显示的行数
private int currentPage; //当前页号
private int totalPages; //总页数
private int startRow; //当前页在数据库中的起始行
public Pager() {
}
public Pager(int _totalRows) {
totalRows = _totalRows;
totalPages=totalRows/pageSize;
int mod=totalRows%pageSize;
if(mod>0){
totalPages++;
}
currentPage = 1;
startRow = 0;
}
public int getStartRow() {
return startRow;
}
public int getTotalPages() {
return totalPages;
}
public int getCurrentPage() {
return currentPage;
}
public int getPageSize() {
return pageSize;
}
public void setTotalRows(int totalRows) {
this.totalRows = totalRows;
}
public void setStartRow(int startRow) {
this.startRow = startRow;
}
public void setTotalPages(int totalPages) {
this.totalPages = totalPages;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalRows() {
return totalRows;
}
public void first() {
currentPage = 1;
startRow = 0;
}
public void previous() {
if (currentPage == 1) {
return;
}
currentPage--;
startRow = (currentPage - 1) * pageSize;
}
public void next() {
if (currentPage < totalPages) {
currentPage++;
}
startRow = (currentPage - 1) * pageSize;
}
public void last() {
currentPage = totalPages;
startRow = (currentPage - 1) * pageSize;
}
public void refresh(int _currentPage) {
currentPage = _currentPage;
if (currentPage > totalPages) {
last();
}
}
}

Pager类用于计算首页、前一页、下一页、尾页的在数据库中的起始行,当前的页码。

2.PagerHelp类

package com.jpcf.db.helper;
import javax.servlet.http.*;
public class PagerHelper {
public static Pager getPager(HttpServletRequest httpServletRequest,
int totalRows) {
//定义pager对象,用于传到页面
Pager pager = new Pager(totalRows);
//从Request对象中获取当前页号
String currentPage = httpServletRequest.getParameter("currentPage");
//如果当前页号为空,表示为首次查询该页
//如果不为空,则刷新pager对象,输入当前页号等信息
if (currentPage != null) {
pager.refresh(Integer.parseInt(currentPage));
}
//获取当前执行的方法,首页,前一页,后一页,尾页。
String pagerMethod = httpServletRequest.getParameter("pageMethod");
if (pagerMethod != null) {
if (pagerMethod.equals("first")) {
pager.first();
} else if (pagerMethod.equals("previous")) {
pager.previous();
} else if (pagerMethod.equals("next")) {
pager.next();
} else if (pagerMethod.equals("last")) {
pager.last();
}
}
return pager;
}
}

PageHelper这个类,我不用说应该也知道用来干嘛了

3.DAO类

package com.jpcf.db.dao;
import com.jpcf.db.model.*;
import com.jpcf.db.helper.HibernateUtil;
import net.sf.hibernate.*;
import java.util.*;
import com.jpcf.db.controller.*;
public class VehiclePropertyDAO {
public Collection findWithPage(int pageSize, int startRow) throws
HibernateException {
Collection vehicleList = null;
Transaction tx = null;
try {
Session session = HibernateUtil.currentSession();
tx = session.beginTransaction();
Query q = session.createQuery("from VehicleProperty vp");
q.setFirstResult(startRow);
q.setMaxResults(pageSize);
vehicleList = q.list();
tx.commit();
} catch (HibernateException he) {
if (tx != null) {
tx.rollback();
}
throw he;
} finally {
HibernateUtil.closeSession();
}
return vehicleList;
}
public int getRows(String query) throws
HibernateException {
int totalRows = 0;
Transaction tx = null;
try {
Session session = HibernateUtil.currentSession();
tx = session.beginTransaction();
totalRows = ((Integer) session.iterate(query).next()).
intValue();
tx.commit();
} catch (HibernateException he) {
if (tx != null) {
tx.rollback();
}
throw he;
} finally {
HibernateUtil.closeSession();
}
return totalRows;
}
}
DAO类我就贴这些分页需要的代码了。
“from VehicleProperty vp”也可以用一个参数传进来,有兴趣的自己改一下吧

4.Action

下面是在Action中用到的代码:/
public ActionForward queryWithPage(ActionMapping actionMapping,
ActionForm actionForm,
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletresponse) {
Collection clInfos = null;//用于输出到页面的记录集合
int totalRows;//记录总行数
VehiclePropertyDAO vehicleDAO = new VehiclePropertyDAO();
//取得当前表中的总行数
try {
totalRows = vehicleDAO.getRows("select count(*) from VehicleProperty");
} catch (Exception ex) {
servlet.log(ex.toString());
return actionMapping.findForward(Constants.FAILURE);
}
//通过PagerHelper类来获取用于输出到页面的pager对象
Pager pager=PagerHelper.getPager(httpServletRequest,totalRows);
//取出从startRow开始的pageSize行记录
try {
clInfos = vehicleDAO.findWithPage(pager.getPageSize(), pager.getStartRow());
} catch (Exception ex) {
servlet.log(ex.toString());
return actionMapping.findForward(Constants.FAILURE);
}
//把输出的记录集和pager对象保存到request对象中
httpServletRequest.setAttribute("CLINFOS", clInfos);
httpServletRequest.setAttribute("PAGER", pager);
return actionMapping.findForward(Constants.SUCCESS);
}

查询语句select count(*) from VehicleProperty 也可以换成你需要的任意的条件(select count(*) from VehicleProperty where ..)


5.JSP页面使用

下面就是在JSP中的应用了:

<td colspan="8" align="right" class="head">
第<bean:write name="PAGER" property="currentPage"/>页&nbsp;
共<bean:write name="PAGER" property="totalPages"/>页&nbsp;
<html:link action="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&amp;pageMethod=first" paramName="PAGER" paramProperty="currentPage" paramId="currentPage">首页</html:link>
<html:link action="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&amp;pageMethod=previous" paramName="PAGER" paramProperty="currentPage" paramId="currentPage">上一页</html:link>
<html:link action="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&amp;pageMethod=next" paramName="PAGER" paramProperty="currentPage" paramId="currentPage">下一页</html:link>
<html:link action="/bussiness/clInfo/queryWithPage.do?method=queryWithPage&amp;pageMethod=last" paramName="PAGER" paramProperty="currentPage" paramId="currentPage">尾页</html:link>
</td>

解释一下这一行:"/bussiness/clInfo/queryWithPage.do?method=queryWithPage&amp;pageMethod=first
method=queryWithPage 是由于我的Action继承的是DispatchAction,需要一个method参数
pageMethod=first 是用来在PageHelper类中判断执行哪个操作

四、总结

我做的这个也只是一个借鉴,还有很多没有实现的,比如还可以加一下 go 直接到第n页的功能。

其实最关键的是把当前页号和要执行的是功能(上一页,下一页)的参数从页面传进来,在Action中就可以根据这两个参数去取下一个页面上要显示的记录集了

分享到:
评论

相关推荐

    struts+hibernate做的分页显示

    在这个项目中,"struts+hibernate做的分页显示"主要是利用这两者来实现数据的分页展示,提升用户体验,降低服务器压力。 首先,Struts是一个基于MVC设计模式的Java Web框架,它简化了开发过程,提供了处理HTTP请求...

    struts+hibernate+spring集成实现分页

    Struts、Hibernate和Spring是Java开发中的三大框架,它们各自负责不同的职责,组合起来可以构建出高效、松耦合的企业级应用。SSH(Struts、Spring、Hibernate)集成是Java Web开发中的常见模式,用于创建复杂的业务...

    用Struts+Hibernate做的分页

    通过这个项目,开发者可以学习到如何在Struts和Hibernate的集成环境下实现分页功能,理解MVC架构下各层的职责,以及如何使用Hibernate进行数据库操作。此外,还能了解到如何在前端展示分页信息,提高用户体验。这是...

    struts+hibernate+sql server2005分页的小项目

    本项目以"Struts+Hibernate+SQL Server 2005"的技术栈实现了一个简单的分页小项目,下面我们将详细探讨这个项目中的关键技术点。 **1. Struts框架** Struts是Apache组织下的一个开源MVC框架,主要用于构建Java Web...

    Struts2+HIBERNATE实现分页(完整讲解)

    【Struts2+Hibernate实现分页详解】 在Java Web开发中,Struts2和Hibernate是两个非常重要的框架,它们分别负责MVC模式中的控制层和持久层。Struts2提供了强大的Action类和拦截器,使得业务逻辑处理更加简洁;而...

    Struts+hibernate经典的分页代码

    Struts和Hibernate是Java开发中两个非常重要的框架,它们分别负责MVC模式中的控制器层(Model 2)和持久化层。...通过阅读并实践提供的文档"Struts+Hibernate实现分页.doc",可以更好地掌握这些技术。

    struts+hibernate实例(分页)

    Struts和Hibernate是Java开发中两个非常重要的框架,它们分别负责MVC模式中的Controller层和持久化层。在这个实例中,我们将深入探讨如何结合这两个框架实现一个具备分页功能的应用。 Struts是Apache软件基金会的一...

    Struts + Hibernate v1.0 分页源码

    通过深入学习这个分页示例,你不仅可以掌握Struts和Hibernate的结合使用,还能了解到分页在实际项目中的实现方式,这将对你的Java Web开发技能有很大的提升。同时,这也是一个很好的实践机会,帮助你理解MVC模式以及...

    struts+hibernate+display分页实例

    Struts、Hibernate和DisplayTag是Java Web开发中的三个重要组件,它们共同构成了一个强大的MVC(Model-View-Controller)架构。在这个实例中,我们将会深入探讨如何将它们整合在一起,实现一个具备分页功能的Web应用...

    JSP+Struts+HiberNate的博客系统

    开发者可以通过阅读源码,了解如何在实际项目中集成JSP、Struts和Hibernate,以及如何实现分页功能和数据库操作。 总之,这个"JSP+Struts+Hibernate"的博客系统展示了传统的Java Web开发方式,虽然现代Web开发已...

    高效率spring+struts+hibernate分页算法

    在Java Web开发中,Spring、Struts和Hibernate是三大核心框架,它们的组合常用于构建高效、可维护的Web应用程序。本压缩包中的"高效率spring+struts+hibernate分页算法"文档,旨在提供一种优化的分页解决方案,以...

    STRUTS+ HIBERNATE 简单分页

    在大型项目中,为了提高用户体验,通常需要实现数据的分页展示,这正是"STRUTS+ HIBERNATE 简单分页"的主题。 首先,我们要理解分页的基本原理。分页主要是将大量数据分成若干小块,每次只加载一部分到页面上,这样...

    Struts+Spring+Hibernate通用分页解决方案

    综上所述,"Struts+Spring+Hibernate通用分页解决方案"是一个高效的Java Web开发策略,它充分利用了三大框架的优势,实现了数据的灵活分页,提高了应用的性能和用户体验。通过深入理解并实践这些技术,开发者可以更...

    spring+struts+hibernate实现分页

    在IT领域,尤其是在Web开发中,使用Spring、Struts和Hibernate框架进行集成是常见的实践,因为它们能够提供高效且灵活的解决方案。以下将详细讲解如何使用这三个框架实现分页功能。 首先,Spring作为核心的依赖注入...

    struts+hibernate实现的教师管理系统

    本文将深入探讨一个使用Java、Struts和Hibernate技术实现的教师管理系统,它是学习Model-View-Controller(MVC)架构模式的绝佳实例。 首先,我们要理解MVC模式。这是一种软件设计模式,它将应用程序分为三个主要...

    struts2+hibernate+spring分页

    Struts2、Hibernate和Spring是Java Web开发中的三大框架,它们...通过对这个项目的理解和实践,开发者能够更好地理解MVC架构,掌握数据库分页的实现方法,以及如何在实际项目中有效地运用Spring、Hibernate和Struts2。

    Struts+Hibernate+分页

    在给定的文件名"StrutsHibernate"中,我们可以推测这是一个包含Struts和Hibernate整合示例的工程,可能包含了配置文件、Action类、DAO(数据访问对象)类以及相关的JSP页面。通过分析这个项目,开发者可以学习如何在...

    struts2.0+hibernate+spring分页

    在本项目中,“struts2.0+hibernate+spring分页”是将这三种技术结合,实现数据的分页展示功能。分页是一种常见的优化策略,它可以提高用户体验,避免一次性加载过多数据导致页面响应慢或内存压力大。 首先,Struts...

    struts+hibernate+spring的分页

    在这个“Struts+Hibernate+Spring的分页”示例中,我们将探讨如何在SSH框架下实现数据的分页展示,这对于提升用户体验和优化系统性能至关重要。 **Struts框架**: Struts是Apache软件基金会下的一个开源项目,它...

    struts2+spring2+hibernate3注册查询搜索分页实例

    总的来说,这个"Struts2+Spring2+Hibernate3注册查询搜索分页实例"是一个很好的学习资源,涵盖了Java Web开发中的基础和核心部分。通过学习这个实例,开发者不仅可以掌握三大框架的基本用法,还能了解到如何将它们...

Global site tag (gtag.js) - Google Analytics