gpt4 book ai didi

grails - 使用 grails,我可以在 UrlMappings.groovy 中指定 Controller 、操作和 View 吗?

转载 作者:行者123 更新时间:2023-12-02 01:38:02 26 4
gpt4 key购买 nike

使用 Grails,在 UrlMappings.groovy 中,我似乎可以指定 Controller 和操作:

"/someURL" (controller: "Some", action: "someAction")

或者我可以指定 View :

"/someURL" (view: "someView")

但我无法指定 Controller 、操作和 View :

"/someURL" (controller: "Some", action: "someAction", view: "someView")

相反,我必须在 Controller 中指定 View 。有没有办法在 UrlMappings.groovy 中指定 View ?还是根本不可能?

最佳答案

为此,您首先需要了解 Grails 在底层使用 Spring Web。 Spring Web 是我能想到的最复杂的 Web 框架(据我所知,它能够做任何事情)。无论如何,重要的是要了解 Spring Web 的请求生命周期是如何工作的。您可以通过阅读“DispatcherServlet”的文档来感受它,它是 Spring Web 中的主要 Servlet(因此也是 Grails 中的主要 Servlet): http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/DispatcherServlet.html

这是一篇来自 grails 团队的精彩文章,介绍了 grails 为何真的只是 spring: http://spring.io/blog/2010/06/08/spring-the-foundation-for-grails/

与这个问题相关的重要部分是该文档中的这两行:

  • 它的 View 解析策略可以通过 ViewResolver 实现来指定,将符号 View 名称解析为 View 对象。默认为InternalResourceViewResolver。 ViewResolver 对象可以作为 bean 添加到应用程序上下文中,从而覆盖默认的 ViewResolver。 ViewResolvers 可以被赋予任何 bean 名称(它们是按类型测试的)。
  • 如果用户未提供 View 或 View 名称,则配置的 RequestToViewNameTranslator 会将当前请求转换为 View 名称。对应的bean名称是“viewNameTranslator”;默认为 DefaultRequestToViewNameTranslator。

您真正想做的是创建一个自定义的 ViewResolver 或 RequestToViewNameTranslator。世界是相当复杂的——如果 View 是由用户在 Grails Controller 中显式提供的,那么您将需要一个 ViewResolver。如果返回一个 Map(或其他一些自定义对象),那么您需要一个 RequestToViewNameTranslator。

不要忘记 grails 已经定制了这两件事,以使用整个“约定优于配置”的思想。所以,你必须小心如何实现你的 - 我建议查看这些东西的 grails 默认实现。

GrailsViewResolver 的源代码在这里: https://github.com/grails/grails-core/blob/master/grails-web/src/main/groovy/org/codehaus/groovy/grails/web/servlet/view/GrailsViewResolver.java

现在,真正的乐趣开始了。 grails 团队不仅提供了 Spring Web 默认生命周期的自定义实现,还完全自定义了调度程序 servlet。这意味着您需要了解它们的宇宙与 Spring 宇宙有何不同(从而使许多有用的 Spring 论坛问题变得无关紧要)。以下是 GrailsDispatcherServlet 源代码的链接: https://github.com/grails/grails-core/blob/master/grails-web/src/main/groovy/org/codehaus/groovy/grails/web/servlet/GrailsDispatcherServlet.java

因此,如果您成功阅读到这里,您可能可以想象如何编写自定义 View 解析器来返回您想要的 View ,以及如何访问 URL 映射配置数据,以便您可以在其中定义 View (但您认为合适)。 UrlMappings 文件与 spring bean 相关,可使用属性“grailsUrlMappingsHolderBean” Autowiring - 请参阅 http://grails.org/doc/2.3.4/ref/Plug-ins/URL%20mappings.html

从该 bean 中,您可以访问 UrlMappings 对象,您可以通过该对象访问所有 UrlMapping 定义。看: https://github.com/grails/grails-core/blob/master/grails-web/src/main/groovy/org/codehaus/groovy/grails/web/mapping/UrlMappings.java https://github.com/grails/grails-core/blob/master/grails-web/src/main/groovy/org/codehaus/groovy/grails/web/mapping/UrlMapping.java

我并不完全相信你是否可以在里面扔任何东西,但因为它很酷,我认为你可以。如果没有,您至少有两个选择:

  1. 仅为您的自定义 View / View 名称解析器将使用的 Controller / View 映射创建一个新的配置文件
  2. 根据 grails 源自定义 URLMappings 以解释您的自定义配置

有点偏离主题,这是一篇关于删除默认映射文件并自行滚动的有趣文章: http://mrhaki.blogspot.com/2011/12/grails-goodness-customize-url-format.html

我再次在网上发现了几篇帖子,人们都走上了这条路,但最终发现它太难了,因为需要大量的配置才能使其发挥作用。因此,我强烈建议不要这样做。在某种程度上,我同意这个页面上的回应(这是你会看到的很多试图在 grails 宇宙之外做一些事情的内容): Bypassing grails view resolvers?

关于grails - 使用 grails,我可以在 UrlMappings.groovy 中指定 Controller 、操作和 View 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21866542/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com