我有一个.xhtml页面列表,我保存在/ src / main / webapp / pages /文件夹中。 现在我想创建它们的超链接。目前唯一有效的是默认主页:/src/main/webapp/pages/default.xhtml。
<!-- Welcome page -->
<welcome-file-list>
<welcome-file>/pages/default.xhtml</welcome-file>
</welcome-file-list>
<!-- JSF mapping -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map these files with JSF -->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
对于其他人,如果我有如下链接:
<a href="/pages/page1.xhtml">Page 1</a>
我收到以下错误:
找不到/page1.xhtml ExternalContext作为资源
我的问题是:如何在相对于webapp root 的href 中指定我想要的页面。
答案 0 :(得分:9)
您需要了解相关链接的两个主要内容(即不以http://开头的内容):
/
开头的相对链接是相对于域根目录的。如果当前网址为http://example.com/app且网页包含链接
<a href="/pages/page1.xhtml">
然后它将指向http://example.com/pages/page1.xhtml(失败)。
如果当前网址为http://example.com/app且网页包含链接
<a href="pages/page1.xhtml">
然后它会指向http://example.com/app/pages/page1.xhtml(有效)。
如果当前网址为http://example.com/app/pages/default.xhtml且网页包含链接
<a href="pages/page1.xhtml">
然后它将指向http://example.com/app/pages/pages/page1.xhtml(失败)。
您的问题是欢迎页面是通过转发而不是重定向打开的。这样,浏览器地址栏中的请求URL保持在http://example.com/app,而实际显示的内容为http://example.com/app/pages/default.xhtml。要使链接在所有情况下都能正常工作,您需要一个类似
的链接<a href="/app/pages/page1.xhtml">
因此,包括上下文路径,即webapp根目录。如果你唯一的问题是想要动态地包含上下文路径,那么只需打印HttpServletRequest#getContextPath()
<a href="#{request.contextPath}/pages/page1.xhtml">