我一直在阅读“Grails权威指南”(Rocher / Brown)这本书,在第04章中,这个被称为“布局”的神秘事物刚刚出现,没有任何解释。 (并且索引中没有“布局”。据我所知,它从未解释过。)
系统如何知道“继承”layout / main.gsp中的页面?索引中没有关于“布局”的内容,它似乎刚刚出现。
在他们的示例应用中,一个简单的商店网站,/ homepage的URL映射说
"/"(controller:"store")
并存储控制器的空“索引”闭包
package com.g2one.gtunes
class StoreController {
def index = {
}
}
简单地告诉它渲染store / index.gsp
store / index.gsp只有几行HTML;任何指令都不包含任何布局
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<meta name="layout" content="main">
<title>gTunes Store</title>
<g:javascript library="prototype"></g:javascript>
</head>
<body id="body">
<h1>Your online music store and storage service!</h1>
<p>Manage your own library, browse music and purchase new tracks as they become available</p>
</body>
</html>
当我运行示例时,显示为“/”的页面不仅仅是这个简单的HTML,而是“layouts / main.gsp”的内容,这些信息被神奇地插入其中。
我没有看到layout / main.gsp中的信息如何应用于页面,元素如何混合在一起。我一直在逐页阅读这本书,这个功能只是“出现”,没有任何解释。
答案 0 :(得分:49)
<meta name="layout" content="main">
标记包含gsp页面中的布局。
您可以查看grails-app/views/layouts/main.gsp
以查看和修改布局。您可以将main.gsp
复制到mymain.gsp
,修改它,然后在gsp页面中更改布局条目以引用mymain.gsp
而不是main.gsp
,并尝试自定义您的布局,保留您的轻松退出您的更改。
Grails在封面下使用sitemesh(比如使用hibernate和spring)来进行视图布局。项目目录中还有一个web-app/WEB-INF/sitemesh.xml
配置文件。这个特殊的文件没有用,但是如果你想深入了解grails如何使用sitemesh,它会引用groovy项目中的一个类(这可能不是必需的)。
答案 1 :(得分:14)
这是你的指令:
<meta name="layout" content="main">
main.gsp包含<g:layoutHead>
和<g:layoutBody>
,其中index.gsp的<head>
和<body>
内容会折叠到布局中以创建最终页面。< / p>
答案 2 :(得分:6)
最近的一个技巧似乎有效,如果您将布局命名为与您的控制器相匹配,则会显示(至少在Grails 2.3.4中)以自动使用该模板。
例如,我的控制器:
// grails-app/controllers/myapp/HomeController.groovy
package myapp
class HomeController {
def index() {
[ myvar: "Test" ]
}
}
我的布局:
// grails-app/views/layouts/home.gsp
<html>
<head></head>
<body>
<h1>Home</h1>
<g:layoutBody />
</body>
</html>
我的观点:
// grails-app/views/home/index.gsp
<p>${ myvar }</p>
使用家庭布局渲染。
此外,您可以在控制器中为所有操作指定布局,如下所示:
class HomeController {
static layout = "someotherlayout"
// actions will render using grails-app/views/layouts/someotherlayout.gsp
}