grailsg:包括它可以做到吗?
我想知道是否可以使用g:include只包含给定页面的正文内容 假设我有一个主布局页面,如下所示:grailsg:包括它可以做到吗?,grails,grails-controller,Grails,Grails Controller,我想知道是否可以使用g:include只包含给定页面的正文内容 假设我有一个主布局页面,如下所示: <html> <head> <title>My start page</title> <g:layoutHead> </head> <body> <g:layoutBody> </body> </html> 我的起始页 然后是一个主页
<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插件也是我希望它能按预期工作的原因之一。除此之外,我必须在索引上下文中提供图书列表:(