如何在grails控制器中使用路径变量?

时间:2014-07-02 11:33:02

标签: grails parameters grails-controller

我一直在尝试在grails控制器中使用路径变量,但我无法实现它。 背后的意图是验证提交给我需要强制的URL的参数。我无法通过RequestParam实现它,所以我切换到PathVariable,以便提交没有所需param的url应该由grails控制器本身过滤掉,而不是我添加if / else检查有效性。

所以,我可以说明如下: 我的网址如下: -

'<appcontext>/<controller>/<action>?<paramName>=<something>'

现在,制作&#39; paramName&#39;强制我没有在Grails中找到任何方法(Spring MVC提供了@RequestParam注释,这使得我能够满足&#39;必需&#39;为真)。

我想到的另一个选择是使用路径变量,以便&#39; paramName&#39;可以包含在URL本身中。所以我尝试了以下内容:

'<appcontext>/<controller>/<action>/$paramName'

为了验证上面的URL,我编写了特定的映射,但有些映射不起作用..

以下是我写的具体映射: -

"/<controllerName>/<action>/$paramName" {
            controller:<controller to take request>
            action:<action to do task>
            constraints {
                paramName(nullable: false,empty:false, blank: false)
            }
        }

我尝试在控制器中使用类似@PathVariable和@RequestParam的弹簧注释,如下所示: -

 def action(@PathVariable("paramName") String param){
        //code goes here
    }

1 个答案:

答案 0 :(得分:13)

如果您将方法参数命名为与请求参数重命名相同,Grails将为您处理...

// In UrlMappings.groovy
"/foo/$someVariable/$someOtherVariable" {
    controller = 'demo'
    action = 'magic'
}

然后在你的控制器中:

// grails-app/controllers/com/demo/DemoController.groovy
class DemoController {
    def magic(String someOtherVariable, String someVariable) {
        // a request to /foo/jeff/brown will result in
        // this action being invoked, someOtherVariable will be
        // "brown" and someVariable will be "jeff"
    }
}

我希望有所帮助。

修改

另一种选择......

如果由于某种原因你想要方法参数的不同名称,你可以显式地将方法参数映射到像这样的请求参数......

import grails.web.RequestParameter
class DemoController {
    def magic(@RequestParameter('someVariable') String s1, 
              @RequestParameter('someOtherVariable') String s2) {
        // a request to /foo/jeff/brown will result in
        // this action being invoked, s2 will be
        // "brown" and s1 will be "jeff"
    }
}