锁定老帖子 主题:一种传递分页参数的方法
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-02-28
我自己采用的办法是,使用ServletFilter或Interceptor在WEB层截获分页的参数,封装成一个对象,然后保存在threadlocal中。这样当Service或Dao进行查询的时候可以按需从threadlocal中获得分页参数。在保存参数时,同时将分页参数放入request attribute或value stack,以供结果页面获得这些分页的参数。 采用这种方法,service和dao的接口上就不需要出现分页的参数,action中也不要保留分页参数。可以方便的为一个没有分页的查询添加分页功能,只需修改页面和service或dao的实现代码。 不知道大家对这种方法有什么看法。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-02-28
不错,有创意,我觉得你的做法比我的好。
我的做法是在Action层构造一个对象,然后一直往下扔,一直扔到dao。因为我整个dao都是带这个参数的。如果按照楼主的做法,我这个参数就可以从方法signature中拿掉叻,哈哈。 考虑到单元测试以及非web环境,那个threadlocal类似乎可以这样写: public final class QueryMetaLocal { private static final ThreadLocal LOCAL = new ThreadLocal();; //... public static QueryMeta getQueryMeta(); { QueryMeta qm = LOCAL.get();; if(qm==null); { return QueryMeta.DEFAULT_QUERY_META; } return qm; } } 这样就可以保证即使ThreadLocal里没有内容,也能返回默认的分页参数叻。 BTW: 上面我说的QueryMeta类包含firstResult、maxResults、排序方式等内容 写interceptor的时候应该注意在action执行完成后对threadlocal变量set(null)一下。。。我以前用ThreadLocal方法保存过用户对象,吃过这个亏 |
|
返回顶楼 | |
发表时间:2006-02-28
Prentice 写道 在进行分页的时候,需要从web层获得分页的参数(当前页、每页记录数等),并传递到service、dao。这样各层的接口上就要出现许多分页对象的参数,觉得麻烦,特别是为一个先前没有进行分页的功能添加分页功能时候。个人觉得分页应该是显示层和dao的需求(一个为了显示效果,一个为了性能),最好不出现在service的接口上。
我自己采用的办法是,使用ServletFilter或Interceptor在WEB层截获分页的参数,封装成一个对象,然后保存在threadlocal中。这样当Service或Dao进行查询的时候可以按需从threadlocal中获得分页参数。在保存参数时,同时将分页参数放入request attribute或value stack,以供结果页面获得这些分页的参数。 采用这种方法,service和dao的接口上就不需要出现分页的参数,action中也不要保留分页参数。可以方便的为一个没有分页的查询添加分页功能,只需修改页面和service或dao的实现代码。 不知道大家对这种方法有什么看法。 询问一下楼主,这种做法确保能够工作吗? 从原理上怎么也想不通 Thread Local 能做这件事情。放在session 还有情可原。 应该是 per request, per thread. request 一完事,thread local 也就完事了。 以上是想不通的地方,还请楼主明示。 |
|
返回顶楼 | |
发表时间:2006-02-28
楼主的意思应该是每次调用action,页面都会把分页相关的参数传进来,用ThreadLocal保存后,就不需要在action层和service层做处理,由dao层直接拿到ThreadLocal保存的分页信息就可以叻。楼主解决的不是跨页面、多次请求的问题,而是处理一个分页请求时的参数传递问题。
|
|
返回顶楼 | |
发表时间:2006-02-28
hongliang 写道 楼主的意思应该是每次调用action,页面都会把分页相关的参数传进来,用ThreadLocal保存后,就不需要在action层和service层做处理,由dao层直接拿到ThreadLocal保存的分页信息就可以叻。楼主解决的不是跨页面、多次请求的问题,而是处理一个分页请求时的参数传递问题。
没错。是我没有理解到位。thanks hongliang. |
|
返回顶楼 | |
发表时间:2006-02-28
To buaawhl:
我的理解是,分页参数的scope就是当前的request,我要做的是将这些参数从web层传递到数据访问层(跨越中间层的接口)。就类似于,Spring在web层open 一个hibernate session然后绑定在threadlocal中。 另外说明的是,我的方法中,分页对象中只保存分页的参数(当前页数等),不作为查询结果的缓存。 |
|
返回顶楼 | |
发表时间:2006-02-28
通用一点好把
private String getUrl(HttpServletRequest request) { String url = ""; Enumeration param = request.getParameterNames(); while (param.hasMoreElements()) { String pname = param.nextElement().toString(); if (!pname.equalsIgnoreCase("pagenum") && !pname.equalsIgnoreCase("submit")) url += pname + "=" + request.getParameter(pname) + "&"; } if (url.endsWith("&")) { url = url.substring(0, url.lastIndexOf("&")); } return url; } 详见 http://www.blogjava.net/jfy3d/archive/2005/05/11/4175.html 一直用这个 没碰到更方便的 其他好多方法还在用VO |
|
返回顶楼 | |
发表时间:2006-02-28
分页参数走暗路,其它参数走方法签名路,怪胎就是。
|
|
返回顶楼 | |
发表时间:2006-02-28
to jfy3d:
不清楚你什么意思,我说得好像并不是如何构造一个含有分页参数的URL。另外粗略的看了你blog里面的示例,好像是直接在action里引用数据访问的类,如果是这样的话,那我说的方法确实是没有必要的。 |
|
返回顶楼 | |
发表时间:2006-02-28
nihongye 写道 分页参数走暗路,其它参数走方法签名路,怪胎就是。
我觉得可以理解,因为分页太普遍叻,如果每个方法签名都挂上一堆分页相关的参数,的确不好看,一个firstResult和一个maxResults还好,如果还有排序的话,那还要排序字段名和顺序方式,这一下子就是四个参数,到最后整个dao接口就太恶叻,而且上面的service也要跟着恶,最上层的action调用起来也恶。。。 有更好的解决方法吗? |
|
返回顶楼 | |