论坛首页 Java企业应用论坛

一种传递分页参数的方法

浏览 30833 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-02-28  
在进行分页的时候,需要从web层获得分页的参数(当前页、每页记录数等),并传递到service、dao。这样各层的接口上就要出现许多分页对象的参数,觉得麻烦,特别是为一个先前没有进行分页的功能添加分页功能时候。个人觉得分页应该是显示层和dao的需求(一个为了显示效果,一个为了性能),最好不出现在service的接口上。
我自己采用的办法是,使用ServletFilter或Interceptor在WEB层截获分页的参数,封装成一个对象,然后保存在threadlocal中。这样当Service或Dao进行查询的时候可以按需从threadlocal中获得分页参数。在保存参数时,同时将分页参数放入request attribute或value stack,以供结果页面获得这些分页的参数。
采用这种方法,service和dao的接口上就不需要出现分页的参数,action中也不要保留分页参数。可以方便的为一个没有分页的查询添加分页功能,只需修改页面和service或dao的实现代码。
不知道大家对这种方法有什么看法。
   发表时间: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方法保存过用户对象,吃过这个亏
0 请登录后投票
   发表时间: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 也就完事了。

以上是想不通的地方,还请楼主明示。
0 请登录后投票
   发表时间:2006-02-28  
楼主的意思应该是每次调用action,页面都会把分页相关的参数传进来,用ThreadLocal保存后,就不需要在action层和service层做处理,由dao层直接拿到ThreadLocal保存的分页信息就可以叻。楼主解决的不是跨页面、多次请求的问题,而是处理一个分页请求时的参数传递问题。
0 请登录后投票
   发表时间:2006-02-28  
hongliang 写道
楼主的意思应该是每次调用action,页面都会把分页相关的参数传进来,用ThreadLocal保存后,就不需要在action层和service层做处理,由dao层直接拿到ThreadLocal保存的分页信息就可以叻。楼主解决的不是跨页面、多次请求的问题,而是处理一个分页请求时的参数传递问题。


没错。是我没有理解到位。thanks hongliang.
0 请登录后投票
   发表时间:2006-02-28  
To buaawhl:
我的理解是,分页参数的scope就是当前的request,我要做的是将这些参数从web层传递到数据访问层(跨越中间层的接口)。就类似于,Spring在web层open 一个hibernate session然后绑定在threadlocal中。
另外说明的是,我的方法中,分页对象中只保存分页的参数(当前页数等),不作为查询结果的缓存。
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间:2006-02-28  
分页参数走暗路,其它参数走方法签名路,怪胎就是。
0 请登录后投票
   发表时间:2006-02-28  
to jfy3d:
  不清楚你什么意思,我说得好像并不是如何构造一个含有分页参数的URL。另外粗略的看了你blog里面的示例,好像是直接在action里引用数据访问的类,如果是这样的话,那我说的方法确实是没有必要的。
0 请登录后投票
   发表时间:2006-02-28  
nihongye 写道
分页参数走暗路,其它参数走方法签名路,怪胎就是。


我觉得可以理解,因为分页太普遍叻,如果每个方法签名都挂上一堆分页相关的参数,的确不好看,一个firstResult和一个maxResults还好,如果还有排序的话,那还要排序字段名和顺序方式,这一下子就是四个参数,到最后整个dao接口就太恶叻,而且上面的service也要跟着恶,最上层的action调用起来也恶。。。

有更好的解决方法吗?
0 请登录后投票
论坛首页 Java企业应用版

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