3 回答
TA贡献1735条经验 获得超5个赞
首先,<welcome-file>并不代表“默认主页”的路径。它代表包含您希望担任了作为默认的文件时,文件夹中的物理文件的文件名的文件夹一样/,/foo/,/foo/bar/,请求等。
因此,在JSF 2.x风格中,基本上是:
<welcome-file-list>
<welcome-file>index.xhtml</welcome-file>
</welcome-file-list>
这样,如果最终用户请求/并且您有/index.xhtml,则将为您提供服务。或者,如果最终用户请求,/foo并且您有/foo/index.xhtml,则将为它提供服务,等等。如果没有这样的文件,则将返回404错误。
现在,你似乎映射了FacesServlet一个前缀<url-pattern>的/faces/*。这是JSF 1.0 / 1.1时代以来的遗留物,实际上最近不建议这样做。也许您正在阅读针对JSF 1.x的过时教程,或者本来是为JSF 1.x编写的,维护不佳的教程,但随后针对JSF 2.x进行了不当更新,而不是从头开始重写。
该教程似乎也没有向您解释一些servlet基础知识。即,为了使XHTML页面中的JSF组件运行并生成一些HTML输出,FacesServlet必须在请求XHTML页面时调用。当您像这样请求XHTML页面时/index.xhtml,当FacesServlet映射到时/faces/*,它将不会被调用。然后,浏览器将检索原始的未解析的JSF源代码,而不是生成的HTML输出。您可以通过右键单击Web 浏览器中的查看源代码来查看它。您应该这样请求页面,/faces/index.xhtml以便FacesServlet可以运行并产生浏览器可以理解并呈现的HTML输出。
这与欢迎文件一起使用效果不佳。这完全解释了为什么当index.xhtml用作欢迎文件时会得到一个“干净的白色”(空白)页面的原因(某些劣等的Web浏览器,例如IE,由于包含原始XHTML源代码的响应中缺少/错误的内容类型,会令人困惑地提示下载对话框)。该FacesServlet是根本就没有被调用。只需摆脱老式的/faces/*URL模式,而改用JSF 2.x *.xhtml模式的URL模式即可。
<servlet-mapping>
<servlet-name>facesServlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
通过这种方式,欢迎文件应该可以工作,您可以通过直接请求JSF的物理URL来打开JSF页面,而不会浪费虚拟URL。在JSF 1.x中这是不可能的,因为它将使FacesServlet运行在无限循环中进行自我调用,并导致堆栈溢出。
- 3 回答
- 0 关注
- 990 浏览
添加回答
举报