带有 .html 的 Grails UrlMappings

标签 grails groovy

我正在开发一个 Grails Web 应用程序(主要作为学习练习)。我以前写过一些标准的 Grails 应用程序,但在这种情况下,我想尝试创建一个 Controller 来拦截表单的所有请求(包括静态 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 映射到单个 Controller :
class UrlMappings {
    static mappings = {
      "/$controller/$action?/$id?"{
          constraints {
          }
      }
      "/$path?" (controller: 'auditRecord', action: 'showPage')
      "500"(view:'/error')
    }
}

在该 Controller 中(在适当的“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 以便 Controller 中的 params.path 变量显示“testHtml.html”而不是去掉“html”扩展名?它似乎没有删除任何其他文件类型(包括 .htm)的扩展名。这样做有充分的理由吗?我知道将 Controller 用于静态 html 有点不寻常,但仍然想了解发生了什么。

最佳答案

这与内容协商有关,您可以在 Grails 用户指南的第 6.8 节中阅读相关内容。如果 Grails 将扩展识别为特定类型,则会从 URL 中删除扩展并将该类型添加到“格式”参数中。

您可以通过将此条目添加到 grails-app/conf/Config.groovy 来禁用此行为。 :

grails.mime.file.extensions = false

关于带有 .html 的 Grails UrlMappings,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2918347/

相关文章:

groovy - 读取文件夹中的文件,然后通过 groovy 执行某些操作

grails - Grails 2.4.x中的群集缓存

Grails 在 "create"和 "save"之间更新的实例在哪里

Grails DetachedCriteria 不包含 sqlRestriction

list - Groovy 列表和 map

java - 通过反射从java执行编译的groovy脚本

Grails 日志记录不起作用

grails - 如何在 Grails 中渲染 JSON?

dictionary - 从 Groovy 映射中删除给定键

groovy - Groovy 中 @Delegate 和 @Mixin AST 转换之间的区别