【问题标题】:Using HTML builders in grails instead of GSP在 grails 中使用 HTML 构建器而不是 GSP
【发布时间】:2010-12-22 22:26:48
【问题描述】:

有没有办法使用 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.MarkupBuilder 可以将前一段变成

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

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

【问题讨论】:

  • 我很想知道这有什么好处?构建器代码似乎不会比相应的 GSP 代码更简洁,但肯定会更深奥。
  • 这类似于在 Ruby on Rails 中使用 HAML (haml.info) 作为模板语言。
  • @Don:根据个人喜好,构建器代码似乎比冗长的 html 更具可读性...

标签: java grails groovy gsp


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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 - 绝对可以极大地简化事情。

    【讨论】:

      【解决方案3】:

      我没有完整的答案给你,但我怀疑关键将是获得对“视图解析器”的访问权限。在普通的 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 实例,它应该可以按上述方式工作。

      【讨论】:

        猜你喜欢
        • 2011-03-29
        • 1970-01-01
        • 2011-07-06
        • 2016-07-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-07
        • 2011-10-23
        • 1970-01-01
        相关资源
        最近更新 更多