11

当我使用 Eclipse 中的 Tomcat 8.0 启动 Java EE 项目时,我无法设置在浏览器中加载的默认页面。我正在尝试学习 JSF,所以我遵循了本教程

login.xhtml一切正常,但是当我右键单击或welcome.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.xhtml和页面时,这些页面的 URL使用路径和. 这很奇怪,因为我的项目中没有任何目录“面孔”。键入以下所有可能的排列:welcome.xhtmllocalhost:8080:/JSFFaceletsTutorial/faces/login.xhtml/JSFFaceletsTutorial/faces/welcome.xhtml

<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 开始"

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

4

3 回答 3

15

首先,<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 输出。您可以通过右键单击在 webbrowser 中查看源代码来查看它。您应该像这样请求页面,/faces/index.xhtml以便FacesServlet可以运行并生成浏览器可以理解和呈现的 HTML 输出。

这只与欢迎文件不符。这完全解释了为什么在index.xhtml用作欢迎文件时会得到一个“干净的白色”(空白)页面(一些劣质的网络浏览器,如 IE,由于包含原始 XHTML 源代码的响应中缺少/错误的内容类型,会混淆地提示下载对话框)。FacesServlet根本没有被调用。只需摆脱老式的/faces/*URL 模式并改用 JSF 2.x 的*.xhtmlURL 模式。

<servlet-mapping>
    <servlet-name>facesServlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

这样欢迎文件应该可以工作,您可以通过直接请求其物理 URL 来打开 JSF 页面,而无需使用虚拟 URL。这在 JSF 1.x 中是不可能的,因为它会让FacesServlet运行在无限循环中调用自身并导致堆栈溢出。

也可以看看:


至于这些警告,它们是不相关的,但可以用谷歌搜索。

于 2014-12-19T10:05:01.897 回答
0

我认为这会奏效

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.xyz.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.xyz.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <welcome-file-list>
    <welcome-file>/main/login.xhtml</welcome-file>
      </welcome-file-list>
<!--         <servlet>
        <servlet-name>login</servlet-name>
        <servlet-class>com.xyz.servlets.login</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping> -->

</web-app>
于 2019-05-30T08:57:38.503 回答
0

您可以在 web.xml 文件中设置默认页面,以通过两种方式在 JSF 中调用 facesServlet:

<web-app xmlns="http://xmlns.xyz.org/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://xmlns.xyz.org/xml/ns/javaee http://xmlns.xyz.org/xml/ns/javaee/web-app_4_0.xsd"
     version="4.0">
    <servlet>
        <servlet-name>facesServlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>facesServlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.xhtml</welcome-file>
    </welcome-file-list>
</web-app>

或直接从欢迎文件中调用 facesServlet,如下所示:

<web-app xmlns="http://xmlns.xyz.org/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://xmlns.xyz.org/xml/ns/javaee http://xmlns.xyz.org/xml/ns/javaee/web-app_4_0.xsd"
 version="4.0">
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>
</web-app>

我希望它可以帮助某人!

于 2018-06-22T11:21:03.837 回答