使用Grails,在UrlMappings.groovy中,似乎我可以指定控制器和操作:
"/someURL" (controller: "Some", action: "someAction")
或者我可以指定视图:
"/someURL" (view: "someView")
但我无法指定控制器,操作和视图:
"/someURL" (controller: "Some", action: "someAction", view: "someView")
相反,我必须在控制器中指定视图。有没有办法在UrlMappings.groovy中指定视图?或者这是不可能的?
答案 0 :(得分:10)
要做到这一点,您首先需要知道Grails使用Spring Web。 Spring Web是我能想到的最复杂的Web框架(能够做任何事情AFAIK)。无论如何,重要的是要知道Spring Web的请求生命周期是如何工作的。您可以通过阅读“DispatcherServlet”的文档来了解它,它是Spring Web中的主要Servlet(因此也是Grails中): http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/DispatcherServlet.html
以下是grails团队关于grails如何才真正春天的精彩文章: http://spring.io/blog/2010/06/08/spring-the-foundation-for-grails/
与这个问题相关的重要部分是文档中的这两行:
您真正想要做的是创建自定义的ViewResolver或RequestToViewNameTranslator。这个世界非常复杂 - 如果用户在Grails Controller中明确地提供了View,那么你需要一个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。这意味着您需要了解他们的宇宙与春天宇宙的不同之处(从而使许多有用的春季论坛问题变得无关紧要)。这是GrailsDispatcherServlet源代码的链接: https://github.com/grails/grails-core/blob/master/grails-web/src/main/groovy/org/codehaus/groovy/grails/web/servlet/GrailsDispatcherServlet.java
因此,如果你设法读到这一点,你可以设想如何编写自定义视图解析器来返回你想要的视图,但是如何访问URL映射配置数据,这样你就可以在那里定义视图(但你认为合适)。 UrlMappings文件与spring bean有关,可以使用属性“grailsUrlMappingsHolderBean”进行自动装配 - 请参阅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
我不完全相信你是否可以在那里扔任何东西,但因为它很时髦我认为你可以。如果没有,您将至少有两个选项:
有点偏离主题,这是一篇有趣的文章,关于删除默认的映射文件和自己滚动自己: http://mrhaki.blogspot.com/2011/12/grails-goodness-customize-url-format.html
再一次,我在网上找到了几个人们沿着这条路走下去的帖子,但由于需要很多配置才能让它发挥作用,所以最终太难了。因此,我强烈建议反对。在某种程度上,我同意这个页面上的回复(这将是你将看到的很多尝试从grails世界做一些事情): Bypassing grails view resolvers?