2011-09-11 163 views
5

在我的JSF 2.0 Facelets應用程序中,我有一個光榮的模板,我希望所有頁面都可以使用。它位於名爲template.xhtml的Web應用的根目錄中。所以它被引用,因爲你會期望:我的模板中獲取資源的絕對路徑名

<ui:composition template="./template.xhtml"> 

但我現在導航,然後到子目錄中的客戶端文件。由於權限級別不同,以這種方式組織它們非常有用。這些子目錄中的facelets可能會引用相同的模板,如下所示:

<ui:composition template="../template.xhtml"> 

到目前爲止這樣好。然而,在模板的頭我拉在CSS這樣的:

<link href="./resources/css/default.css" rel="stylesheet" type="text/css" /> 
<link href="./resources/css/tableLayout.css" rel="stylesheet" type="text/css" /> 
<link href="../resources/css/default.css" rel="stylesheet" type="text/css" /> 
<link href="../resources/css/tableLayout.css" rel="stylesheet" type="text/css" /> 

的原因冗餘參考的是,我還沒有發現任何其他方式來獲得模板從根的環境中工作目錄或子目錄。以/開頭的路徑,除非你把應用程序的名稱在像這樣

/TheApp-Ver1_0/resources/css/default.css 

的問題,這不工作是絕對路徑有一個變量,而不是常量開始。該變量取決於應用程序在容器中的部署方式。有沒有解決這個問題的乾淨方法?

我做了一些搜索找到這個問題。誠實。然而我懷疑這是另一個其中BalusC在其中一個提供了一個鏈接到一個盲點明顯的解決方案廣泛討論我錯過了某處。

回答

14

<ui:composition>中的template路徑與Web應用程序自己的文件夾結構有關,而與域根無關(因爲它不代表URL!)。所以如果你用/開始它,它只是相對於上下文根來解決。

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

(投入/WEB-INF具有終端用戶無法通過猜測URL直接打開它的優點)

<h:outputStylesheet><h:outputScript><h:graphicImage>name路徑總是相對於/resources根文件夾,而不管如果你用/開始它。

<h:outputStylesheet name="css/default.css" /> 
<h:outputScript name="js/default.js" /> 
<h:graphicImage name="img/logo.png" /> 

如果你想使用純HTML代替JSF組件,包括出於某種原因CSS/JS /圖像的話,最好是#{request.contextPath}自己預先設置的路徑,這樣就可以使它成爲一個相對域URL,這樣你就不需要擺弄上下文相關的URL。另見:How get the base URL?

+0

你又做了一次。我注意到這些標籤尚未包含在這裏提到的一些在線參考中:http://stackoverflow.com/questions/539041/whats-the-best-online-reference-for-jsf-tags – AlanObject

+1

很多人都有JSF 2.x(2009年下半年推出)發生了變化。您提到的鏈接是從2009年2月開始的,僅提及JSF 1.x文檔。對於所有JSF 2.x標記,請查看JSF 2.x文檔:http://download.oracle.com/javaee/6/javaserverfaces/2.1/docs/vdldocs/facelets/當您使用JSF 2.x時,確保您正在閱讀JSF 2.x針對性教程/書籍/文檔/答案。 – BalusC

+0

因此,沒有任何機會引用不在資源文件夾中的css或js文件?既沒有可能從瀏覽器中獲取js/css資源,例如myhost/resources/partials/my.css? – ses