用于链接/导航到其他JSF页面的URL

时间:2015-06-06 13:45:11

标签: jsf url jsf-2 hyperlink navigation

当一些文件在子文件夹中时,我对如何在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应用程序的根文件夹,以及是否使用"项目视图"文件夹结构或"文件列表"文件夹结构。

1 个答案:

答案 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

另见: