grailsg:包括它可以做到吗?

grailsg:包括它可以做到吗?,grails,grails-controller,Grails,Grails Controller,我想知道是否可以使用g:include只包含给定页面的正文内容 假设我有一个主布局页面,如下所示: <html> <head> <title>My start page</title> <g:layoutHead> </head> <body> <g:layoutBody> </body> </html> 我的起始页 然后是一个主页

我想知道是否可以使用g:include只包含给定页面的正文内容

假设我有一个主布局页面,如下所示:

<html>
  <head>
    <title>My start page</title>
    <g:layoutHead>
  </head>
  <body>
    <g:layoutBody>
  </body>
</html>

我的起始页
然后是一个主页(index.gsp)


这是我的索引正文内容,包含
查看完整列表!
最后是书籍/列表页面

<html>
  <head>
    <!-- main layout reference -->
    <meta name="layout" content="main"/>
  </head>
  <body>
    <table>
    <g:each in="${books}">
      <tr>
        <td>${it.author}</td>
        <td>${it.title}</td>
        <td>${it.price}</td>
      </tr>
    </g:each>
    </table>
  </body>
</html>

${it.author}
${it.title}
${it.price}
所以我想要实现的是,主页(index.gsp)只包含在book/list页面中定义的表。但是,当我尝试此操作时,它包含了定义的整个html(
标记和所有标记)

有可能以某种方式做到这一点吗?我尝试过类似于
的方法,但是这不起作用。我真的不想在“索引控制器”中添加图书列表逻辑,我想重用我现有的控制器


我不可能是第一个拥有这个用例的人,你们想出了什么解决方案?

这是不可能的。一个想法是基于
g:include
创建一个自定义标记,该标记通过xpath表达式等方式去除部分代码。我不知道这已经存在于某处

另一种方法是使用
g:render
将书的
list.gsp
主体部分重构为一个模板,并从
index.gsp
引用该模板。但这意味着数据模型必须在index.gsp上下文中可用,因为g:render不调用控制器


旁注:当使用
g:include
时,最好使用页面片段缓存。

是的,但您需要在其中再增加一个级别。看看Grails模板。基本上,您将拥有一个模板:_books.gsp,其中包含:

   <table>
    <g:each in="${books}">
      <tr>
        <td>${it.author}</td>
        <td>${it.title}</td>
        <td>${it.price}</td>
      </tr>
    </g:each>
    </table>

${it.author}
${it.title}
${it.price}
那么您的索引将是:

<html>
  <head>
    <!-- main layout reference -->
    <meta name="layout" content="main"/>
  </head>
  <body>
    THIS IS MY INDEX BODY CONTENT WITH AN INCLUDE
    <g:render template="books">
    <g:link controller="book" action="list">See the full list!</g:link>
  </body>
</html>
<html>
  <head>
    <!-- main layout reference -->
    <meta name="layout" content="main"/>
  </head>
  <body>
    <g:render template="books" />
  </body>
</html>

这是我的索引正文内容,包含
查看完整列表!
你的名单是:

<html>
  <head>
    <!-- main layout reference -->
    <meta name="layout" content="main"/>
  </head>
  <body>
    THIS IS MY INDEX BODY CONTENT WITH AN INCLUDE
    <g:render template="books">
    <g:link controller="book" action="list">See the full list!</g:link>
  </body>
</html>
<html>
  <head>
    <!-- main layout reference -->
    <meta name="layout" content="main"/>
  </head>
  <body>
    <g:render template="books" />
  </body>
</html>


(我的语法可能不是100%正确,因为我已经做了几个月了,但模板背后的想法是简短的、可重用的GSP代码片段,它们不打算单独显示。

您可以使用
applyLayout
标记。只需创建一个
空的.GSP
布局,只需:

<g:layoutBody/>

请参阅上的条目以获取进一步的参考。

spring cache插件也是我希望它能按预期工作的原因之一。除此之外,我必须在索引上下文中提供图书列表:(