锁定老帖子 主题:一种传递分页参数的方法
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-03-01
robbin 写道 反对这种做法,我一次web request过程中,可能牵涉n个Service的m个DAO调用,可能涉及x种domain对象的分页处理,你要在ThreadLocal里面分别传递好多个分页参数,而且还必须清楚的区分哪个参数是哪个DAO用到的。这种大量隐式契约的编程味道太坏了。
其实分页很简单,封装一个Pagination对象,所有需要传入传出的参数都封装在里面就OK了,Hibernate版我贴过代码的,用起来很方便。 我比较赞同robbin,代码狂少 public class ListPassengerAction extends BaseAction { private Pagination pagination = new Pagination();; private List passengers; private PassengerService passengerService; public String execute(); throws Exception { pagination = this.passengerService.findPassengerPagination(pagination);; if (null != pagination); { passengers = pagination.getItems();; } return SUCCESS; } } public class PassengerServiceImpl implements PassengerService { private PassengerDAO passengerDAO; public Pagination findPassengerPagination(Pagination pagination); { return passengerDAO.findPassengerPagination(pagination);; } } public class PassengerDAO extends BaseDAO { public Pagination findPassengerPagination(Pagination pagination); { return this.findPaginationByCriteria(Passenger.class, pagination);; } } public abstract class BaseDAO extends HibernateDaoSupport { public Pagination findPaginationByCriteria(final Class entity, final Pagination pagination); { DetachedCriteria detachedCriteria = DetachedCriteria.forClass(entity);; return (Pagination); getHibernateTemplate();.execute(new HibernateCallback(); { public Object doInHibernate(Session session); throws HibernateException { Criteria criteria = detachedCriteria.getExecutableCriteria(session);; if (null != pagination.getAscOrder(); && !"".equals(pagination.getAscOrder(););); { detachedCriteria.addOrder(Order.asc(pagination.getAscOrder();););; } else if (null != pagination.getDescOrder(); && !"".equals(pagination.getDescOrder(););); { detachedCriteria.addOrder(Order.desc(pagination.getDescOrder();););; } Integer count = (Integer); criteria.setProjection(Projections.rowCount(););.uniqueResult();; if (null != count); { criteria.setProjection(null);; pagination.setCount(count.intValue(););; List items = criteria.setFirstResult(pagination.getStart(););.setMaxResults(pagination.getSize(););.list();; pagination.setItems(items);; } return pagination; } }, true);; } } <div id="passengersListContainer" class="x_list_container" style="height: ${((pagination.size);?default(15);*22 + 23);}px;"><!-- write by JavaScript --></div> <script language="JavaScript" type="text/JavaScript"> <!-- var passengersParam = [ XL_CONST_ROWTYPE_EMPTY, true, 'all_passengers', 'id_passengers', 'viewPassenger', '', '', '', '', 30, true, '${(pagination.ascOrder);?if_exists}', '${(pagination.descOrder);?if_exists}', 'listPassengerByOrder' ] var passengersArrayRows = new Array();; <#if passengers ? exists> <#list passengers as passenger> passengersArrayRows[passengersArrayRows.length] = [ '0', '0', '${(passenger.id);?if_exists}', '${(passenger.name);?if_exists}', '${(passenger.position);?if_exists}', '${action.getDictionaryText("PASSENGER", "GENDER", passenger.gender);}', '${(passenger.birth);?if_exists}', '${(passenger.age);?if_exists}', '${(passenger.tel);?if_exists}', '${(passenger.address);?if_exists}', '${(passenger.contact);?if_exists}', '${(passenger.cardNo);?if_exists}', '${action.html(passenger.sitCustom);}', '${action.html(passenger.boardCustom);}', '${action.html(passenger.dietCustom);}', '${action.html(passenger.specialDemand);}', '${action.html(passenger.growExperience);}', '${action.html(passenger.commit);}', '${(passenger.photo);?default("default.gif");}', '${(passenger.reserve1);?if_exists}', '${(passenger.reserve2);?if_exists}', '${(passenger.reserve3);?if_exists}', '${(passenger.reserve4);?if_exists}', '${(passenger.reserve5);?if_exists}' ] </#list> </#if> var passengersArrayColumns = [ ['${action.getText("passenger.name");}', '1', '0', 'name' ], ['${action.getText("passenger.position");}', '0', '0', 'position' ], ['${action.getText("passenger.gender");}', '1', '0', 'gender' ], ['${action.getText("passenger.birth");}', '0', '0', 'birth' ], ['${action.getText("passenger.age");}', '1', '0', 'age' ], ['${action.getText("passenger.tel");}', '1', '0', 'tel' ], ['${action.getText("passenger.address");}', '1', '0', 'address' ], ['${action.getText("passenger.contact");}', '1', '0', 'contact' ], ['${action.getText("passenger.cardNo");}', '1', '0', 'cardNo' ], ['${action.getText("passenger.sitCustom");}', '0', '0', 'sitCustom' ], ['${action.getText("passenger.boardCustom");}', '0', '0', 'boardCustom' ], ['${action.getText("passenger.dietCustom");}', '0', '0', 'dietCustom' ], ['${action.getText("passenger.specialDemand");}', '0', '0', 'specialDemand'], ['${action.getText("passenger.growExperience");}', '0', '0', 'growExperience'], ['${action.getText("passenger.commit");}', '0', '0', 'commit' ], ['${action.getText("passenger.photo");}', '1', '1', 'photo' ], ['${action.getText("passenger.reserve1");}', '0', '0', 'reserve1' ], ['${action.getText("passenger.reserve2");}', '0', '0', 'reserve2' ], ['${action.getText("passenger.reserve3");}', '0', '0', 'reserve3' ], ['${action.getText("passenger.reserve4");}', '0', '0', 'reserve4' ], ['${action.getText("passenger.reserve5");}', '0', '1', 'reserve5' ] ] //--> </script> <script language="JavaScript" type="text/JavaScript"> <!-- xListBuildAll('passengers', passengersParam, passengersArrayColumns, passengersArrayRows);; //--> </script> <script language="JavaScript" type="text/JavaScript"> <!-- xPageBarBuild(['800', ${(pagination.size);?default(15);}, ${(pagination.index);?default(1);}, ${(pagination.count);?default(0);}, 'listPassengerPagination']);; //['width', pageSize, pageIndex, totalCount,'eventName'] //--> </script> <form name="listForm" action="listPassenger.action" method="post"> <input name="pagination.index" type="hidden" value="${(pagination.index);?if_exists}" /> <input name="pagination.size" type="hidden" value="${(pagination.size);?if_exists}" /> <input name="pagination.ascOrder" type="hidden" value="${(pagination.ascOrder);?if_exists}" /> <input name="pagination.descOrder" type="hidden" value="${(pagination.descOrder);?if_exists}" /> <input name="entryName" type="hidden" value="${(entryName);?if_exists}" /> <input name="entryValue" type="hidden" value="${(entryValue);?if_exists}" /> </form> <script language="JavaScript" type="text/JavaScript"> <!-- function listPassengerByOrder(ascOrder, descOrder); { document.listForm['pagination.ascOrder'].value = ascOrder; document.listForm['pagination.descOrder'].value = descOrder; document.listForm.submit();; return false; } function listPassengerPagination(index, size); { document.listForm['pagination.index'].value = index; document.listForm['pagination.size'].value = size; document.listForm.submit();; return false; } //--> </script> |
|
返回顶楼 | |
发表时间:2006-03-01
一份代码把 以下都作了
分页(用户可定义分页大小) 排序(按某一个字段升/降排序) 列筛选(自定义js的组件) 行记录明细(自定义js的组件) 分页bar(自定义js的组件) |
|
返回顶楼 | |
发表时间:2006-03-01
public Pagination findPaginationByCriteria(final Class entity, final Pagination pagination); { ... Integer count = (Integer); criteria.setProjection(Projections.rowCount(););.uniqueResult();; if (null != count); { ... 记录数为0,就不继续查询了。。。 我觉得这个代码里面的count永远都不会为null。。。 |
|
返回顶楼 | |
发表时间:2006-03-01
Prentice 写道 ajoo 写道 thread local说穿了,就是一全局变量.
其实,pagination可以作为显示层的对象,到dao这一层,你可以把它翻译成为query对象的。用threadlocal,接口上虽然dao不依赖分页,实现上也要依赖,掩耳盗铃罢了。 我同意不管怎么做Dao总是要对分页依赖的。我的想法是有许多情况下service的接口上出现Pagination只是为了传递给Dao,特别当系统中的许多service的接口上都有Pagination这样的参数时,觉得这样一个遍布整个系统的feature是不是可以用AOP这样的技术解决。 还有就是,我们往往在系统开始就考虑分页。如果不是这样,开发、使用后再添加分页的话,那就需要大量修改接口。这样,一个界面上的需求,就会使得整个系统的接口发生大的改变。 dao肯定是不需要pagination的。service需要么? 举个service接口需要pagination的例子? |
|
返回顶楼 | |
发表时间:2006-03-01
ajoo 写道 dao肯定是不需要pagination的。service需要么?
举个service接口需要pagination的例子? 想听听ajoo的做法,想看看ajoo的代码 |
|
返回顶楼 | |
发表时间:2006-03-01
ajoo 写道 dao肯定是不需要pagination的。service需要么? 举个service接口需要pagination的例子? 我现在的做法是 Web层的Action调用service,servic调用dao 或是直接调用hibernateTemplate进行持久化操作。虽然有一些service操作代表的业务逻辑本身就是持久化操作,可以Action直接调用dao,但是我还是通过service调用Dao,这样一方面可以在service提供事务处理,另外就是统一得在service层建立一个业务逻辑的接口。这样就需要通过service将Pagination传递到Dao。 比如查询用户 UserDao 有一个方法 : List findUser( Date birthday , Pagination p ); 如果你选择直接在Action里调用UserDao的这个方法,那么就不需要用我说的方法。 而我的做法是 service层有个UserManager,他有一个同样的方法: List findUser( Date birthday , Pagination p ); 这个方法内,调用UserDao 的findUser,这样UserManager的接口上就要Pagination,这里出现Pagination的目的只是为了传递给Dao。 另一种情况,如果你把所有的查询操作从一个个service对象中抽取出来,有专门的QueryManager,那么Pagination出现在这些查询对象的接口上,我觉得也是正常的。 |
|
返回顶楼 | |
发表时间:2006-03-01
hongliang 写道 partech 写道 赫赫,老师留作业时,通常是这样:“课后作业,135页6,7,8”。 然后老师会批改你的作业。 按照Prentice的说法,就成“明天交课后作业。”了... 我真的觉得它说的不无道理,你想想,老师留作业后,我们在书上做好标记,回家后,脑子里想的肯定是“明天交作业”,而不是“明天交作业,135页6、7、8”这么多详细的信息。等到坐在桌前,翻开书,寻找到标记后,才知道做哪些题。。。 可是我们无法对老师说,我今天做的是135页1 ,2 ,3, 4,5 ,老师你看着办吧。 |
|
返回顶楼 | |
发表时间:2006-03-01
sorphi 写道 public Pagination findPaginationByCriteria(final Class entity, final Pagination pagination); { ... Integer count = (Integer); criteria.setProjection(Projections.rowCount(););.uniqueResult();; if (null != count); { ... 记录数为0,就不继续查询了。。。 我觉得这个代码里面的count永远都不会为null。。。 我也这么想 但出现count 就是出现了 NullPointerException |
|
返回顶楼 | |
发表时间:2006-03-01
hongliang 写道 ajoo 写道 dao肯定是不需要pagination的。service需要么?
举个service接口需要pagination的例子? 想听听ajoo的做法,想看看ajoo的代码 我也很想看看 |
|
返回顶楼 | |
发表时间:2006-03-01
frogfool 写道 sorphi 写道 public Pagination findPaginationByCriteria(final Class entity, final Pagination pagination); { ... Integer count = (Integer); criteria.setProjection(Projections.rowCount(););.uniqueResult();; if (null != count); { ... 记录数为0,就不继续查询了。。。 我觉得这个代码里面的count永远都不会为null。。。 我也这么想 但出现count 就是出现了 NullPointerException 不可能吧。。。Hibernate的uniqueResult()不会返回null的啊 |
|
返回顶楼 | |