java

位置:IT落伍者 >> java >> 浏览文章

浅谈Struts分页中的Hibernate如何实现


发布日期:2023年10月18日
 
浅谈Struts分页中的Hibernate如何实现

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

在Struts分页有两种结构

在Action中通过DAO查询出所有的记录然后加到session或request对象中传到客户端由JSP进行分页

这种方法对于在数据量少的时候很方便也不影响速度

在Action中每次通过DAO只查询出一页的记录再传给JSP页面

这种结构对于数据量大的程序很好但对于数据量小的情况会增加对服务器的请求加大服务器的负载

Hibernate查询

由于在Hibernate中直接提供了对数据库定点定量的查询方法所以我采用的是第种方法

从第万条开始取出条记录

Query q = sessioncreateQuery(from Cat as c);

qsetFirstResult();

qsetMaxResults();

List l = qlist();

具体实现

Pager类

package comjpcfdbhelper;

import javamath*;

public class Pager {

private int totalRows; //总行数

private int pageSize = ; //每页显示的行数

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>){

totalPages++;

}

currentPage = ;

startRow = ;

}

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) {

thistotalRows = totalRows;

}

public void setStartRow(int startRow) {

thisstartRow = startRow;

}

public void setTotalPages(int totalPages) {

thistotalPages = totalPages;

}

public void setCurrentPage(int currentPage) {

thiscurrentPage = currentPage;

}

public void setPageSize(int pageSize) {

thispageSize = pageSize;

}

public int getTotalRows() {

return totalRows;

}

public void first() {

currentPage = ;

startRow = ;

}

public void previous() {

if (currentPage == ) {

return;

}

currentPage;

startRow = (currentPage ) * pageSize;

}

public void next() {

if (currentPage < totalPages) {

currentPage++;

}

startRow = (currentPage ) * pageSize;

}

public void last() {

currentPage = totalPages;

startRow = (currentPage ) * pageSize;

}

public void refresh(int _currentPage) {

currentPage = _currentPage;

if (currentPage > totalPages) {

last();

}

}

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

PagerHelp类

package comjpcfdbhelper;

import javaxservlethttp*;

public class PagerHelper {

public static Pager getPager(HttpServletRequest httpServletRequest

int totalRows) {

//定义pager对象用于传到页面

Pager pager = new Pager(totalRows);

//从Request对象中获取当前页号

String currentPage = (currentPage);

//如果当前页号为空表示为首次查询该页

//如果不为空则刷新pager对象输入当前页号等信息

if (currentPage != null) {

pagerrefresh(IntegerparseInt(currentPage));

}

//获取当前执行的方法首页前一页后一页尾页

String pagerMethod = (pageMethod);

if (pagerMethod != null) {

if (pagerMethodequals(first)) {

pagerfirst();

} else if (pagerMethodequals(previous)) {

pagerprevious();

} else if (pagerMethodequals(next)) {

pagernext();

} else if (pagerMethodequals(last)) {

pagerlast();

}

}

return pager;

}

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

DAO类

package comjpcfdbdao;

import comjpcfdbmodel*;

import comjpcfdbhelperHibernateUtil;

import netsfhibernate*;

import javautil*;

import ntroller*;

public class VehiclePropertyDAO {

public Collection findWithPage(int pageSize int startRow) throws

HibernateException {

Collection vehicleList = null;

Transaction tx = null;

try {

Session session = HibernateUtilcurrentSession();

tx = sessionbeginTransaction();

Query q = sessioncreateQuery(from VehicleProperty vp);

qsetFirstResult(startRow);

qsetMaxResults(pageSize);

vehicleList = qlist();

mit();

} catch (HibernateException he) {

if (tx != null) {

txrollback();

}

throw he;

} finally {

HibernateUtilcloseSession();

}

return vehicleList;

}

public int getRows(String query) throws

HibernateException {

int totalRows = ;

Transaction tx = null;

try {

Session session = HibernateUtilcurrentSession();

tx = sessionbeginTransaction();

totalRows = ((Integer) erate(query)next())

intValue();

mit();

} catch (HibernateException he) {

if (tx != null) {

txrollback();

}

throw he;

} finally {

HibernateUtilcloseSession();

}

return totalRows;

}

DAO类我就贴这些分页需要的代码了

from VehicleProperty vp也可以用一个参数传进来有兴趣的自己改一下吧

Action

下面是在Action中用到的代码/

public ActionForward queryWithPage(ActionMapping actionMapping

ActionForm actionForm

HttpServletRequest httpServletRequest

HttpServletResponse httpServletresponse) {

Collection clInfos = null;//用于输出到页面的记录集合

int totalRows;//记录总行数

VehiclePropertyDAO vehicleDAO = new VehiclePropertyDAO();

//取得当前表中的总行数

try {

totalRows = vehicleDAOgetRows(select count(*) from VehicleProperty);

} catch (Exception ex) {

servletlog(extoString());

return actionMappingfindForward(ConstantsFAILURE);

}

//通过PagerHelper类来获取用于输出到页面的pager对象

Pager pager=PagerHelpergetPager(httpServletRequesttotalRows);

//取出从startRow开始的pageSize行记录

try {

clInfos = vehicleDAOfindWithPage(pagergetPageSize() pagergetStartRow());

} catch (Exception ex) {

servletlog(extoString());

return actionMappingfindForward(ConstantsFAILURE);

}

//把输出的记录集和pager对象保存到request对象中

(CLINFOS clInfos);

(PAGER pager);

return actionMappingfindForward(ConstantsSUCCESS);

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

JSP页面使用

下面就是在JSP中的应用了

=/bussiness/clInfo/queryWithPagedo?method=queryWithPage&pageMethod=first

paramName=PAGER paramProperty=currentPage paramId=currentPage>首页

解释一下这一行:/bussiness/clInfo/queryWithPagedo?method=queryWithPage&pageMethod=first

method=queryWithPage

是由于我的Action继承的是DispatchAction需要一个method参数

pageMethod=first 是用来在PageHelper类中判断执行哪个操作

Struts分页总结

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

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

上一篇:编程技术分享:Hibernate开发心得

下一篇:浅析Spring提供的事务管理方法