2012-02-02 42 views
1

在我的網站我有一個主JSP模板:PHP樣輸出緩衝(讓子模板影響主模板)

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

和多頁模板:

<p>This is content</p> 

現在的我d像頁面模板一樣能夠定義一些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中使用它

回答

1

您可以在tile定義中定義一個額外的屬性(默認情況下爲空白),並將該屬性插入佈局頁面的head部分。這就是Tiles應該如何工作的原因。

或者你可以使用Sitemesh而不是Tiles,它可以實現你的建議:它使用緩衝響應的過濾器,然後通過提取一些元素並將其放入模板來修飾響應。

我想可以一起使用Sitemesh和瓷磚,但它會變得有點太複雜,恕我直言。

+0

在我已經找到了解決方案(見答案)的同時,它的的確增加了一個額外的屬性頭。這比緩衝技巧更好,這將會是一個黑客攻擊。 – 2012-02-02 22:55:02

0

我發現我的問題的另一個解決方案。

我伸出我的主模板有:

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

我產生瓷磚定義的XML文件的腳本(已有)。如果子模板(如view.jsp)需要額外的CSS或Javascript,我將創建一個單獨的文件view_head.jsp,其中包含正確的包含,並且該腳本將設置屬性head爲該文件。

1

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}" />