我一直在尝试在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
}
答案 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"
}
}