Hibernate+Struts2 分页实现
来源:互联网 发布:opticalflares mac 编辑:程序博客网 时间:2024/05/19 18:44
最近一直在学习Hibernate,在了解Hibernate分页的原理之后,就想自己写一个分页代码。
在写代码之前,我们需要知道Hibernate的一些分页用到的函数
setFirstResult(Int i);//该函数返回的是分页的起点
setMaxResults(int i);//该函数返回的是最多显示几条数据
有了这两个函数,就可以得到想要的结果集。
现在有两个问题
1.那就是怎样获取当前页的id。
2.如何做让id产生变化(++或–),使id传入后台,然后将新的值传给前台。
我们首先解决第一个问题,如何获取当前页的id。
这一点比较容易解决,下面的例子是用struts来实现的(主要就是将Page这个对象放在值栈中,通过值栈来获取所有的信息)。
创建一个Page.java
public class Page { /** * * 记录当前页的id * */ private int pageId; /** * 每一页的数量 */ private int everyPageCount; /** * 总数量 */ private int totalCount; //省略get和set方法
创建PageAction
import java.util.List;import java.util.Map;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;public class PageAction extends ActionSupport implements ModelDriven<Page> { /** * */ @SuppressWarnings("rawtypes") private List list=null; private Map<String, Object> session = ActionContext.getContext().getSession(); private static final long serialVersionUID = 1L; private Page page = new Page(); public Page getModel() { return page; } /** *设置登录的时候,默认当前页的id为1 */ public String login() { page.setPageId(1); return "success"; } public String add() { //当点击下一页的时候pageId+1 page.setPageId(page.getPageId() + 1); return "add"; } public String before() { //当点击上一页的时候pageId-1 page.setPageId(page.getPageId() - 1); return "before"; }}
接下来是jsp页面
login.jsp
<body> <a href="login.action">login</a></body>
分页的页面
index.jsp
想要用struts的标签,需要添加
<%@taglib uri=”/struts-tags” prefix=”s”%>
<a href="before.action?pageId=<s:property value="pageId"/>">上一页</a><s:property value="pageId"/><a href="add.action?pageId=<s:property value="pageId"/>">下一页</a>
这样就可以获得当前页的id并且不同的点击会发生不同的变化
接下来就是如何在页面得到自己想要的显示
之前已经创建了一个Page.java,里面有这些成员变量。
pageId(当前页的id),everyPageCount(每一页的数量),totalCount(数据的总量)。还差一个总页数,
所以我们需要一个操作Page的类,我取名为PageUtil.java
public class PageUtil { private static int pageCount; //得到总页数 public static int getPageCount(int totalCount, int everyPageCount) { if (everyPageCount >= totalCount) { pageCount = 1; } else { pageCount = totalCount / everyPageCount + 1; } return pageCount; } /** * 是否有上一页或下一页 * @param pageId 当前页的id * @param pageCount 总页数 * @return 有就返回true ,没有就返回false */ public static boolean isHasPage(int pageId,int pageCount){ if (pageId==pageCount||pageId==1) { return false; } return true; }}
操作Page的内已经有了,还差一个获取数据的类,
我创建的一个News类
//需要实现Serializable接口,如果没有可能会报错误,虽然不影响结果public class News implements Serializable{ /** * */ private static final long serialVersionUID = 1L; private int id; private String newsTitle; private String newsContent; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getNewsTitle() { return newsTitle; } public void setNewsTitle(String newsTitle) { this.newsTitle = newsTitle; } public String getNewsContent() { return newsContent; } public void setNewsContent(String newsContent) { this.newsContent = newsContent; } public News(){ super(); } @Override public String toString() { return "News [id=" + id + ", newsTitle=" + newsTitle + ", newsContent=" + newsContent + "]"; }}
接下来是该类的映射文件
News.hbm.xml
<hibernate-mapping> <class name="com.action.News" table="news"> <id name="id" type="int"> <column name="ID" /> <generator class="native" /> </id> <property name="newsTitle" type="java.lang.String"> <column name="NEWS_TITLE" /> </property> <property name="newsContent" type="java.lang.String"> <column name="NEWS_CONTENT" /> </property> </class></hibernate-mapping>
最后就是最重要的分页实现
HibernatePage.java
这里面有几点需要说明,为了能让这个成为一个模板,我给每个函数都传入了参数。里面会有具体的说明
public class HibernatePage { @SuppressWarnings("unchecked") //object 需要持久化的对象 Hql 语句 "from xx",xx是持久化类的类名 //因此需要使用object.getClass().getSimpleName()来获得持久化的类名 public static int getTotalCount(Object object) { Session session = null; List<News> list = null; try { session = HibernateUtil.getSession(); Transaction t = session.beginTransaction(); list = session.createQuery("from "+object.getClass().getSimpleName()).list(); t.commit(); } catch (Exception e) { e.printStackTrace(); } finally { session.close(); } return list.size(); } /** * * @param object 要查询的持久化类 * @param pageId 当前页 * @param everyPageCount 每一页的数量 * @return */ @SuppressWarnings("unchecked") public static List<Object> showPageList(Object object,int pageId,int everyPageCount){ System.out.println(object.getClass().getSimpleName()); Session session = null; List<Object> list = null; try { session = HibernateUtil.getSession(); Transaction t = session.beginTransaction(); org.hibernate.Query query = session.createQuery("from "+object.getClass().getSimpleName());; if (pageId==1) { //如果当前页id为1 //需要从第0条读取 query.setFirstResult(pageId-1); } //如果当前页不为1 从当前页-1,乘以每一页的数量开始读取参数为0,代表从第一条开始读取 query.setFirstResult((pageId-1)*everyPageCount); query.setMaxResults(everyPageCount); list=query.list(); t.commit(); } catch (Exception e) { e.printStackTrace(); } finally { session.close(); } System.out.println(list); return list; } //这个是我做的一个测试 public static void main(String[] args) { News news=new News(); showPageList(news, 1, 3); }}
主体部分基本上已经完成了
接下来就是Action当中的一些修改,以及页面的显示
最新版的Action代码如下所示
PageAction.java
public class PageAction extends ActionSupport implements ModelDriven<Page> { /** * */ @SuppressWarnings("rawtypes") private List list=null; private Map<String, Object> session = ActionContext.getContext().getSession(); private static final long serialVersionUID = 1L; private Page page = new Page(); public Page getModel() { return page; } public String login() { //设置当前页为1 page.setPageId(1); //得到第一页的数据 test(new News(),page.getPageId(),3); return "success"; } public String add() { //每次都会自己加1 page.setPageId(page.getPageId() + 1); //将得到的新页数显示出来 test(new News(),page.getPageId(),3); return "add"; } public String before() { //每次都会自己减1 page.setPageId(page.getPageId() - 1); //将得到的新页数显示出来 test(new News(),page.getPageId(),3); return "before"; } /** * * @param object 要分页的对象 * @param pageId 当前页 * @param count 每一页的数量 */ public void test(Object object,int pageId,int count){ //得到总页数 int pageCount=PageUtil.getPageCount(HibernatePage.getTotalCount(object), count); //将值放进session中 session.put("pageCount",pageCount); //获取当前页的数据 list =HibernatePage.showPageList(object, pageId , count); //将值放进session中 session.put("list", list); }}
index.jsp
struts的标签还是挺好用的
<table border="1px"> <!--我遍历的是news这个对象的id--> <s:iterator value="#session.list" id="list"> <tr> <td> <s:property value="#list.id"/> </td> </tr> </s:iterator> </table> <a href="before.action?pageId=<s:property value="pageId"/>"><!--判断是否有上一页, 如果没有就不显示上一页的这个a标签--><s:if test="pageId>1"> 上一页</s:if> </a> <s:if test="pageId<=1"> 没有上一页了 </s:if> <s:property value="pageId"/>/<s:property value="#session.pageCount"/><a href="add.action?pageId=<s:property value="pageId"/>"> <s:if test="pageId<3">下一页 </s:if></a> <!--判断是否有下一页--> <s:if test="pageId>=3"> 没有下一页了 </s:if>
struts.xml
<struts> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="true" /> <package name="default" namespace="/" extends="struts-default"> <default-action-ref name="index" /> <global-results> <result name="error">/WEB-INF/jsp/error.jsp</result> </global-results> <global-exception-mappings> <exception-mapping exception="java.lang.Exception" result="error"/> </global-exception-mappings> <action name="login" class="com.action.ActionTest" method="login"> <result name="success">/index.jsp</result> </action> <action name="add" class="com.action.ActionTest" method="add"> <result name="add">/index.jsp</result> </action> <action name="before" class="com.action.ActionTest" method="before"> <result name="before">/index.jsp</result> </action> </package> <include file="example.xml"/> <!-- Add packages here --></struts>
最后说一下结语吧,该程序我总感觉有些别扭,但毕竟是我所做的第一个分页程序,如果有什么好的建议可以留言。
最后说一句吐槽:学的越多,就会对其越来越敬畏,就会感觉自己是多么的渺小。
- Struts2+HIBERNATE实现分页
- Struts2+HIBERNATE实现分页
- Hibernate+Struts2 分页实现
- struts2+hibernate+spring分页实现
- struts2+hibernate+spring分页实现
- Struts2+Hibernate 实现数据分页
- struts2+spring+hibernate 实现分页
- struts2标签和hibernate实现分页
- Hibernate+struts2+spring 实现分页实例
- 使用hibernate和struts2实现分页功能
- 使用hibernate和struts2实现分页功能
- 使用hibernate和struts2实现分页功能
- 使用hibernate和struts2实现分页功能
- 使用hibernate和struts2实现分页功能
- 使用hibernate和struts2实现分页功能
- struts2+spring+hibernate分页
- struts2+hibernate分页
- struts2+Hibernate分页
- IDEA中maven项目webapp目录未被识别
- VS2013 + Qt5.4.1 开发环境搭建
- 求大神帮小弟写asp一段代码.
- 解决python3 UnicodeEncodeError: 'gbk' codec can't encode character '\xXX' in position XX
- 从 MongoDB 及 Mysql 谈B/B+树
- Hibernate+Struts2 分页实现
- 【HTTP协议】请求、响应、状态码
- 开源项目【LikeCloudMusic 云音】仿网易云音乐
- Android 中SocketClient client = new SocketClient("IP_ADDRESS",8000)出错
- Android 图片在Editext里面,不是放在editext右边 是放在里面 右侧
- Android 23使用定位权限报错Call requires permission which may be rejected by user
- 爬有道在线翻译(已完善)
- JAVA学习推荐书籍
- 辞旧迎新,再见2016,欢迎2017