hibernate和struts2实现分页功能
1.DAO层接口的设计,定义一个PersonDAO接口,里面声明了两个方法:
public interface PersonDAO
{
public List<Person> queryByPage(String hql, int offset, int pageSize); public int getAllRowCount(String hql);
}
2.DAO层接口的实现类PersonDAOImpl类,将其两个方法实现出来:
public class PersonDAOImpl implements PersonDAO
{
/**
* 通过hql语句得到数据库中记录总数
*/
@Override
public int getAllRowCount(String hql)
{
Session session = HibernateUtil.openSession();
Transaction tx = null;
int allRows = ;
try
{
tx = session.beginTransaction(); Query query = session.createQuery(hql); allRows = query.list().size(); tx.commit(); }
catch (Exception e)
{
if(tx != null)
{
tx.rollback();
} e.printStackTrace();
}
finally
{
HibernateUtil.closeSession(session);
} return allRows;
}
/**
* 使用hibernate提供的分页功能,得到分页显示的数据
*/
@SuppressWarnings("unchecked")
@Override
public List<Person> queryByPage(String hql, int offset, int pageSize)
{
Session session = HibernateUtil.openSession();
Transaction tx = null;
List<Person> list = null; try
{
tx = session.beginTransaction(); Query query = session.createQuery(hql).setFirstResult(offset).setMaxResults(pageSize); list = query.list(); tx.commit(); }
catch (Exception e)
{
if(tx != null)
{
tx.rollback();
} e.printStackTrace();
}
finally
{
HibernateUtil.closeSession(session);
} return list;
}
}
3.定义了一个PageBean(每一页所需要的内容都存放在这个PageBean里面),里面用来存放网页每一页显示的内容:
public class PageBean
{
private List<Person> list; //通过hql从数据库分页查询出来的list集合 private int allRows; //总记录数 private int totalPage; //总页数 private int currentPage; //当前页 public List<Person> getList()
{
return list;
} public void setList(List<Person> list)
{
this.list = list;
} public int getAllRows()
{
return allRows;
} public void setAllRows(int allRows)
{
this.allRows = allRows;
} public int getTotalPage()
{
return totalPage;
} public void setTotalPage(int totalPage)
{
this.totalPage = totalPage;
} public int getCurrentPage()
{
return currentPage;
} public void setCurrentPage(int currentPage)
{
this.currentPage = currentPage;
} /**
* 得到总页数
* @param pageSize 每页记录数
* @param allRows 总记录数
* @return 总页数
*/
public int getTotalPages(int pageSize, int allRows)
{
int totalPage = (allRows % pageSize == )? (allRows / pageSize): (allRows / pageSize) + ; return totalPage;
} /**
* 得到当前开始记录号
* @param pageSize 每页记录数
* @param currentPage 当前页
* @return
*/
public int getCurrentPageOffset(int pageSize, int currentPage)
{
int offset = pageSize * (currentPage - ); return offset;
} /**
* 得到当前页, 如果为0 则开始第一页,否则为当前页
* @param page
* @return
*/
public int getCurPage(int page)
{
int currentPage = (page == )? : page; return currentPage;
} }
4.Service层接口设计,定义一个PersonService接口,里面声明了一个方法,返回一个PageBean:
public interface PersonService
{
public PageBean getPageBean(int pageSize, int page);
}
5.Service层接口实现类PersonServiceImpl类,实现唯一的方法:
public class PersonServiceImpl implements PersonService
{
private PersonDAO personDAO = new PersonDAOImpl(); /**
* pageSize为每页显示的记录数
* page为当前显示的网页
*/
@Override
public PageBean getPageBean(int pageSize, int page)
{
PageBean pageBean = new PageBean(); String hql = "from Person"; int allRows = personDAO.getAllRowCount(hql); int totalPage = pageBean.getTotalPages(pageSize, allRows); int currentPage = pageBean.getCurPage(page); int offset = pageBean.getCurrentPageOffset(pageSize, currentPage); List<Person> list = personDAO.queryByPage(hql, offset, pageSize); pageBean.setList(list);
pageBean.setAllRows(allRows);
pageBean.setCurrentPage(currentPage);
pageBean.setTotalPage(totalPage); return pageBean;
}
}
6.Action层设计,定义一个PersonAction:
public class PersonAction extends ActionSupport
{
private PersonService personService = new PersonServiceImpl(); private int page; public int getPage()
{
return page;
} public void setPage(int page)
{
this.page = page;
} @Override
public String execute() throws Exception
{
//表示每页显示5条记录,page表示当前网页
PageBean pageBean = personService.getPageBean(, page); HttpServletRequest request = ServletActionContext.getRequest(); request.setAttribute("pageBean", pageBean); return SUCCESS;
}
}
7.辅助类设计,HibernateUtil:
public class HibernateUtil
{
private static SessionFactory sessionFactory; static
{
sessionFactory = new Configuration().configure().buildSessionFactory();
} public static Session openSession()
{
Session session = sessionFactory.openSession(); return session;
} public static void closeSession(Session session)
{
if(session != null)
{
session.close();
}
} }
8.最后也就是分页页面显示pagePerson.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%> <html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'pagePerson.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page"> <script type="text/javascript"> function validate()
{
var page = document.getElementsByName("page")[].value; if(page > <s:property value="#request.pageBean.totalPage"/>)
{
alert("你输入的页数大于最大页数,页面将跳转到首页!"); window.document.location.href = "personAction"; return false;
} return true;
} </script> </head> <body> <h1><font color="blue">分页查询</font></h1><hr> <table border="" align="center" bordercolor="yellow" width="50%"> <tr>
<th>序号</th>
<th>姓名</th>
<th>年龄</th>
</tr> <s:iterator value="#request.pageBean.list" id="person"> <tr>
<th><s:property value="#person.id"/></th>
<th><s:property value="#person.name"/></th>
<th><s:property value="#person.age"/></th>
</tr> </s:iterator> </table> <center> <font size="">共<font color="red"><s:property value="#request.pageBean.totalPage"/></font>页 </font>
<font size="">共<font color="red"><s:property value="#request.pageBean.allRows"/></font>条记录</font><br><br> <s:if test="#request.pageBean.currentPage == 1">
首页 上一页
</s:if> <s:else>
<a href="personAction.action">首页</a>
<a href="personAction.action?page=<s:property value="#request.pageBean.currentPage - "/>">上一页</a>
</s:else> <s:if test="#request.pageBean.currentPage != #request.pageBean.totalPage">
<a href="personAction.action?page=<s:property value="#request.pageBean.currentPage + "/>">下一页</a>
<a href="personAction.action?page=<s:property value="#request.pageBean.totalPage"/>">尾页</a>
</s:if> <s:else>
下一页 尾页
</s:else> </center><br> <center> <form action="personAction" onsubmit="return validate();">
<font size="">跳转至</font>
<input type="text" size="" name="page">页
<input type="submit" value="跳转">
</form> </center> </body>
</html>
至此,hibernate+struts2实现网页分页功能代码部分就完毕了,像hibernate与struts的配置文件就不列出来了,那些都不是重点!
页面效果如下:
hibernate和struts2实现分页功能的更多相关文章
- Strut2与Hibernate的一个web分页功能
代码没有进行过多的封装,可能看起来有点action代码部分,hibernate在这里只起到了一个查询记录集的作用. import java.util.ArrayList; import java.ut ...
- hibernate和struts实现分页
仓促把功能进行实现一下 类与类之间也没有进行MVC式分开 重要的是逻辑 记录一下 希望其中的些许代码逻辑对你有用 TUserDaoImpl---dao层的实现 package com.pers.h ...
- 最新版ssh hibernate spring struts2环境搭建
最新版ssh hibernate spring struts2环境搭建 最新版spring Framework下载地址:spring4.0.0RELEASE环境搭建 http://repo.sprin ...
- 总结Spring、Hibernate、Struts2官网下载jar文件
一直以来只知道搭SSH需要jar文件,作为学习的目的,最好的做法是自己亲自动手去官网下.不过官网都是英文,没耐心一般很难找到下载入口,更何 况版本的变化也导致不同版本jar文件有些不一样,让新手很容易 ...
- 基于SSM框架的简易的分页功能——包含maven项目的搭建
新人第一次发帖,有什么不对的地方请多多指教~~ 分页这个功能经常会被使用到,我之前学习的时候找了很多资源,可都看不懂(笨死算了),最后还是在朋友帮助下做出了这个分页.我现在把我所能想到的知识 做了一个 ...
- SSH, 整合分页功能,连带DAO经典封装
任何一个封装讲究的是,使用,多状态.Action: 任何一个Action继承分页有关参数类PageManage,自然考虑的到分页效果,我们必须定义下几个分页的参数.并根据这个参数进行查值. 然 ...
- 带分页功能的SSH整合,DAO层经典封装
任何一个封装讲究的是,使用,多状态.Action: 任何一个Action继承分页有关参数类PageManage,自然考虑的到分页效果,我们必须定义下几个分页的参数.并根据这个参数进行查值. 然 ...
- 解决hibernate对Sql Server分页慢的问题
一.hibernate分页 hibernate对MsSql的伪分页 分页是web项目中比不可少的一个功能,数据量大的时候不能全部展示必然要用到分页技术.相信大家对hibernate中的分页都不陌生: ...
- 简单封装分页功能pageView.js
分页是一个很简单,通用的功能.作为一个有经验的前端开发人员,有义务把代码中类似这样公共的基础性的东西抽象出来,一来是改善代码的整体质量,更重要的是为了将来做类似的功能或者类似的项目,能减少不必要的重复 ...
随机推荐
- vs2008 多人同时开发项目时的代码注释规范格式 分类: C#小技巧 2014-04-23 14:12 297人阅读 评论(0) 收藏
多人同时开发一个项目,区分项目的那个窗体是谁开发的,例:下面的格式 /************************************************ 模块:服务器设置 ...
- Cocos3.0测试版发布(中文)
最新的cocos2d-x 3.0版本,我们的目标不仅是改进渲染机制,增加对2.5D的支持,基于组件的系统功能,和更好的Label功能.同时 我们希望能够进一步优化引擎,并且使用更友好的C++ API ...
- HDU - 4815 Little Tiger vs. Deep Monkey (长春赛区C题)
题意:有A,B两个人.n道题目.每题有相应的分数.B答对题目的概率是0.5.求A不输给B的概率不小于P要拿的最低分数 思路:DP,dp[i][j]来表示B答了前i题后分数为j的概率,,然后通过B的概率 ...
- 【LeetCode】Swap Nodes in Pairs
Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2-& ...
- TCP 连接的要点
概念 TIME_WAIT: socket 仍然有数据在内核中待发送直到发送成功或超时,此socket不能被内核删除,同时等待是否要重传Ack对端还已发过来的FIN Linger Time:socket ...
- android核心服务初探
终于进入android学习的进阶阶段,第一个课题是android的核心服务.首先,让我们来认识一下核心服务. android核心服务与app服务有所区别.app服务继承自Service基类,在app运 ...
- ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number;
rpm 安装了 mysql 5.6 的版本 遇到的问题 1. 提示与5.1版本的有冲突. 解决方式, 是 rpm --force -ivh rpm包.rpm 进行强制安装 2. 启动 mysql 后, ...
- Linux磁盘管理:LVM逻辑卷的创建及使用
一.创建LVM逻辑卷 事先添加了三块虚拟物理磁盘/dev/sdb 1G, /dev/sdc 2G, /dev/sdd 3G 使用fdisk –l命令查看: [root@localhost ~]# fd ...
- Android MediaCodec 使用例子
Android MediaCodec 使用例子 下面的例子是使用MediaCodec 录制到文件的例子. 1 public class AvcEncoder { private MediaCodec ...
- codevs2492上帝造题的七分钟 2(线段树)
/* 区间修改 区间查询 可以用线段树搞 但是一般的标记下放对这个题好像不合适 只能改叶子 然后更新父亲(虽然跑的有点慢) 小优化:如果某个点是1 就不用再开方了 所以搞一个f[i]标记 i 这个点还 ...