2009-12-03 35 views
3

有沒有辦法使用groovy構建器在Grails應用程序中構建JSP文件以保持足夠的集成?在grails而不是GSP中使用HTML構建器

更好地說明:默認情況下,Grails使用gsp文件非常好,但是非常詳細..

<div class="clear"> 
    <ul id="nav"> 
    <li><g:link controller="snippets" action="list">Snippets</g:link></li> 
    <li><g:link controller="users" action="list">Users</g:link></li> 
    <li><g:link controller="problems" action="list">Problems</g:link></li> 
    <li><g:link controller="messages" action="list">Messages</g:link></li> 
    </div> 
<div id="content"> 

有使用groovy.xml.MarkupBuilder THA會變成以前的成片的方式

div(class:'clear') { 
    ul(id:'nav') { 
    li { g_link(controller:'snippets', action:'list', 'Snippets') } 
// and so on 

當然g_link發明只是爲了給出這個想法..

+0

我很想知道它提供了什麼優點?似乎構建器代碼似乎不會更簡潔,相應的GSP代碼,但它肯定會更加深奧。 –

+0

這與在Ruby on Rails中使用HAML(http://haml.info/)作爲模板語言的想法類似。 –

+0

@Don:根據個人喜好,構建器代碼似乎比詳細的html更具可讀性...... –

回答

5

在grails用戶指南的web layer section下搜索構建器。在那裏有一個例子,它顯示瞭如何使用xml構建器來完成此操作。

1

我沒有一個完整的答案給你,但我懷疑關鍵是將獲得「視圖解析器」的訪問權限。在一個正常的應用程序用SpringMVC,這些在views.properties(或views.xml)配置如下:

csv=com.example.MyCSVResolver 
xml=com.example.MyXMLResolver 
audio=com.example.MySpeechResolver 

在用SpringMVC定期的應用程序,你從一個控制器動作返回類似new ModelAndView(myModel, 'csv')

這將導致CSVResolver類被調用,將myModel中的數據傳遞給它。除了包含要呈現的數據之外,myModel還可能包含一些格式選項(例如列寬)。

Spring會在視圖文件中搜索與視圖名稱匹配的關鍵字。如果它找不到匹配項,則默認情況下它只是使用視圖名稱呈現一個JSP並將其傳遞給模型數據。

現在回到Grails ....請記住,Grails實際上只是SpringMVC上的一個Groovy API,SpringMVC的大多數功能都可以從Grails中訪問。因此,如果您可以瞭解如何修改視圖文件,只需更改您的控制器操作即可返回適當的ModelAndView實例,並且應如上所述工作。

0

GSP允許您在<%>括號內運行任意Groovy代碼。所以,你可以有這樣的事情(從頁面借款例如通過BlackTiger鏈接):

<%  StringWriter w = new StringWriter() 
     def builder = new groovy.xml.MarkupBuilder(w) 
     builder.html{ 
      head{ 
       title 'Log in' 
      } 
      body{ 
       h1 'Hello' 
       builder.form{ } 
      } 
     }  
    out << w.toString() 
%> 

注意上面的電話G:表單標籤,你可以通過附加的東西給它。

所以你所要求的肯定是可能的,但我不確定它是否會最終取得勝利。我建議你或許更多地關注TagLibs與模板和SiteMesh Layouts的結合 - 絕對可以極大地簡化事情。