【发布时间】:2010-05-27 03:51:38
【问题描述】:
我正在开发一个 Grails Web 应用程序(主要作为学习练习)。我之前写过一些标准的 Grails 应用程序,但是在这种情况下,我想尝试创建一个控制器来拦截表单的所有请求(包括静态 html):
<a href="/testApp/testJsp.jsp">test 1</a>
<a href="/testApp/testGsp.gsp">test 2</a>
<a href="/testApp/testHtm.htm">test 3</a>
<a href="/testApp/testHtml.html">test 4</a>
目的是在用户每次点击链接时执行一些简单的业务逻辑(审核)。我知道我可以使用过滤器(或一系列其他方法)来做到这一点,但是我认为这也应该有效,并希望使用 Grails 框架来做到这一点。
我设置了 Grail UrlMappings.groovy 文件以将该表单 (/$myPathParam?) 的所有 URL 映射到单个控制器:
class UrlMappings {
static mappings = {
"/$controller/$action?/$id?"{
constraints {
}
}
"/$path?" (controller: 'auditRecord', action: 'showPage')
"500"(view:'/error')
}
}
在那个控制器中(在适当的“showPage”操作中)我一直在打印出路径信息,例如:
def showPage = {
println "params.path = " + params.path
...
render(view: resultingView)
}
我的四个链接中的每一个的 showPage 操作中的 println 的结果是
testJsp.jsp
testGsp.gsp
testHtm.htm
testHtml
为什么最后一个是“testHtml”,而不是“testHtml.html”?
在以前的 (Stack Overflow query) 中,Olexandr 遇到了这个问题,并被建议简单地连接 request.format 的值 - 实际上,它确实返回“html”。但是 request.format 也为所有四个链接返回“html”。
我有兴趣了解 Grails 在做什么以及为什么这样做。是否有某种方法可以配置 Grails,以便控制器中的 params.path 变量显示“testHtml.html”而不是剥离“html”扩展名?它似乎没有删除任何其他文件类型(包括 .htm)的扩展名。它这样做有充分的理由吗?我知道将控制器用于静态 html 有点不寻常,但仍然想了解发生了什么。
【问题讨论】:
-
grails 过滤器是一个更好的方法,它确实是。查看 URI 映射 grails.org/doc/1.2.0/guide/single.html#6.6%20Filters