session - 如何存储操作的参数以供以后再次使用

我有一个可以排序,搜索和过滤的列表 View 。从该列表 View 中,用户可以分多个步骤编辑项目。最后,在编辑和查看更改之后,用户将返回列表。现在,我希望列表使用用户之前设置的相同排序,搜索词和过滤器,并显示正确的结果。

显示列表操作时,如何存储和重用多个参数(排序,搜索,过滤器)?

我认为的可能不令人满意的方式:

  • 传递所有必需的参数。如果两个列表操作调用
  • 之间涉及多个操作,则几乎不起作用
  • 将参数保存在 session 对象中。这似乎需要大量代码来处理多个参数(检查是否将参数传递给操作,存储新值,如果未传递参数,从 session 中获取旧参数,处理空字符串参数):
    Long longParameter
    if(params.containsKey('longParameter')) {
        longParameter = params.getLong('longParameter')
        session.setAttribute('longParameter', longParameter)
    } else {
        longParameter = session.getAttribute('longParameter') as Long
        params['longParameter'] = longParameter
    }
    
  • 最佳答案

    如果要使其更通用,可以改用Interceptor

    也许可以这样概括:

    class SessionParamInterceptor {
        SessionParamInterceptor() {
            matchAll() // You could match only controllers that are relevant.
        }
    
        static final List<String> sessionParams = ['myParam','otherParam','coolParam']
    
        boolean before() {
            sessionParams.each {
                // If the request contains param, then set it in session
                if (params.containsKey(it)) {
                    session[it] = params[it]
                } else {
                    // Else, get the value from session (it will be null, if not present)
                    params[it] = session[it]
                }
            }
    
            true
        }
    }
    

    静态sessionParams包含您要在 session 中存储/检索的参数。

    如果params包含列表中的元素,则将其以相同的名称存储在session中。如果没有,则从session中获取(假设存在)。

    在您的 Controller 中,您现在可以像往常一样访问params.getLong('theParam')。您还可以使用Grails参数转换:
    def myAction(Long theParam) {
    
    }
    

    节省了大量LOC。

    https://stackoverflow.com/questions/40149490/

    相关文章:

    grails - 如何在Grails(2.5.5)中自动在前面带有多个大写字母的服务接线

    colors - 在 ssh 之前导出 TERM

    ssh - 如何测量 SSH 隧道的带宽?

    bash - SSH隧道复杂问题

    ssh - ssh是否可以回显您发送的命令?

    pdf - 生成的pdf中的文本是反向的

    grails - Grails从1.3.7升级到3.2.6的路径

    svn - 通过SSH的svn diff-结果与Trac不同吗?

    mongodb - Grails 3 MongoDB无法从application.yml中读取con

    unit-testing - 基于 Spock 交互的测试 : too few invocation