通过JSF项目</welcome-file>中的<welcome-file>设置默认主页

时间:2014-12-19 09:15:35

标签: eclipse jsf tomcat homescreen welcome-file

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

一切正常,但是当我右键单击login.xhtmlwelcome.xhtml文件并选择&#34;在服务器上运行/运行&#34;时,我只能看到创建的页面。< / p>

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

我发现可以change the default starting page

然而,它对我也没有用。无论我是否编辑web.xml文件,我都会得到相同的结果。

更令人费解的是,当我尝试更改网络浏览器时:&#34; Window / Web Browser /..."它在外部Web浏览器中的作用时间与内部Eclipse Web浏览器不同。内部总是空白页面 - 但外部网络浏览器曾设法显示index.html页面 - 但它是一些过时的版本。尽管我完全确定我编辑了它,保存了更改,重新启动了服务器......然而,它仍然显示了页面的过时版本。 即使在这种情况下,它仍然忽略了web.xml文件中所做的更改。 但是当我现在尝试它时,它再次在所有浏览器中显示空白页面。除了编辑web.xml文件...

之外,我不知道我做了任何更改

我的猜测是问题在于我还没有完全掌握的JSF技术。这是因为当我选择使用右键单击&#34;运行方式/在服务器上运行&#34;来运行login.xhtmlwelcome.xhtml页面时,这些页面的URL位于{{ 1}}包含路径localhost:8080:/JSFFaceletsTutorial/faces/login.xhtml。这很奇怪,因为我没有任何目录&#34;面孔&#34;在我的项目中。 键入所有可能的排列:

/JSFFaceletsTutorial/faces/welcome.xhtml
<welcome-file-list> <welcome-file>faces/index.html</welcome-file> <welcome-file>faces/index.xhtm</welcome-file> </welcome-file-list> 中的

也没有帮助。当我在那里输入完整地址时,它没有任何帮助。

以下是我在控制台中收到的警告(我跳过了INFO日志条目):

  

&#34; 2014年12月19日上午9:39:55 org.apache.tomcat.util.digester.SetPropertiesRule开始   警告:[SetPropertiesRule] {服务器/服务/引擎/主机/上下文}设置属性&#39; source&#39; to&#39; org.eclipse.jst.jee.server:JSFFaceletsTutorial&#39;没有找到匹配的财产。   ...   警告:JSF1074:名为&#39; loginBean&#39;的托管bean已经注册。用com.tutorial.LoginBean替换现有的托管bean类com.tutorial.LoginBean。   2014年12月19日上午9:39:57 org.apache.coyote.AbstractProtocol start&#34;

我不确定这是否有用。 我现在没有想法了。

3 个答案:

答案 0 :(得分:13)

首先,<welcome-file>不代表&#34;默认主页&#34;的路径。它表示文件夹中包含的物理文件的文件名,当文件夹(例如//foo/,{{}时,您希望将其作为默认文件提供请求1}}等。

所以,在JSF 2.x风格中,基本上就是:

/foo/bar/

这样,如果最终用户请求<welcome-file-list> <welcome-file>index.xhtml</welcome-file> </welcome-file-list> 并且您有/,那么它将被提供。或者,如果最终用户请求/index.xhtml并且您有/foo,则会提供服务,等等。如果没有此类文件,则会返回404错误。

现在,您似乎已将/foo/index.xhtml映射到FacesServlet的前缀<url-pattern>。这是JSF 1.0 / 1.1时代的遗留物,这些天真的不推荐。也许你正在阅读一本针对JSF 1.x的过时教程,或者一本维护得很差的教程,该教程最初是为JSF 1.x编写的,然后针对JSF 2.x进行了无法更新,而不是从头开始重写。

该教程似乎也没有向您解释some servlet basics。也就是说,为了使XHTML页面中的JSF组件运行并生成一些HTML输出,在请求XHTML页面时必须调用/faces/*。当你像FacesServlet那样请求XHTML页面时,/index.xhtml被映射到FacesServlet,那么它就不会被调用。然后,浏览器将检索原始未解析的JSF源代码,而不是生成的HTML输出。你可以通过右键单击webbrowser中的查看源来查看它。您应该像/faces/*那样请求页面,以便/faces/index.xhtml可以运行并生成浏览器可以理解和呈现的HTML输出。

只与欢迎文件一起使用。这完全解释了为什么你会得到一个干净的白色&#34;使用FacesServlet作为欢迎文件时的(空白)页面(因为包含原始XHTML源代码的响应中的内容类型丢失/错误,因此IE之类的一些劣等webbrowsers会引起混淆prompt a download dialog)。根本没有调用index.xhtml。只需摆脱旧式FacesServlet网址格式,然后使用JSF 2.x有意识的/faces/*网址格式。

*.xhtml

这样欢迎文件应该可以工作,您只需直接请求其物理URL即可打开JSF页面,而无需使用虚拟URL。这在JSF 1.x中是不可能的,因为它会让<servlet-mapping> <servlet-name>facesServlet</servlet-name> <url-pattern>*.xhtml</url-pattern> </servlet-mapping> 在无限循环中运行并调用自身并导致堆栈溢出。

另见:


对于那些警告,它们无关但是相当可观。

答案 1 :(得分:1)

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

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.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.jcp.org/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.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>

我希望它能对某人有所帮助!

答案 2 :(得分:-1)

我认为这会起作用

<?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>