Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSP中类似PHP的输出缓冲(让子模板影响主模板)_Java_Jsp_Spring Mvc_Tiles2 - Fatal编程技术网

Java JSP中类似PHP的输出缓冲(让子模板影响主模板)

Java JSP中类似PHP的输出缓冲(让子模板影响主模板),java,jsp,spring-mvc,tiles2,Java,Jsp,Spring Mvc,Tiles2,在我的网站中,我有一个主JSP模板: <html> <body> <nav>...</nav> <tiles:insertAttribute name="body" /> <footer>...</footer> </body> </html> ... ... 和多个页面模板: <p>This is content</p> 这是内容 现在我

在我的网站中,我有一个主JSP模板:

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

...
...
和多个页面模板:

<p>This is content</p>
这是内容

现在我希望页面模板能够定义一些Javascript和CSS包含,因此页面模板必须在主模板的
之前执行

在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>


您可以在平铺定义中定义一个附加属性(默认情况下为空),然后将该属性插入布局页面的head部分。这就是瓷砖的工作原理

或者您可以使用Sitemesh而不是Tiles,这符合您的建议:它使用一个过滤器缓冲响应,然后通过提取响应的一些元素并将它们放入模板来装饰响应


我想可以同时使用Sitemesh和Tiles,但这会变得有点太复杂,IMHO。

我找到了解决问题的另一种方法

我已使用以下内容扩展了主模板:

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

我有一个生成tiles定义XML文件的脚本(已经有了)。如果子模板(比如
view.jsp
)需要额外的CSS或Javascript,我将创建一个单独的文件
view\u head.jsp
,其中包含正确的包含内容,脚本将为该文件设置属性
head

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}" />
您可以抓取内容

与此同时,我已经找到了一个解决方案(见答案),它确实为头部添加了一个额外的属性。这比缓冲技巧更好,这可能有点像黑客。