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>

最后说一下结语吧,该程序我总感觉有些别扭,但毕竟是我所做的第一个分页程序,如果有什么好的建议可以留言。
最后说一句吐槽:学的越多,就会对其越来越敬畏,就会感觉自己是多么的渺小。

1 0
原创粉丝点击