一尘不染

通过设置默认主页 在JSF项目中

tomcat

当我从Eclipse使用Tomcat 8.0启动JavaEE项目时,无法设置在浏览器中加载的默认页面。

一切正常,但是当我右键单击login.xhtmlwelcome.xhtml文件并选择“运行方式/在服务器上运行” 时,我只能看到创建的页面。

到目前为止,当我启动整个项目时,我创建的所有其他Web应用程序都加载了默认页面。默认行为是加载index.html页面(如果有的话,也可以加载index.jsp)。因此,我在项目的文件夹中添加index.htmlindex.xhtml页面WEB- INF,希望它们中至少显示一个。但是,什么也没有发生。浏览器始终仅在localhost:8080/JSFFaceletsTutorial/URL
上显示页面,但是页面是白色的,甚至没有错误消息。我认为在解决此问题的过程中一直遇到错误404,但是,我不再能够重现此错误,并且我不记得是什么原因引起的。

我发现可以更改默认的起始页面

但是,它对我也不起作用。无论是否编辑web.xml文件,都得到相同的结果。

更令人困惑的是,当我尝试更改Web浏览器时:“ Window / Web Browser / …”在外部Web浏览器中的行为与在内部Eclipse
Web浏览器中的行为有所不同。内部页面始终是空白页面-但是外部网络浏览器曾经设法显示该index.html页面-
但是它是一些过时的版本。尽管我绝对确定要编辑,保存更改,重新启动服务器……但仍然可以看到页面的过时版本。即使在这种情况下,它仍然会忽略web.xml文件中所做的更改。但是当我现在尝试时,它再次在所有浏览器中显示空白页面。除了编辑web.xml文件外,我不知道所做的任何更改。

我的猜测是问题出在我尚未完全掌握的JSF技术中。这是因为当我选择使用右键单击“运行方式/在服务器上运行”
来运行login.xhtmlwelcome.xhtml页面时,这些页面的URL上localhost:8080:带有path
/JSFFaceletsTutorial/faces/login.xhtml/JSFFaceletsTutorial/faces/welcome.xhtml。这很奇怪,因为我的项目中没有任何目录“
faces”。输入以下所有可能的排列:

<welcome-file-list>
    <welcome-file>faces/index.html</welcome-file>
    <welcome-file>faces/index.xhtm</welcome-file>
</welcome-file-list>

web.xml没有帮助。当我在此处输入完整地址时也无济于事。

这是我进入控制台的警告(我跳过了INFO日志条目):

“ 2014年12月19日上午9:39:55
org.apache.tomcat.util.digester.SetPropertiesRule开始警告:[SetPropertiesRule]
{Server / Service / Engine / Host / Context}将属性’source’设置为’org.eclipse。
jst.jee.server:JSFFaceletsTutorial’找不到匹配的属性…
…警告:JSF1074:名为’loginBean’的托管bean已被注册。用com.tutorial.LoginBean替换现有的托管bean类类型com.tutorial.LoginBean。
2014年12月19日上午9:39:57 org.apache.coyote.AbstractProtocol开始”

我不确定这是否有帮助。我现在没主意了。


阅读 363

收藏
2020-06-16

共1个答案

一尘不染

首先,<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进行了不经意的更新,而不是从头开始重写。

为了使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运行在无限循环中进行自我调用,并导致堆栈溢出。


至于这些警告,它们 无关紧要, 但意义可追溯。

2020-06-16