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.
以...开头的相对URL //
是相对于当前方案的.
<a href="//localhost:8080/context/calculate/calculate.xhtml">link</a>
Run Code Online (Sandbox Code Playgroud)以...开头的相对URL /
是相对于域的.
<a href="/context/calculate/calculate.xhtml">link</a>
Run Code Online (Sandbox Code Playgroud)不/
以该开头的相对URL 是相对于路径的.
<a href="calculate/calculate.xhtml">link</a>
Run Code Online (Sandbox Code Playgroud)当您目前在
http://localhost:8080/context/calculate/calculate.xhtml
,并且想要链接到时http://localhost:8080/context/index.xhtml
,则适用相同的规则:
以...开头的相对URL //
是相对于当前方案的.
<a href="//localhost:8080/context/index.xhtml">link</a>
Run Code Online (Sandbox Code Playgroud)以...开头的相对URL /
是相对于域的.
<a href="/context/index.xhtml">link</a>
Run Code Online (Sandbox Code Playgroud)不/
以该开头的相对URL 是相对于路径的.
<a href="../index.xhtml">link</a>
Run Code Online (Sandbox Code Playgroud)正如你可能已经意识到,从一个相对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 次 |
最近记录: |