Grails如何知道应用;“布局”;要显示它所呈现的页面吗?

Grails如何知道应用;“布局”;要显示它所呈现的页面吗?,grails,layout,Grails,Layout,我一直在阅读《圣杯权威指南》(Rocher/Brown)一书,在第04章中,这个被称为“布局”的神秘东西没有解释就出现了。(而且索引中没有“布局”。据我所知,它从未被解释过。) 系统如何知道从layout/main.gsp“继承”页面?索引中没有关于“布局”的内容,它似乎刚刚出现 在他们的示例应用程序(一个简单的商店网站)中,/主页的URL映射显示 "/"(controller:"store") 和存储控制器的空“索引”闭包 只告诉它呈现store/index.gsp store/inde

我一直在阅读《圣杯权威指南》(Rocher/Brown)一书,在第04章中,这个被称为“布局”的神秘东西没有解释就出现了。(而且索引中没有“布局”。据我所知,它从未被解释过。)

系统如何知道从layout/main.gsp“继承”页面?索引中没有关于“布局”的内容,它似乎刚刚出现

在他们的示例应用程序(一个简单的商店网站)中,/主页的URL映射显示

  "/"(controller:"store")
和存储控制器的空“索引”闭包

只告诉它呈现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>

gTunes商店
您的在线音乐商店和存储服务!
管理您自己的音乐库,浏览音乐并购买新曲目

当我运行示例时,为“/”显示的页面不仅仅是这个简单的HTML,而是“layouts/main.gsp”的内容,其中神奇地插入了这些信息

我看不出layout/main.gsp中的信息是如何应用于页面的,元素是如何混合在一起的。我已经一页一页地阅读了这本书,而这个功能只是“出现”了,没有任何解释。

这是您的指示:

<meta name="layout" content="main">

main.gsp包含
,其中index.gsp的
内容被折叠到布局中以创建最终页面。

标签包括gsp页面中的布局

您可以查看
grails应用程序/views/layouts/main.gsp
来查看和修改布局。您可以将
main.gsp
复制到
mymain.gsp
,对其进行修改,然后将gsp页面中的布局条目更改为引用
mymain.gsp
,而不是
main.gsp
,并尝试自定义布局,以保持轻松收回更改的能力


Grails在封面下使用sitemesh(就像它使用hibernate和spring)进行视图布局。在项目目录中还有一个
webapp/web-INF/sitemesh.xml
配置文件。这个特定的文件没有多大帮助,但是如果您想深入了解grails是如何使用sitemesh的,它引用了groovy项目中的一个类(这可能不是必需的)。

最近的一个技巧似乎有效,如果您将布局命名为与控制器匹配的话(至少在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指令看起来都像是感谢提示时,我没有想到要查看“meta”标记!当AJAX加载的gsp被自动包装时,我就被这一点咬了一口。有一个控制器名为的布局。
// 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
}