精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-05-12
在此谨对IT界无私奉献的人们致敬!!! 但是给出的例子都是很简单(例子也许本来就是应该简单),在查询中并没有考虑参数的存在,例如: session.createQuery(from A a); .setFirstResult(0); .setMaxsetMaxResults(10);; 在这个查询中并没有涉及到参数的传递问题,但是在实际的应用中我们往往需要传递一大把的参数,甚者参数可以是不确定的,例如: session.createQuery(from A a ,B b where a.id=b.aid and a.x =? b.y=?); .setFirstResult(0); .setMaxsetMaxResults(10);; 如果我们在每次只提取当页数据的情况下,是否也应该考虑到我们的参数如何处理?是放在request URL中,还是隐藏表单,或者Session中?怎么样才能使我们的分页真正的解耦,通用。 期待大家的谈论、指导。。。。。。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-05-12
使用自己定义的 Pagination 对象来保存分页指令信息。
利用java的传引用的特性,可以将page对象直接从form传递到dao,而且web层还可以根据page生成分页导航条。 开发者只需要构造简单的page,通过page对象的传递,可以很灵活的进行上页,下页,指定起始位置,指定分页大小的任意分页查询。 目前,我通过我封装的page和我自己的代码生成器,基本可以把90%的代码自动生成。重用度极高。 下面dao部分的代码就是自动生成的。当然从jsp到actionform,到action到service,全部也都可以自动生成。 public List findBlogIssue( final java.lang.String blogNo, final java.util.Date addtime_begin, final java.util.Date addtime_end, final java.lang.String blogUserName, final java.lang.String blogContent, final Pagination page); { return (List);this.getHibernateTemplate();.execute( new HibernateCallback(); { public Object doInHibernate(Session session); throws SQLException, HibernateException { Criteria ca = session.createCriteria(BlogIssue.class);; if (blogNo != null && blogNo.length(); > 0); { ca.add(Expression.like("blogNo", blogNo, MatchMode.ANYWHERE););; } if (addtime_begin != null); { ca.add(Expression.ge("addtime", addtime_begin););; } if (addtime_end != null); { ca.add(Expression.le("addtime", addtime_end););; } if (blogUserName != null && blogUserName.length(); > 0); { ca.add(Expression.like("blogUserName", blogUserName););; } if (blogContent != null && blogContent.length(); > 0); { ca.add(Expression.like("blogContent", blogContent, MatchMode.ANYWHERE););; } if (page != null); { page.setTotalNum( ( (Integer); ca.setProjection(Projections. rowCount(););.uniqueResult(););.intValue(););; //在设置总记录数的时候,根据分页指令计算起始位置。 } ca.setProjection(null);; if (page != null); { ca.setMaxResults(page.getPageSize(););; ca.setFirstResult(page.getStartIndex(););; } return ca.list();; } }, true);; } |
|
返回顶楼 | |
发表时间:2006-05-12
codeutil 老兄,你可以给出你的具体的思路吗?
你现在只给出了生成以后的代码,跟一般我们写的程序没有两样.具体点啊. 期望你的回复! |
|
返回顶楼 | |
发表时间:2006-05-12
web表单里:
<html:hidden property="page.pageSize"/> <html:hidden property="page.pageAction"/> <html:hidden property="page.currentPage"/> 提交翻页查询的js: <script type="text/javascript"> function findByPage(action); { document.myActionForm['page.pageAction'].value=action; document.myActionForm.submit();; } </script> 翻页导航条: 共${myActionForm.page.totalNum}条记录 页数:${myActionForm.page.currentPage}/${myActionForm.page.totalPage} <c:if test="${!myActionForm.page.firstPage}"> <a href="javascript:findByPage('first');">首页</a> <a href="javascript:findByPage('pre');">上页</a> </c:if> <c:if test="${!myActionForm.page.lastPage}"> <a href="javascript:findByPage('next');">下页</a> <a href="javascript:findByPage('last');">末页</a> </c:if> MyActionForm.java public class MyActionFormextends ValidatorForm { private Pagination pageBean = new Pagination();;//存放分页指令以及分页结果信息 private java.lang.String blogNo; // 文章编号 private java.util.Date addtime_begin; // addtime private java.util.Date addtime_end; // addtime private java.lang.String blogUserName; // 博客用户名 private java.lang.String blogContent; // 文章内容 Action.java request.setAttribute("blogIssueList", this.getVarIBlogIssueLogic();.findBlogIssueby( form.getBlogNo();, form.getAddtime_begin();, form.getAddtime_end();, form.getBlogUserName();, form.getBlogContent();, form.getPageBean();););; service.java public List findBlogIssueby( java.lang.String blogNo, java.util.Date addtime_begin, java.util.Date addtime_end, java.lang.String blogUserName, java.lang.String blogContent, Pagination page);{ return getVarIBlogIssueDAO();.findBlogIssueby( blogNo, addtime_begin, addtime_end, blogUserName, blogContent, page);; } dao的就不再写了。 以上的代码都是代码生成器就生成好了的。 重用的时候基本把代码复制过来就改一下查询条件即可。 一点也不需要关心分页的问题。 |
|
返回顶楼 | |
发表时间:2006-05-15
恕小弟愚昧,你的代码虽然是很清晰,但是还是没有解决我想要问的问题。
第一、我所理解的通用,并不是指使用所有代码生成器之类的工具生成代码。用工具生成代码,在我看来只是把手工的东西变成自动化或者半自动化。 第二、在查询分页中,查询条件的传递问题。简单的说就是,当我翻到第n页的时候,我怎么知道用户查询时输入的查询条件(或者是组装的查询语句,对象)。 |
|
返回顶楼 | |
发表时间:2006-05-20
我个人觉得参数传递与分页的解耦、通用关系不大。
一般我对这种参数是放入request中。如果是webwork就更简单了,可以做一个查询条件的类,来放置查询的条件。 |
|
返回顶楼 | |
发表时间:2006-05-21
//我怎么知道用户查询时输入的查询条件(或者是组装的查询语句,对象)。
上面我的代码中,每次提交查询的时候,查询都从表单中获取。 |
|
返回顶楼 | |
发表时间:2006-06-22
既然已经写了,为什么大家不能把自己的代码帖出来呢?最好的可以直接运行的,然后再讨论一下嘛
|
|
返回顶楼 | |
发表时间:2006-06-27
发现一个好东西、老东西。
http://www.blogjava.net/aichan/archive/2006/06/27/55248.html Pager-taglib是个通用的分页标签库。可能解决参数传递、与逻辑解藕等问题。每个人可以根据自已的喜好去订制自已风格的导航页面。 |
|
返回顶楼 | |
发表时间:2006-07-01
不明白分页,在各个论坛上总是搞来搞去的,长盛不衰,实际上分页查询是很简单的,为什么搞的很麻烦。将分页查询进行功能分解:
1、显示层: a. 数据表格显示页面 b.分页条 2、action 接收查询参数,动态组装SQL。 3、查询DAO 接收SQL,分页参数,再次将SQL组装成有分页功能的SQL.查询数据库返回数据。 4、action接收数据,封装成Page组件。传递到页面。 这4个部分,框架能够完成的功能如下: 1、分页条 2、接收查询参数 3、查询DAO 4、封装查询数据 你需要完成的功能: 1、写SQL,不要以为写SQL很麻烦,比Hibernate方便多了。工作量也小多了。只需要返回一个SQL字符串和条件参数值就完事了。 2、在页面上取数据,填充到TD中。 所以你只需要做两项目工作,工作量很小的。根本不需要写多余的DTO类,因为查询参数是放在Map中,返回数据也是放在Map中,一行数据一个Map。你只需要用列名从Map中取出数据就完事了。 返回时,查询条件参数值仍然返回去了,所以在查询条上,原来输入的查询条件参数数据仍然可以自己保持在页面。 我们在项目中十分钟就搞定了了一个分页查询 1、因为页面可以复制一个模板,很快就写出来了。 2、因为只写SQL,爽死了,调优也非常的方便 3、不用写Action,整个框架就一个Action 4、更不用配置struts-config或xwork.xml.因为那个Action由框架配置好了。 5、调试方便,配置是由框架完成的,不用担心配置错误 6、测试方便,只专心写SQL,所以在相信框架不会出错的前提下,只需要专注测试SQL写的正确不正确。我们专一写了测试类。 |
|
返回顶楼 | |