PHP-подобная выходная буферизация в JSP (позволяющая субтемблатам влиять на главный шаблон) - PullRequest
1 голос
/ 03 февраля 2012

На моем сайте есть шаблон JSP мастера:

<html>
 <body>
  <nav>...</nav>
  <tiles:insertAttribute name="body" />
  <footer>...</footer>
 </body>
</html>

И несколько шаблонов страниц:

<p>This is content</p>

Теперь я бы хотел, чтобы шаблоны страниц могли определять некоторые Javascript и CSS, поэтому шаблоны страниц должны быть выполнены до <head> основного шаблона.

В PHP я мог бы использовать для этого буферизацию вывода:

<? ob_start()
   include $slave;
   $body = ob_get_clean(); ?>
<html>
 <head>
 <? foreach($javascripts as $script) ?>
     <script src="<?=$script?>" />
 <? endforeach ?>
 <body>
  <nav>...</nav>
  <?=$body?>
  <footer>...</footer>
 </body>
</html>

Существует ли аналогичная технология в JSP? Или другой способ добиться того, что мне нужно? Я использую его в Spring MVC 3 + Apache Tiles

Ответы [ 3 ]

1 голос
/ 09 ноября 2013

1) Включить основной taglib

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

2) Захват и печать содержимого

<c:set var="content">You grab content</c:set>
<c:out value="${content}" />
1 голос
/ 03 февраля 2012

Вы можете просто определить дополнительный атрибут (по умолчанию пустой) в своем определении плиток и вставить этот атрибут в раздел заголовка страницы макета.Вот как Tiles должен работать.

Или вы можете использовать Sitemesh вместо Tiles, который делает то, что вы предлагаете: он использует фильтр, который буферизует ответ, а затем декорирует ответ, извлекая некоторые его элементы и помещая их в шаблон.

Полагаю, можно было бы использовать Sitemesh и Tiles вместе, но это было бы слишком сложно, ИМХО.

0 голосов
/ 03 февраля 2012

Я нашел другое решение для моей проблемы.

Я расширил свой мастер-шаблон:

<head>
<tiles:insertAttribute name="head" defaultValue="" />
</head>

У меня есть скрипт, который генерирует XML-файл определения тайлов (уже был). Если для подшаблона (скажем, view.jsp) требуется дополнительный CSS или Javascript, я создам отдельный файл view_head.jsp, содержащий правильные включения, и сценарий установит для этого файла атрибут head.

...