2014-02-18 69 views
4

使用Grails,在UrlMappings.groovy,看來我可以指定控制器和動作:使用grails,我可以在UrlMappings.groovy中指定控制器,操作和視圖嗎?

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

或者我可以指定視圖:

"/someURL" (view: "someView") 

但我不能指定控制器,動作和視圖:

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

相反,我必須在控制器中指定視圖。有沒有辦法在UrlMappings.groovy中指定視圖?或者它是不可能的?

+3

你能解釋你想要達到什麼嗎?也許你需要一個通用的路由,將由一個控制器處理,所以你只能在控制器中定義視圖一次,但這一個控制器可以處理每一個路由,否則它沒有多大意義,因爲控制器應該建立模型渲染到視圖 –

+0

我不想在控制器的代碼中指定視圖;我寧願控制器單獨返回模型,以便我可以在UrlMappings.groovy文件中指定視圖。 – drew

+0

對不起,這對我沒有意義,我認爲它不可能。但我認爲它絕對有可能是你試圖達到的目標,但不是那樣,也許你應該提供一些關於視圖與控制器依賴關係的更多信息。 –

回答

10

要做到這一點,您首先需要知道Grails在底層使用Spring Web。 Spring Web是我能想到的最複雜的Web框架(能夠做AFAIK)。無論如何,重要的是要知道Spring Web的Request Life Cycle是如何工作的。您可以通過閱讀「的DispatcherServlet」,這是在春季網絡的主要的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實現中指定,解析符號視圖名到視圖對象。默認是InternalResourceViewResolver。可以在應用程序上下文中將ViewResolver對象添加爲bean,覆蓋默認的ViewResolver。 ViewResolver可以被賦予任何bean名稱(它們按類型進行測試)。
  • 如果用戶未提供視圖或視圖名稱,則配置的RequestToViewNameTranslator會將當前請求轉換爲視圖名稱。相應的bean名稱是「viewNameTranslator」;默認是DefaultRequestToViewNameTranslator。

你真正想要做的是創建一個自定義的ViewResolver或RequestToViewNameTranslator。這個世界非常複雜 - 如果用戶明確地在Grails控制器中提供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 Mappings配置數據,因此您可以在其中定義視圖(但您認爲合適)。該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

我不完全相信你是否可以只扔東西在裏面,但因爲它是時髦我認爲你可以。如果沒有,你將至少有2種選擇:

  1. 創建只是控制器/視圖映射一個新的配置文件,您的自定義視圖/視圖名稱解析器將使用
  2. 自定義基於Grails的源URLMappings來解釋你的自定義配置

一點題外話,這裏是有關刪除默認映射文件和主軋有趣的文章主題: http://mrhaki.blogspot.com/2011/12/grails-goodness-customize-url-format.html

同樣,我發現幾個帖子在線,人們沿着這條路走下去,結果太難了,因爲衆多的配置文件需要使其發揮作用。因此,我強烈建議我。在某種程度上,我同意在這個頁面上的迴應(這是你會看到很多嘗試從grails宇宙中做出一些事情): Bypassing grails view resolvers?

相關問題