论坛首页 Java企业应用论坛

struts+spring+hibernate通用分页方法 (2)

浏览 7177 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-06-23  
接上:

strutsAction中:

java 代码
 
  1. private ActionForward findAllRole(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {  
  2.         String curPageNO = request.getParameter("curPageNO");  
  3.         String myaction;  
  4.         String search=request.getParameter("search");  
  5.         //String myform="forms[0]";  
  6.         if(search==null){  
  7.             search="";  
  8.             myaction="findAllRole.do";  
  9.         }else{  
  10.             myaction="findAllRole.do?search="+search;  
  11.         }  
  12.         removeRequestAttribute(mapping,request);  
  13.         try {  
  14.             //Qbc查找方式  
  15.             CriteriaQuery cq=new CriteriaQuery(Role.class,curPageNO,myaction);  
  16.             cq.setPageSize(Constants.PAGE_SIZE);  
  17.             if(!AppUtils.isBlank(search)){  
  18.                 cq.like("name","%"+search+"%");   
  19.                 cq.add();  
  20.             }  
  21.             IState state=new StateImpl();  
  22.             PageSupport ps= (PageSupport)getBiz().findAllRole(cq, state);  
  23.             request.setAttribute("search",search);  
  24.             request.setAttribute("curPageNO",new Integer(ps.getCurPageNO()));  
  25.             request.setAttribute("offset"new Integer(ps.getOffset()+1));  
  26.             request.setAttribute("list", ps.getResultList());  
  27.             if(!AppUtils.isBlank(ps.getResultList()))  
  28.                 request.setAttribute("toolBar", ps.getToolBar());  
  29.         }catch (Exception e){  
  30.             return handleException(mapping, request, e, "RoleAction's findAllRole");  
  31.         }  
  32.         return mapping.findForward("view");  
  33.     } 

采用QBC对单表的分页很简单,只需要改变参数,并且在actionjsp之间传递。如果要分页的内容涉及到几张表,可以将业务逻辑封装为一个视图,并且做好视图相应的实体类,便可以象操纵单表一样。

<!---->1、  <!---->另外可以使用HQL来实现分页,在dao中:

java 代码
 
  1. public PageSupport find(final HqlQuery hqlQuery,final boolean needParameter)  
  2. {  
  3.     //logger.debug("find PageSupport ,HQL is: "+hqlQuery.getQueryString());  
  4.     return (PageSupport)getHibernateTemplate().execute(  
  5.     new HibernateCallback() {  
  6.         public Object doInHibernate(Session session) throws HibernateException, SQLException {  
  7.             Query query=session.createQuery(hqlQuery.getQueryString());  
  8.             if(needParameter)  
  9.                 query.setParameters(hqlQuery.getParam(), hqlQuery.getTypes());  
  10.             int allCounts=query.list().size();  
  11.             int curPageNO = PagerUtil.getCurPageNO(hqlQuery.getCurPage());  
  12.             int offset = PagerUtil.getOffset(allCounts, curPageNO, hqlQuery.getPageSize());  
  13.             String toolBar = PagerUtil.getBar(hqlQuery.getMyaction(),allCounts,curPageNO,hqlQuery.getPageSize());  
  14.             query.setFirstResult(offset);  
  15.             query.setMaxResults(hqlQuery.getPageSize());  
  16.             return new PageSupport(query.list(),toolBar,offset,curPageNO);  
  17.                 }         
  18.           }  
  19.     ,true);  
  20. }  

HqlQuery  代码如下:

java 代码
 
  1. public class HqlQuery  implements Serializable{  
  2.       
  3.     private String curPage=null ;  
  4.     private int pageSize=10;  
  5.     private String myaction;  
  6.     private String myform;  
  7.     private String queryString;  
  8.     private Object[] param;  
  9.     private Type[] types;  
  10.     public HqlQuery(String queryString, Object[] param) {  
  11.         this.queryString = queryString;  
  12.         this.param = param;  
  13.     }  
  14.       
  15.     public HqlQuery(String myaction) {  
  16.         this.myaction = myaction;  
  17.     }  
  18.     public Object[] getParam() {  
  19.         return param;  
  20.     }  
  21.       
  22.     public HqlQuery(String myaction, String queryString, Object[] param,Type[] types) {  
  23.         this.myaction = myaction;  
  24.         this.queryString = queryString;  
  25.         this.param = param;  
  26.         this.types=types;  
  27.     }  
  28.     public void setParam(Object[] param) {  
  29.         this.param = param;  
  30.     }  
  31.     public String getCurPage() {  
  32.         return curPage;  
  33.     }  
  34.     public void setCurPage(String curPage) {  
  35.         this.curPage = curPage;  
  36.     }  
  37.     public String getMyaction() {  
  38.         return myaction;  
  39.     }  
  40.     public void setMyaction(String myaction) {  
  41.         this.myaction = myaction;  
  42.     }  
  43.     public String getMyform() {  
  44.         return myform;  
  45.     }  
  46.     public void setMyform(String myform) {  
  47.         this.myform = myform;  
  48.     }  
  49.     public int getPageSize() {  
  50.         return pageSize;  
  51.     }  
  52.     public void setPageSize(int pageSize) {  
  53.         this.pageSize = pageSize;  
  54.     }  
  55.     public String getQueryString() {  
  56.         return queryString;  
  57.     }  
  58.     public void setQueryString(String queryString) {  
  59.         this.queryString = queryString;  
  60.     }  
  61.     public Type[] getTypes() {  
  62.         return types;  
  63.     }  
  64.     public void setTypes(Type[] types) {  
  65.         this.types = types;  
  66.     }  
  67.   
  68. }  

 

如此的单元测试:

java 代码
 
  1. public final void testfindOtherFunctionByHql() {  
  2.     logger.debug("testfindFunctionByRole");  
  3.     long l1=System.currentTimeMillis();  
  4.     String queryString="from Function where id=?";  
  5.     HqlQuery hqlQuery=new HqlQuery("myaction");  
  6.     hqlQuery.setCurPage("1");  
  7.     //hqlQuery.setPageSize(10);  
  8.       
  9.     PageSupport functions=BeanFactory.getInstance().getRightDelegate().findOtherFunctionByHql(hqlQuery,"1", state);  
  10.     long l2=System.currentTimeMillis();  
  11.     AppUtils.printCollection(functions.getResultList());  
  12.     List list=functions.getResultList();  
  13.     for(int i=0;i
  14.         Function f=(Function)list.get(i);  
  15.         System.out.println("getId = "+f.getId());  
  16.     }  
  17.     System.out.println("一共用时为 :  "+(l2-l1));          
  18. }  

总结:将分页的功能封装起来,每次请求构造参数不同的CriteriaQuery HqlQuery,后台的操作都是重复不变的,变得是查询的条件。如使用CriteriaQuery可以这样构造条件,Or或者and的条件可以用面向对象的方式来构造:

java 代码
 
  1. public final void findAllRole() {  
  2.     logger.debug("findAllRole");  
  3.     long l1=System.currentTimeMillis();  
  4.     String curPage = "2";  
  5.     String myaction="xxx.do?";           //Struts action的名字,看工具条的提示  
  6.     String myform="forms[0]";           //html 里面相应的form的名字  
  7.     CriteriaQuery cq=new CriteriaQuery(Role.class,curPage,myaction,myform); //Role.class为指定的类  
  8.     cq.setPageSize(2);                //不填默认为10     
  9.     cq.setCurPage(curPage);          //当前页,默认是第一页  
  10.     cq.addOrder("asc","id");        //根据id来排序,顺序是asc,或者是desc  
  11.     cq.like("name""ROLE_SUPERVISOR");      //条件0是name='test',其余大于小于like调用相应的API  
  12.     cq.eq("enabled""1");//1    //条件1  
  13.     cq.eq("roleType""ROLE_SUPERVISOR");//条件2  
  14.     //cq.add();          //条件1&&条件2  
  15.     cq.add(cq.or(cq.and(cq, 01), cq, 2));  
  16.     //cq.add();                       //增加条件,如果没有条件之间的关系则可以直接add()不带参数。  
  17.   
  18.     PageSupport ps=BeanFactory.getInstance().getRightDelegate().findAllRole(cq,state);  
  19.     long l2=System.currentTimeMillis();  
  20.     System.out.println("list size:  "+ps.getResultList().size());  
  21.     System.out.println("一共用时为 :  "+(l2-l1));  
  22.     for(int i=0;i
  23.         Role role=(Role)ps.getResultList().get(i);  
  24.         System.out.println("id = "+ role.getId());  
  25.             //print your code here  
  26.               
  27.             System.out.println("-----------------");  
  28.             }  
  29.     AppUtils.printCollection(ps.getResultList());  
  30.     System.out.println(ps.getToolBar());  
  31. }  

cq.add(cq.or(cq.and(cq, 0, 1), cq, 2)),这句是为CriteriaQuery增加条件。意思是条件(0 and 1 or 2。以下是日志打出来的结果:<o:p></o:p>

java 代码
 
  1. DEBUG [14:50:53] (POJODelegate.java:execute:82) - POJODelegate executing  
  2.  INFO [14:50:53] (SequenceProcessor.java:doActivities:23) - SequenceProcessor 流程开始 <-- FindAllRoleProcessor  
  3.  INFO [14:50:53] (SequenceProcessor.java:doActivities:32) - 活动 : FindAllRole  
  4. Hibernate: select count(*) as y0_ from t_role this_ where ((this_.name like ? and this_.enabled=?) or this_.role_type=?) order by this_.id asc  
  5. //首先查出总的记录数  
  6. Hibernate: select this_.id as id0_, this_.name as name3_0_, this_.role_type as role3_3_0_, this_.enabled as enabled3_0_, this_.note as note3_0_ from t_role this_ where ((this_.name like ? and this_.enabled=?) or this_.role_type=?) order by this_.id asc limit ?  
  7.  INFO [14:50:53] (SequenceProcessor.java:doActivities:69) -  SequenceProcessor 流程结束 -->  
  8. list size:  1  
  9. 一共用时为 :  531  
  10. id = 1  
  11. -----------------  
  12. 首页 上一页 下一页 尾页  共1条记录  转到"location='xxx.do?&curPageNO='+this.options[this.selectedIndex].value">1' selected>第1页  
   发表时间:2007-07-27  
源代码看:http://www.inforshare.com.cn:8080/,admin/admin,user/user.
0 请登录后投票
   发表时间:2007-07-30  
源代码看:http://www.inforshare.com.cn:8080/,admin/admin,user/user.

打不开
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics