Grails如何知道将"布局"应用于它呈现的页面?

32 grails layout

我一直在阅读"Grails权威指南"(Rocher/Brown)这本书,在第04章中,这个神秘的东西被称为"布局",但没有任何解释.(并且索引中没有"布局".据我所知,它从未被解释过.)

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

在他们的示例应用程序,一个简单的商店网站上,/ homepage的URL映射说

  "/"(controller:"store")
Run Code Online (Sandbox Code Playgroud)

并存储控制器的空"索引"闭包

package com.g2one.gtunes

class StoreController {

    def index = {
    }
}
Run Code Online (Sandbox Code Playgroud)

只是告诉它渲染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>
Run Code Online (Sandbox Code Playgroud)

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

我没有看到layout/main.gsp中的信息如何应用于页面,元素如何混合在一起.我一直在逐页阅读这本书,这个功能只是"出现",没有任何解释.

Llo*_*olz 49

<meta name="layout" content="main">标签包括在GSP页面的布局.

您可以查看grails-app/views/layouts/main.gsp以查看和修改布局.您可以复制main.gspmymain.gsp,修改它,然后更改GSP页面布局入门参考mymain.gsp,而不是main.gsp与自定义布局保留您能够轻松地背出你的变化进行实验.

Grails在封面下使用sitemesh(比如使用hibernate和spring)来进行视图布局.web-app/WEB-INF/sitemesh.xml项目目录中也有一个配置文件.这个特定的文件没有用,但如果你想深入了解grails如何使用sitemesh,它会引用groovy项目中的一个类(这可能不是必需的).

  • 谢谢!它正盯着我的脸.当所有其他grails指令看起来像<g:时,我没想到要查看"meta"标签. (2认同)

Joh*_*ham 14

这是你的指令:

<meta name="layout" content="main">
Run Code Online (Sandbox Code Playgroud)

main.gsp包含<g:layoutHead><g:layoutBody>,其中index.gsp的内容<head><body>内容被折叠到布局中以创建最终页面.


GSP*_*GSP 6

最近的一个技巧似乎有效,如果您将布局命名为与您的控制器相匹配,则会显示(至少在Grails 2.3.4中)以自动使用该模板.

例如,我的控制器:

// grails-app/controllers/myapp/HomeController.groovy
package myapp
class HomeController {
    def index() {
        [ myvar: "Test" ]
    }
}
Run Code Online (Sandbox Code Playgroud)

我的布局:

// grails-app/views/layouts/home.gsp
<html>
  <head></head>
  <body>
    <h1>Home</h1>
    <g:layoutBody />
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

我的看法:

// grails-app/views/home/index.gsp
<p>${ myvar }</p>
Run Code Online (Sandbox Code Playgroud)

使用家庭布局渲染.

此外,您可以在控制器中为所有操作指定布局,如下所示:

class HomeController {
    static layout = "someotherlayout"

    // actions will render using grails-app/views/layouts/someotherlayout.gsp
}
Run Code Online (Sandbox Code Playgroud)