当一些文件在子文件夹中时,我对如何在Java Server Faces项目中的文件之间进行链接感到困惑。 (我将附上截图,以便您可以看到Nebeans项目视图,以及我正在尝试的示例的文件视图......但我还不允许添加图像)。
我的示例项目我有名为" index.xhtml"和"计算/计算xhtml"。我还有一个名为" template.xhtml"这两者都使用了。问题是在模板中使用的url格式将适用于这两个文件。
在直接的html中,我会使用类似下面的内容来提供一个返回主页的链接,该链接可以在任何位置使用:
// Mangled as "o_u03ba" using Intel's compiler "icc").
extern int o\u03ba(void);
但我无法弄清楚什么算作JSF应用程序的根文件夹,以及是否使用"项目视图"文件夹结构或"文件列表"文件夹结构。
答案 0 :(得分:21)
首先,JSF是一个HTML代码生成器。所以它在JSF中与在“普通”HTML中没有区别。在HTML中创建链接时,您不应该查看webapp项目中的文件系统结构。您应该查看这些资源的公共URL结构。这就是webbrowser必须调用和下载这些资源,而不是网络服务器。 webbrowser对Web服务器中的文件系统结构一无所知。这不是JSF项目特有的。这适用于所有Web项目。
相对URL与webapp项目中文件系统结构中的位置无关。它们与当前打开的HTML文档的请求URL相关,正是您在浏览器地址栏中看到的URL。值得注意的是,当HTML文档中存在<base>
元素时,HTML文档中不以/
开头的所有相对URL都将成为相对的。
给定一个配置了FacesServlet
映射网址模式为*.xhtml
的网络应用,并部署到localhost:8080
且上下文路径为/context
的网址,其中包含{项目的Web根目录中的{1}}文件如下:
/index.xhtml
如果您当前在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
开头的相对网址是相对于当前方案的。
//
以<a href="//localhost:8080/context/calculate/calculate.xhtml">link</a>
开头的相对网址是相对于域的。
/
以<a href="/context/calculate/calculate.xhtml">link</a>
开头的相对网址不与路径相关。
/
当你现在在
<a href="calculate/calculate.xhtml">link</a>
,您想要链接到http://localhost:8080/context/calculate/calculate.xhtml
,然后适用相同的规则:
以http://localhost:8080/context/index.xhtml
开头的相对网址是相对于当前方案的。
//
以<a href="//localhost:8080/context/index.xhtml">link</a>
开头的相对网址是相对于域的。
/
以<a href="/context/index.xhtml">link</a>
开头的相对网址不与路径相关。
/
正如您现在可能已经意识到的那样,以<a href="../index.xhtml">link</a>
开头的相对网址不依赖于当前路径和域。因此,这是您真正想要在Web应用程序中使用的URL,而不必担心在更改域或在服务器中移动文件时的维护问题。唯一剩下的就是上下文路径的动态性。您可能已经知道这个值不能从webapp内部控制。你真的想避免硬编码。但是,您可以轻松地让JSF在EL的帮助下以编程方式打印它。它仅由HttpServletRequest#getContextPath()
提供,而/
在EL中可用作隐式对象HttpServletRequest
。
#{request}
每次重复这个都很繁琐。幸运的是,JSF提供了<h:link>
组件,其目的是生成HTML <a href="#{request.contextPath}/index.xhtml">link</a>
<a href="#{request.contextPath}/calculate/calculate.xhtml">link</a>
元素,并自动内联当前上下文路径。
<a>
请注意,<h:link value="link" outcome="index.xhtml" />
<h:link value="link" outcome="calculate/calculate.xhtml" />
必须代表JSF视图ID,该ID不一定与网址路径相同(在outcome
上映射FacesServlet
时)。你甚至可以在这里省略文件扩展名,JSF会自动将其作为“隐式导航”机制的一部分进行检测。
*.xhtml