我对如何在Java Server Faces项目中链接文件感到困惑,当一些文件在子文件夹中。(我将附上屏幕截图,以便您可以看到Nebeans项目视图,以及我正在尝试的示例的文件视图....但我不允许添加图像)。
我的例子项目我有文件叫"index.xhtml"one_answers"calculate/calculate.xhtml"。我还有一个名为"template.xhtml"的文件,供两者使用。问题是在模板中使用哪种url格式才能同时适用于两个文件。
在直接的html中,我只会使用以下内容来提供一个可以从任何位置返回主页的链接:
<a href="/index.html">Home</a>
但是我不能弄清楚JSF应用程序的根文件夹是什么,以及是使用"项目视图"文件夹结构还是"文件列表"文件夹结构。
首先,JSF是一个HTML代码生成器。因此,在JSF中与在"普通"HTML中没有什么不同。在HTML中创建链接时,不应该查看webapp项目中的文件系统结构。您应该查看这些资源的公共URL结构。也就是说,调用和下载这些资源的是网络浏览器,而不是网络服务器。web浏览器对web服务器中的文件系统结构一无所知。这不是JSF项目所特有的。这适用于所有web项目。
相对url与它们在webapp项目中文件系统结构中的位置无关。它们相对于当前打开的HTML文档的请求URL,即您在浏览器地址栏中看到的URL。应该注意的是,当HTML文档中出现<base>
元素时,HTML文档中所有不以/
开头的相对url都将相对于它。
给定一个webapp,配置FacesServlet
映射的URL模式为*.xhtml
,部署到localhost:8080
,上下文路径为/context
,则项目的web根目录下/index.xhtml
文件的URL如下:
http://localhost:8080/context/index.xhtml
---- -------------- ------- -----------
| | | `-- resource
| | `-- path (can be multiple folders)
| `-- domain (and port)
`-- scheme
当你目前在http://localhost:8080/context/index.xhtml
,你想创建一个链接到http://localhost:8080/context/calculate/calculate.xhtml
,那么下面所有的方式最终将指向完全相同的绝对URL。
以
//
开头的相对URL是相对于当前方案的。<a href="//localhost:8080/context/calculate/calculate.xhtml">link</a>
以
/
开头的相对URL是相对于域的。<a href="/context/calculate/calculate.xhtml">link</a>
以
/
开头的相对URL 不是是相对路径。<a href="calculate/calculate.xhtml">link</a>
当你当前在http://localhost:8080/context/calculate/calculate.xhtml
,你想链接到http://localhost:8080/context/index.xhtml
,那么同样的规则适用:
以
//
开头的相对URL是相对于当前方案的。<a href="//localhost:8080/context/index.xhtml">link</a>
以
/
开头的相对URL是相对于域的。<a href="/context/index.xhtml">link</a>
以
/
开头的相对URL 不是是相对路径。<a href="../index.xhtml">link</a>
您现在可能已经意识到,以/
开头的相对URL是而不是依赖于当前路径和域。所以,这是你真正想要在web应用程序中随处使用的URL,而不用担心在更改域名或移动服务器中的文件时出现维护问题。唯一剩下的就是上下文路径的动态性。你可能已经知道这个值在web应用程序内部是不可控制的。你应该避免硬编码它。但是,在EL的帮助下,您可以轻松地让JSF以编程方式打印它。也就是说,它只在HttpServletRequest#getContextPath()
中可用,而HttpServletRequest
在EL中作为隐式对象#{request}
可用。
<a href="#{request.contextPath}/index.xhtml">link</a>
<a href="#{request.contextPath}/calculate/calculate.xhtml">link</a>
每次重复这个只会变得乏味。幸运的是,JSF提供了<h:link>
组件,其目的就是生成具有自动内联当前上下文路径的HTML <a>
元素。
<h:link value="link" outcome="index.xhtml" />
<h:link value="link" outcome="calculate/calculate.xhtml" />
注意,outcome
必须表示JSF视图ID,它不一定与URL路径相同(当您将FacesServlet
映射到*.xhtml
上时,它将是相同的)。您甚至可以省略这里的文件扩展名,JSF将自动检测它作为"隐式导航"机制的一部分。
<h:link value="link" outcome="index" />
<h:link value="link" outcome="calculate/calculate" />
参见:
- 是否建议使用
- 你可以在Google+ html源代码中看到那些以//-开头的URL's是什么? JSF Facelets:有时我看到URL是。JSF,有时是。xhtml。为什么?
- EL中的隐式对象
- 如何在JSF中导航?如何使URL反映当前页面(而不是前一个)