使用什么URL来链接/导航到其他JSF页面



我对如何在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" />

参见:

  • 是否建议使用
  • html标签吗?
  • 你可以在Google+ html源代码中看到那些以//-开头的URL's是什么?
  • JSF Facelets:有时我看到URL是。JSF,有时是。xhtml。为什么?
  • EL中的隐式对象
  • 如何在JSF中导航?如何使URL反映当前页面(而不是前一个)

相关内容

  • 没有找到相关文章

最新更新