2013-04-09 72 views
3

由於給定的規定,以顯示來自外部源的頭,我們提出了以下設置(在Tomcat 7使用JEE6):外部facelets模板 - 是否獲取緩存?

我們的網頁使用規則模板:

... 
<ui:composition ... template="/WEB-INF/templates/template.xhtml"> 
... 

這另外模板鋪設了頁面的結構包括在它的身上另一個XHTML文件:

... 
<h:body> 
    <ui:include src="./header.xhtml" /> 
... 

然後被包含的文件再次使用的模板,但這次指向外部資源,其回報Ş包含使用標頭中的<div>元素:

... 
<ui:composition ... template="http://someserver/somefile"> 
... 

我知道,這個設置是有點奇怪,但間接以包括外部產生<div>元素,我們必須在我們的頁面,包括是必要的。 (如果有人能爲給定的問題提供更明智的解決方案,我會很高興的。)

目前爲止這樣工作正常,但它似乎是這種情況,這包括文件獲取由我們的Tomcat緩存導致在更改後不顯示當前標題。如果Tomcat重新啓動,則會顯示新的標題。

有人能給我一些見解如何這一切都在引擎蓋下工作,如果它與Facelets,Tomcat或我的具體設置?

+1

哪個JSF impl/version?哪個JSF項目階段?例如。 MyFaces通常在非開發階段積極緩存,如果你不耐煩,確實需要重新啓動。 – BalusC 2013-04-11 13:44:26

+0

@BalusC我們在版本2.1.3-b02中使用com.sun.faces.jsf-impl的依賴關係。我們沒有明確地設置javax.faces.PROJECT_STAGE,但是我們的facelets.DEVELOPMENT爲true,也許這是相關的。在那一點上緩存可以被禁用嗎?客戶的要求是,他希望儘快在應用程序中看到對標題的更改(當然,如果可能,不必重新啓動)。 – 2013-04-11 13:58:14

回答

2

在不同級別上有多種解決方案,您可以使用: 您可以實現ResourceResolver幷包含來自定義的URL(帶有定義的URL,如external-resource/header.xhtml)的模板。此ResourceResolver可能使用外部引用進行配置。

下一個可能性是要有一個ServletFilter來處理您的HTML,並將頭添加到指定位置。

最後,您可以實現一個簡單的自定義組件來使用jQuery或類似的方式在服務器端或客戶端加載標頭。

您通常不希望在facelets上禁用緩存,因爲它會降低性能。

+0

這聽起來像是一堆很好的選擇,所以即使我還沒有測試它,我會獎勵它。 – 2013-04-18 14:12:37

2

在JSF 2中(即在Facelets中),模板是靜態內容片段,其中可以包含動態內容。

如果要使用不同的模板,首先你必須指向不同的頁面,不同的URL路徑,然後在不同的頁面可以使用不同的模板:

<ui:include src="./header{$HeaderTemplateSuffix}.xhtml" /> 

然後headerABC.xml可以有:

... 
<ui:composition ... template="http://someserver/somefileABC"> 
... 

和headerDEF.xml可以

... 
<ui:composition ... template="http://someserver/somefileDEF"> 
... 

愛特納實際上,您可以放棄對標題使用模板,並動態生成所有標題內容(甚至包括靜態部分)。

注意:將html頭模板合併回主模板並不是解決此問題的方法,因爲它不能解決頭模板的核心挑戰,即動態

希望有幫助!乾杯:^)


注意:它是可以設置在web.xml如下:

<!-- Time in seconds that facelets should be checked for changes since last request. A value of -1 disables refresh checking. --> 
<context-param> 
    <param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name> 
    <param-value>0</param-value> 
</context-param> 

<!-- Set the project stage to "Development", "UnitTest", "SystemTest", or "Production". --> 
<!-- An optional parameter that makes troubleshooting errors much easier. --> 
<!-- You should remove this context parameter before deploying to production! --> 
<context-param> 
    <param-name>javax.faces.PROJECT_STAGE</param-name> 
    <param-value>Development</param-value> 
</context-param> 

然而,旨在服務於一個完全不同的目的:允許開發者改變任何動態的靜態資源和JSF容器都將動態檢查更改並在開發期間加載它。您無意使用它來模擬動態模板,並且設置上述屬性會對生產環境中的性能和安全行爲產生負面影響。

+0

感謝您的意見。你提到,我可以指向不同的外部頁面,但在我們的情況下,標題始終來自給定的URL,它爲我們提供了我們必須使用的當前標題。因此,URL總是相同的,但其內容可能隨時間而改變。你提到放棄對標題使用模板並動態地生成內容,但是如何?同樣,內容不在我們手中,它來自爲我們提供靜態html div塊的外部源。 – 2013-04-18 06:33:44

+0

這可能會起作用。只要您爲每種情況都包含不同的包含文件headerXXX.html,您*可能*能夠指向相同的模板URL(template =「http:// someserver/somefile」),但您必須確保它返回不同的在每種情況下適當的標題模板。我不確定如何在總是重複使用相同的URL的情況下實現適當的模板?如果仍然存在問題,只需要在服務器上引入額外的頭文件模板URL - 如果需要,可以通過web.xml將它們映射到相同的資源(servlet/JSP)。 – 2013-04-19 01:17:30

+0

也許我還沒有把自己弄清楚 - 在我們的應用程序中,只有一個頭文件模板,它永遠不會改變,所有頁面使用相同的頭文件XHTML,而不是其他東西。但是,指向外部URL的此標頭的**內容**可能會更改。因此,一些CMS人員可能會決定將標題設爲綠色而不是白色,並且它應該只出現在我們的應用程序中,因爲我們所做的只是包括一個外部HTML DIV,在這裏我們什麼都不知道,只顯示標題應該出現的位置在我們的頁面。 – 2013-04-19 07:34:37