什么 URL 用于 link / 导航到其他 JSF 页面
What URL to use to link / navigate to other JSF pages
当某些文件位于子文件夹中时,我对如何 link 在 Java Server Faces 项目中的文件之间进行操作感到困惑。 (我打算附上屏幕截图,以便您可以看到我正在尝试的示例的 Nebeans 项目视图和文件视图……但我还不允许添加图像)。
在我的示例项目中,我有名为 "index.xhtml" 和 "calculate/calculate.xhtml" 的文件。我还有一个名为 "template.xhtml" 的文件,两者都使用。问题是在适用于这两个文件的模板中使用什么 url 格式。
直接 html 我会使用类似下面的东西来提供一个 link 回到主页,可以在任何位置工作:
<a href="/index.html">Home</a>
但我无法弄清楚什么是 JSF 应用程序的根文件夹,以及是使用 "project view" 文件夹结构还是 "files list" 文件夹结构。
首先,JSF 是一个 HTML 代码生成器。所以它在 JSF 中与在 "plain" HTML 中没有什么不同。在 HTML 中创建 link 时,您不应该查看 webapp 项目中的文件系统结构。您应该查看这些资源的 public URL 结构。即必须调用和下载这些资源的网络浏览器,而不是网络服务器。网络浏览器对网络服务器中的文件系统结构一无所知。这不是特定于 JSF 项目的。这适用于所有网络项目。
相对 URL 与它们在 webapp 项目的文件系统结构中的位置无关。它们与当前打开的 HTML 文档的请求 URL 相关,正是您在浏览器地址栏中看到的那个。应该注意的是,当 HTML 文档中存在 <base>
元素时,HTML 文档中所有不以 /
开头的相关 URL 将变为相对于它。
给定一个配置了 FacesServlet
映射 URL 模式 *.xhtml
的 Web 应用程序,并部署到 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
,并且你想创建一个link到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
,而你想link到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 不 依赖于当前路径和域。所以,这就是 URL 您真正想要在 Web 应用程序中随处使用的东西,而不必担心在更改域或在服务器中移动文件时出现维护问题。唯一剩下的就是上下文路径的动态性。您可能已经知道此值无法从 webapp 内部控制。您真的很想避免对其进行硬编码。但是,在 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 会自动将其检测为 "implicit navigation" 机制的一部分。
<h:link value="link" outcome="index" />
<h:link value="link" outcome="calculate/calculate" />
另请参阅:
- Is it recommended to use the <base> html tag?
- What are those URL's that are starting with // - that you can see within Google+ html source?
- JSF Facelets: Sometimes I see the URL is .jsf and sometimes .xhtml. Why?
- Implicit objects in EL
- How to navigate in JSF? How to make URL reflect current page (and not previous one)
当某些文件位于子文件夹中时,我对如何 link 在 Java Server Faces 项目中的文件之间进行操作感到困惑。 (我打算附上屏幕截图,以便您可以看到我正在尝试的示例的 Nebeans 项目视图和文件视图……但我还不允许添加图像)。
在我的示例项目中,我有名为 "index.xhtml" 和 "calculate/calculate.xhtml" 的文件。我还有一个名为 "template.xhtml" 的文件,两者都使用。问题是在适用于这两个文件的模板中使用什么 url 格式。
直接 html 我会使用类似下面的东西来提供一个 link 回到主页,可以在任何位置工作:
<a href="/index.html">Home</a>
但我无法弄清楚什么是 JSF 应用程序的根文件夹,以及是使用 "project view" 文件夹结构还是 "files list" 文件夹结构。
首先,JSF 是一个 HTML 代码生成器。所以它在 JSF 中与在 "plain" HTML 中没有什么不同。在 HTML 中创建 link 时,您不应该查看 webapp 项目中的文件系统结构。您应该查看这些资源的 public URL 结构。即必须调用和下载这些资源的网络浏览器,而不是网络服务器。网络浏览器对网络服务器中的文件系统结构一无所知。这不是特定于 JSF 项目的。这适用于所有网络项目。
相对 URL 与它们在 webapp 项目的文件系统结构中的位置无关。它们与当前打开的 HTML 文档的请求 URL 相关,正是您在浏览器地址栏中看到的那个。应该注意的是,当 HTML 文档中存在 <base>
元素时,HTML 文档中所有不以 /
开头的相关 URL 将变为相对于它。
给定一个配置了 FacesServlet
映射 URL 模式 *.xhtml
的 Web 应用程序,并部署到 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
,并且你想创建一个link到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
,而你想link到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 不 依赖于当前路径和域。所以,这就是 URL 您真正想要在 Web 应用程序中随处使用的东西,而不必担心在更改域或在服务器中移动文件时出现维护问题。唯一剩下的就是上下文路径的动态性。您可能已经知道此值无法从 webapp 内部控制。您真的很想避免对其进行硬编码。但是,在 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 会自动将其检测为 "implicit navigation" 机制的一部分。
<h:link value="link" outcome="index" />
<h:link value="link" outcome="calculate/calculate" />
另请参阅:
- Is it recommended to use the <base> html tag?
- What are those URL's that are starting with // - that you can see within Google+ html source?
- JSF Facelets: Sometimes I see the URL is .jsf and sometimes .xhtml. Why?
- Implicit objects in EL
- How to navigate in JSF? How to make URL reflect current page (and not previous one)