2011-09-11 120 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