我的模板中的绝对路径名来获取资源

时间:2011-09-11 03:21:16

标签: jsf-2

在我的JSF 2.0 Facelets应用程序中,我有一个光荣的模板,我希望所有页面都能使用。它位于web-app的根目录中,伪装成名称template.xhtml。所以它按照你的预期引用:

<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猛扑一个提供了一个链接到我错过的某个地方广泛讨论的令人眼花缭乱的明显解决方案。

1 个答案:

答案 0 :(得分:14)

template中的<ui:composition>路径是相对于webapp自己的文件夹结构,而不是域根(因为它不代表URL!)。因此,如果您使用/启动它,它只是相对于上下文根解析。

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

(放入/WEB-INF的优点是最终用户无法通过猜测网址直接打开它)

name<h:outputStylesheet><h:outputScript>的{​​{1}}路径始终相对于<h:graphicImage>根文件夹,无论您是否以{{1}启动它或者没有。

/resources

如果由于某种原因想要使用纯HTML而不是JSF组件来包含CSS / JS /图像,那么最好是自己在/之前添加路径,这样就可以使它成为域相关URL,这样您就不需要使用上下文相关的URL。另见:How get the base URL?