3

有没有办法使用groovy 构建器在 Grails 应用程序中构建 JSP 文件以保持足够的集成?

为了更好地解释:默认情况下,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.MarkupBuildertha 将前一块变成

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

当然g_link是为了给出这个想法而发明的..

4

3 回答 3

5

在 grails 用户指南的web 层部分下搜索 builder 。那里有一个示例,向您展示了如何使用 xml 构建器来执行此操作。

于 2009-12-03T20:46:53.037 回答
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实例,它应该可以按上述方式工作。

于 2009-12-03T18:20:20.110 回答
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:form 标签,您可以向它传递其他内容。

因此,您所要求的当然是可能的,尽管我不确定最终是否会获胜。我建议您结合模板和 SiteMesh 布局更多地查看 TagLibs - 绝对可以极大地简化事情。

于 2009-12-03T22:28:47.063 回答