1

在我的网站中,我有一个主 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 中使用它

4

3 回答 3

1

1) 启用核心标签库

<%@ 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}" />
于 2013-11-09T16:58:10.383 回答
1

您可以在图块定义中定义一个附加属性(默认为空白),然后将此属性插入到布局页面的 head 部分。这就是 Tiles 应该如何工作的。

或者您可以使用 Sitemesh 而不是 Tiles,它会按照您的建议进行操作:它使用一个过滤器来缓冲响应,然后通过提取其一些元素并将它们放入模板来装饰响应。

我想可以同时使用 Sitemesh 和 Tiles,但恕我直言,它会变得有点过于复杂。

于 2012-02-02T22:47:37.907 回答
0

我为我的问题找到了另一种解决方案。

我已经扩展了我的主模板:

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

我有一个脚本可以生成瓷砖定义 XML 文件(已经有了)。如果子模板(例如view.jsp)需要额外的 CSS 或 Javascript,我将创建一个view_head.jsp包含正确包含的单独文件,并且脚本会将属性设置head为该文件。

于 2012-02-02T22:47:55.693 回答