Как Grails знает, как применить «макет» к отображаемым страницам? - PullRequest
32 голосов
/ 05 августа 2009

Я просматривал книгу «Полное руководство по Граалям» (Роше / Браун), и в главе 04 эта таинственная вещь, называемая «макет», просто появилась без объяснения причин. (И в индексе нет «макета». Насколько я знаю, он никогда не объясняется.)

Как система знает, как "наследовать" страницы из layout / main.gsp? В индексе нет ничего о «раскладках», и, похоже, он только что появился.

В их примере приложения, простого сайта магазина, сопоставления URL для / homepage говорят

  "/"(controller:"store")

и пустое закрытие "index" контроллера хранилища

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 применяется к странице, как элементы смешиваются вместе. Я просматривал книгу постранично, и эта функциональность просто «появилась» без объяснения причин.

Ответы [ 3 ]

49 голосов
/ 05 августа 2009

Тег <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. Этот конкретный файл не так уж полезен, но он ссылается на класс в проекте groovy, если вы хотите глубоко понять, как grails использует sitemesh (это, вероятно, не нужно).

14 голосов
/ 05 августа 2009

Вот ваша директива:

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

main.gsp содержит <g:layoutHead> и <g:layoutBody>, где содержимое <head> и <body> файла index.gsp складывается в макет для создания последней страницы.

6 голосов
/ 25 апреля 2014

Один из последних приемов, который, похоже, сработает, если вы назовете свой макет в соответствии с вашим контроллером, он появится (по крайней мере в 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...