我昨天搞砸了这一点,悲惨地失败了.我想转换:
"/$controller/$action?/$id?"
至
#in psudo
"/$controller/$id?/$action?"
#ideal regex
"\/(\w+)(\/\d+)?(\/\w+)?"
最明显的方式是“/ $controller / $action?/ $id?”
我可以编写正则表达式来做到这一点,但我找不到使用真正的正则表达式的方法(我发现RegexUrlMapping但无法找到如何使用它),也无法找到有关如何分配组的文档一个变量.
我的问题是两部分:
>如何使用真正的正则表达式定义URL资源.
>如何将“组”绑定到变量.换句话说,如果我定义一个正则表达式,我如何将它绑定到像$controller,$id,$action这样的变量
我还希望能够支持.json表示法/user/id.json
我试过的其他事情,我认为可行的:
"/$controller$id?$action?"{
constraints {
controller(matches:/\w+/)
id(matches:/\/\d+/)
action(matches:/\/\w+/)
}
}
还尝试过:
"/$controller/$id?/$action?"{
constraints {
controller(matches:/\w+/)
id(matches:/\d+/)
action(matches:/\w+/)
}
}
最佳答案 grails处理这个问题的方法是设置
grails.mime.file.extensions = true
在Config.groovy中.这将导致Grails在应用URL映射之前剥离文件扩展名,但使其可供withFormat
使用
def someAction() {
withFormat {
json {
render ([message:"hello"] as JSON)
}
xml {
render(contentType:'text/xml') {
//...
}
}
}
为此你只需要一个“$controller / $id?/ $action?”的URL映射.
我不知道在URL映射中以任何方式使用正则表达式的方法,但您可以使用以下事实来获得正向映射:您可以为在运行时获得的参数值指定闭包,并且可以访问其他参数:
"$controller/$a?/$b?" {
action = { params.b ?: params.a }
id = { params.b ? params.a : null }
}
其中说“如果设置了b,则将其用作动作,将其用作id,否则使用a作为动作并将id设置为null”.但这不会给你一个很好的反向映射,即createLink(控制器:’foo’,action:’bar’,id:1)不会生成任何合理的东西,你必须使用createLink(控制器:’foo) ‘,params:[a:1,b:’bar’])
编辑
你可以尝试的第三种可能性是结合
"/$controller/$id/$action"{
constraints {
controller(matches:/\w+/)
id(matches:/\d+/)
action(matches:/\w+/)
}
}
映射与补充
"/$controller/$action?"{
constraints {
controller(matches:/\w+/)
action(matches:/(?!\d+$)\w+/)
}
}
使用负向前瞻以确保两个映射是不相交的.