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

Ala*_*ect 5 jsf-2

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

<ui:composition template="./template.xhtml">
Run Code Online (Sandbox Code Playgroud)

但是我现在导航到子目录中的客户端文件.由于权限级别不同,以这种方式组织它们很有用.这些子目录中的facelets将引用相同的模板,如下所示:

<ui:composition template="../template.xhtml">
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.但是在模板的标题中我像这样拉入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" />
Run Code Online (Sandbox Code Playgroud)

冗余引用的原因是我还没有找到任何其他方法来使模板从根目录或子目录的上下文中工作.除非您像这样将应用程序名称放在其中,否则以/开头的路径名不起作用

/TheApp-Ver1_0/resources/css/default.css
Run Code Online (Sandbox Code Playgroud)

这个问题是绝对路径名以变量开头,而不是常量.该变量取决于应用程序在容器中的部署方式.有没有解决这个问题的干净方法?

我做了一些搜索来找到这个问题.诚实.然而,我怀疑这是另一个 BalusC俯冲中提供了一个链接到我错过的某个地方广泛讨论的令人眼花缭乱的明显解决方案.

Bal*_*usC 14

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

<ui:composition template="/WEB-INF/inc/template.xhtml">
Run Code Online (Sandbox Code Playgroud)

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

name路径<h:outputStylesheet>,<h:outputScript>并且<h:graphicImage>总是相对于/resources根文件夹,不管你用启动它的/与否.

<h:outputStylesheet name="css/default.css" />
<h:outputScript name="js/default.js" />
<h:graphicImage name="img/logo.png" />
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因想要使用纯HTML而不是JSF组件来包含CSS/JS /图像,那么最好是#{request.contextPath}自己添加路径,这样就可以使它成为域相对URL,这样就不会需要摆弄与上下文相关的URL.另请参阅:如何获取基本URL?