hibernate 分页,,有时间总结下我自己写的,,STRUTS2+HIBERNATE3+通用的PAGEBEAN

有时间总结下我自己写的,,STRUTS2+HIBERNATE3+通用的PAGEBEAN,,,现在倒是能用,

但是没做抽象,,重复代码很多,现在设法对他进行抽象,把重复的代码去掉,想用拦截器来解

析用户请求,但是还没想到很好的办法,,再想想+SPRING后能不能有方便的分页办法,,,

等我做完了就贴出来,,有好的建议请留言…先贴出PAGEBEAN部分代码,,

public class PageBean {
private Integer pageSize = 0;///总的页数
private Integer totalRecords = 0;//总记录数
private Integer pageRecords = 10;//每页显示的记录数
private Integer currentPage = 1;//当前页
private boolean hasPrevious = false;//是否有前一页
private boolean hasNext = false;//是否有下一页
private String toolBar;//获得导航条,如下
private List list = new ArrayList();//为了能重用,也可以用LIST做为参数进行分页
private String url;//请求的URL,如newslist.action

首页 上一页 下一页 尾页   转到       第3页/共4页 每页10条记录/共31条记录

目的:

学习使用struts+hibernate实现一个通用的分页程序。

内容:

分页程序是网页设计经常需要实现的基本功能。但有的分页程序直接嵌在jsp页面上,不仅工作量较大,代码也难以重用。本次试验将使用struts+hibernate来实现通用的分页程序。不同功能的代码尽量分离,以满足通用性要求。

首先需要建立一个表,如下Product,各字段设计如下(可自由更改):

ID int primary key,

Typeid varchar(20),

Name   varchar(50),

Price    varchar(20),

Memo   varchar(100).

步骤:

1 建立web工程,名字为”Fenye”.

2 添加hibernate,生成Product表的.hbm.xml和pojo类。这个很简单,不再赘述。

3 接着写数据访问层,我们将其分为Dao和ProDao两个类。其中Dao是个公共的基类;ProDao继承它,并与action通信取得参数。这样设计的好处是:如果需要对User这个表进行分页显示,只需添加一个UserDao类,并让它继承Dao类。

Dao类的代码如下,可以根据需要添加:头文件自己导入。

public class Dao {

private Session session=null;

public Dao() {

}

public Session getSession()

{

session = HibernateSessionFactory.getSession();

return session;

}

public int getCount(String pojo)

{

String sql=”select count(*) from “+pojo ;

this.getSession();

try {

Query q = getSession().createQuery(sql);

List cc = q.list();

Integer rows = (Integer) cc.get(0);

return rows.intValue();

} catch (HibernateException ex) {

System.out.print(“ex::”+ex.getMessage());

return 0;

}

}

public List getlist(Query query, String pojo,int pagesize,int currow) throws HibernateException

{

List list = null;

this.getSession();

query.setFirstResult(currow);

query.setMaxResults(pagesize);

list=query.list();

//session.flush();

if(session!=null)

session.close();

return list;

}

public List getlist(Query query,int pagesize,int currow)

{

String[] str = query.getQueryString().split(“from”);

String[] table =str[1].trim().split(” “);

System.out.println(“table:”+table[0]);

return getlist(query,table[0],pagesize,currow);

}

}

ProDao类的代码如下:

public class PinfoDao extends Dao{

private Session session;

public PinfoDao() {

super();

}

public List list(int pagesize,int currow)

{

Query query =getSession().createQuery(“from PInfo”);

List li=getlist(query, pagesize, currow);

return li;

}

public Session getSession()

{

// Configuration config=null;

session = HibernateSessionFactory.getSession();

return session;

}

public int getCount()

{

String sql=”select count(*) from PInfo”;

Query q = getSession().createQuery(sql);

List cc = q.list();

Integer a = (Integer) cc.get(0);

System.out.println(“count:”+a.intValue());

return a.intValue();

}

}

4         下面写页面控制程序,同样将代码分离为两个类Page类和Pagehelp类。

Page类处理页面相关的一些设置,如一页显示多少条记录,计算共有多少页,共有多少记录,当前页码等。

PageHelp类接收jsp页面传来的参数,并调用Page类处理。

Page类代码:

public class Page {

private int totalRows; //总行数

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

private int currentPage; //当前页号

private int totalPages; //总页数

private int startRow; //当前页在数据库中的起始行

public Page(int totalRows1) {

totalRows = totalRows1;

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();

}

}

}

Pagehelp类代码如下:

public class Pagehelp {

public static Page getPager(HttpServletRequest httpServletRequest,int totalRows) {

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

Page pager = new Page(totalRows);

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

String currentPage = httpServletRequest.getParameter(“currentPage”);

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

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

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;

}

}

5         一切准备工作结束后,下面写action来调用这些类。

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

int totalRows;//记录总行数

PinfoDao dao=new PinfoDao();

totalRows=dao.getCount();

System.out.print(“总行数==”+totalRows);

Page page=Pagehelp.getPager(request,totalRows);

try {

list= dao.list(page.getPageSize(), page.getStartRow());

} catch (HibernateException ex) {

System.out.print(“action里的错误=”+ex.getMessage());

}

request.setAttribute(“page”,page);

request.setAttribute(“list”,list);

return mapping.findForward(“list”);

6         最后是显示页面plist。在struts-config.xml文件中添加forward语句,<forward name=”list” path=”/plist.jsp”></forward>。

plist.jsp页面部分代码如下:

<table align=”center” border=”1″>

<tr>

<td>产品类别</td>

<td>产品名称</td>

<td>产品价格</td>

<td>产品备注</td>

</tr>

<!—下面打印list中的各属性–>

<tr >

<td colspan=”4″>

第<bean:write name=”page” property=”currentPage”/>页

共<bean:write name=”page” property=”totalPages” />页

<html:link action=”/page.do?pageMethod=first”

paramName=”page” paramProperty=”currentPage”

paramId=”currentPage”>首页</html:link>

<html:link action=”/page.do?pageMethod=previous”

paramName=”page” paramProperty=”currentPage”

paramId=”currentPage”>上一页</html:link>

<html:link action=”/page.do?pageMethod=next”

paramName=”page” paramProperty=”currentPage”

paramId=”currentPage”>下一页</html:link>

<html:link action=”/page.do?pageMethod=last”

paramName=”page” paramProperty=”currentPage”

paramId=”currentPage”>尾页</html:link>

</td>

</tr>

</table>

7 测试:

按照上述步骤完成后,在浏览器中输入http://localhost:8080/Fenye/page.do查看页面。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>