如何迭代request.getParameterNames()?

时间:2011-03-21 21:38:42

标签: grails

我正在使用Grails 1.2.1。在引用HttpServletRequest对象的Grails方法中,如何遍历request.getParameterNames()枚举?这不起作用......

    protected void doCacheTransport(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {               
            def url = request.getParameter("url")
            request.getParameterNames().each { 
                def paramName = it
                if (paramName != "url") { 
                    remoteUrl << "&" << paramName << "=" << request.getParameter(paramName)
                }   // if
            }   // each

我在调试器中包含了'def url = request.getParameter(“url”)'行,以向自己证明参数“url”确实是定义的。但是,循环会跳过所有内容。

感谢您提供更多信息。 - 戴夫

1 个答案:

答案 0 :(得分:0)

我不太清楚为什么你的代码不能工作,因为它看起来很好(假设remoteUrl是在每个闭包之外声明的。无论如何,这可以简化很多。首先,通过利用getParameterMap() method of ServletRequest,其次,使用Groovy集合API中的模糊但非常强大的inject method

Inject接受一个初始值(我假设你在实际代码中设置了remoteUrl),然后迭代一个集合,传递一个累积值(或第一次传递的初始值),以及项目。这对于计算其结果以某种方式从集合中的每个元素派生的值非常方便。

那就是说,我认为你可以做这样的事情来得到你想要的结果:

protected void doCacheTransport(HttpServletRequest request, HttpServletResponse response) {
    def remoteUrl = request.parameterMap.entrySet().inject('http://someurl.example.com/?key=1828372') { url, entry ->
        if (entry.key == "url") return url
        else url << "&${entry.key}=${entry.value}"
    }
    // ...

}

如果你能提供更多关于你正在做什么的细节,我可以提供一个更有用的例子。