2009-12-03 61 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的结合 - 绝对可以极大地简化事情。

相关问题