Как Grails знает, что нужно применять макет к страницам, которые он отображает?

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

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

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


person Community    schedule 05.08.2009    source источник


Ответы (3)


Тег <meta name="layout" content="main"> включает макет на странице gsp.

Вы можете просмотреть grails-app/views/layouts/main.gsp, чтобы просмотреть и изменить макет. Вы можете скопировать main.gsp в mymain.gsp, изменить его, затем изменить запись макета на странице gsp, указав ссылку на mymain.gsp вместо main.gsp, и поэкспериментировать с настройкой макета, сохранив возможность легко откатить изменения.

Grails использует скрытую структуру sitemesh (как и спящий режим и Spring) для создания макетов просмотра. В каталоге проекта также есть файл конфигурации web-app/WEB-INF/sitemesh.xml. Этот конкретный файл не так полезен, но он ссылается на класс в проекте groovy, если вы хотите глубоко понять, как grails использует sitemesh (вероятно, в этом нет необходимости).

person Lloyd Meinholz    schedule 05.08.2009
comment
Спасибо! Он смотрел мне прямо в лицо. Я не думал заглядывать в метатег, когда все остальные директивы grails выглядели как ‹g:! - person ; 05.08.2009

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

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

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

person John Stoneham    schedule 05.08.2009

Один недавний трюк, который, похоже, работает: если вы присвоите своему макету имя, соответствующее вашему контроллеру, появится (по крайней мере, в 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
}
person GSP    schedule 25.04.2014
comment
Спасибо за совет! Меня это укусило, когда загруженный AJAX gsp был автоматически обернут. Был макет с названием контроллера. - person EpicVoyage; 16.05.2014