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

Ant*_*ers 7 navigation url jsf hyperlink jsf-2

当一些文件在子文件夹中时,我对如何在Java Server Faces项目中的文件之间进行链接感到困惑.(我打算附上截图,以便您可以看到Nebeans项目视图,以及我正在尝试的示例的文件视图......但我还不允许添加图像).

我的示例项目我有"index.xhtml"和"calculate/calculate.xhtml"文件.我还有一个名为"template.xhtml"的文件,两者都使用.问题是在模板中使用哪种url格式将适用于这两个文件.

在直接的HTML中我会使用类似下面的内容来提供一个返回主页的链接,该链接可以在任何位置工作:

<a href="/index.html">Home</a>
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚什么算作JSF应用程序的根文件夹,以及是否使用"项目视图"文件夹结构或"文件列表"文件夹结构.

Bal*_*usC 22

首先,JSF是一个HTML代码生成器.所以它在JSF中与在"普通"HTML中没有区别.在HTML中创建链接时,您不应该查看webapp项目中的文件系统结构.您应该查看这些资源的公共URL结构.这就是webbrowser必须调用和下载这些资源,而不是网络服务器.webbrowser对Web服务器中的文件系统结构一无所知.这不是JSF项目特有的.这适用于所有Web项目.

相对URL与webapp项目中文件系统结构中的位置无关.它们与当前打开的HTML文档的请求URL相关,正是您在浏览器地址栏中看到的URL.值得注意的是,当<base>HTML文档中存在元素时,HTML文档中不/以其开头的所有相对URL 将变为相对于它.

给定一个配置了FacesServlet映射URL模式的webapp *.xhtml,并localhost:8080使用上下文路径部署到的webapp,项目的web根目录/context中的/index.xhtml文件的URL 将如下所示:

http://localhost:8080/context/index.xhtml
----   -------------- ------- -----------
  |           |          |         `-- resource
  |           |          `-- path (can be multiple folders)
  |           `-- domain (and port)
  `-- scheme
Run Code Online (Sandbox Code Playgroud)

如果您当前在http://localhost:8080/context/index.xhtml,并且想要创建链接http://localhost:8080/context/calculate/calculate.xhtml,那么下面的所有方法最终将指向完全相同的绝对URL.

当您目前在 http://localhost:8080/context/calculate/calculate.xhtml,并且想要链接到时http://localhost:8080/context/index.xhtml,则适用相同的规则:

正如你可能已经意识到,从一个相对URL /依赖于从目前的路径和域.因此,这是您真正想要在Web应用程序中使用的URL,而不必担心在更改域或在服务器中移动文件时的维护问题.唯一剩下的就是上下文路径的动态性.您可能已经知道这个值不能从webapp内部控制.你真的想避免硬编码.但是,您可以轻松地让JSF在EL的帮助下以编程方式打印它.它只是可用的,HttpServletRequest#getContextPath()并且HttpServletRequest在EL中可用作隐式对象#{request}.

<a href="#{request.contextPath}/index.xhtml">link</a>
<a href="#{request.contextPath}/calculate/calculate.xhtml">link</a>
Run Code Online (Sandbox Code Playgroud)

每次重复这个都很繁琐.幸运的是,JSF提供了<h:link>用于生成HTML <a>元素的组件,其中当前上下文路径自动内联.

<h:link value="link" outcome="index.xhtml" />
<h:link value="link" outcome="calculate/calculate.xhtml" />
Run Code Online (Sandbox Code Playgroud)

需要注意的是,outcome必须代表一个JSF视图ID,这是不一定相同的URL路径(这将是当你地图FacesServlet*.xhtml).你甚至可以在这里省略文件扩展名,JSF会自动将其作为"隐式导航"机制的一部分进行检测.

<h:link value="link" outcome="index" />
<h:link value="link" outcome="calculate/calculate" />
Run Code Online (Sandbox Code Playgroud)

也可以看看:


归档时间:

查看次数:

13221 次

最近记录:

9 年,5 月 前