eclipse jsf tomcat homescreen welcome-file

eclipse - Establecer página de inicio predeterminada a través de<archivo de bienvenida> en el proyecto JSF



tomcat homescreen (3)

No puedo configurar una página predeterminada que se carga en el navegador cuando inicio un proyecto Java EE con Tomcat 8.0 de Eclipse. Estoy tratando de aprender JSF, así que seguí este tutorial

Todo funciona bien, pero solo puedo ver las páginas creadas cuando hago clic derecho en el archivo login.xhtml o welcome.xhtml y elijo "Ejecutar como / Ejecutar en el servidor".

Hasta ahora, todas las otras aplicaciones web que he creado cargaron la página predeterminada cuando comencé todo el proyecto. El comportamiento predeterminado es cargar la página index.html (o tal vez index.jsp si hay alguna). Así que index.xhtml páginas index.html e index.xhtml en mi carpeta WEB-INF en el proyecto, con la esperanza de que se muestre al menos una de ellas. Sin embargo, no pasa nada. El navegador siempre muestra solo la página en localhost:8080/JSFFaceletsTutorial/ URL, pero la página está en blanco, ni siquiera un mensaje de error. Creo que he estado recibiendo el error 404 en el proceso de resolver este problema en el camino, sin embargo, ya no puedo reproducir este error y no recuerdo qué lo causó.

Descubrí que es posible cambiar la página de inicio predeterminada

Sin embargo, tampoco funciona para mí. Independientemente de si edito el archivo web.xml o no, obtengo el mismo resultado.

Lo que es aún más desconcertante es que cuando intenté cambiar el navegador web: "Window / Web Browser / ..." actuó durante un tiempo de manera diferente en los navegadores web externos que en el navegador web interno Eclipse. El interno siempre tenía una página en blanco, pero los navegadores web externos una vez lograron mostrar la página index.html , pero era una versión desactualizada. A pesar de que me aseguré de editarlo, guardar los cambios, reiniciar el servidor ... y aun así, me mostró la versión desactualizada de la página. E incluso en este caso, aún ignoró los cambios realizados en el archivo web.xml . Pero cuando lo estoy intentando ahora, nuevamente muestra una página en blanco en todos los navegadores. No conozco ningún cambio que haya hecho, excepto para editar el archivo web.xml ...

Supongo que el problema está en la tecnología JSF que aún no entiendo completamente. Es porque cuando elijo ejecutar las páginas login.xhtml y welcome.xhtml login.xhtml clic derecho en "Ejecutar como / Ejecutar en el servidor", la URL de esas páginas está en localhost:8080: con la ruta /JSFFaceletsTutorial/faces/login.xhtml y /JSFFaceletsTutorial/faces/welcome.xhtml . Eso es extraño, porque no tengo ningún directorio "caras" en mi proyecto. Escribir todas las permutaciones posibles de:

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

en el web.xml tampoco ayudó. Tampoco ayudó cuando escribí la dirección completa allí.

Aquí hay advertencias que recibo en la consola (omití las entradas del registro INFO):

"19 de diciembre de 2014 9:39:55 AM org.apache.tomcat.util.digester.SetPropertiesRule begin ADVERTENCIA: [SetPropertiesRule] {Server / Service / Engine / Host / Context} Estableciendo la propiedad ''source'' en ''org.eclipse. jst.jee.server: JSFFaceletsTutorial ''no encontró una propiedad coincidente ... ADVERTENCIA: JSF1074: El bean administrado llamado'' loginBean ''ya ha sido registrado. Reemplazando el tipo de clase de bean administrado existente com.tutorial.LoginBean con com.tutorial.LoginBean . Dec 19, 2014 9:39:57 AM org.apache.coyote.AbstractProtocol start "

Sin embargo, no estoy seguro de que esto sea útil. Estoy sin ideas ahora.


En primer lugar, el <welcome-file> no representa la ruta a la "página de inicio predeterminada". Representa el nombre de archivo del archivo físico contenido en la carpeta que le gustaría servir como archivo predeterminado cuando se solicita una carpeta como / , /foo/ , /foo/bar/ , etc.

Entonces, en el sabor JSF 2.x, eso sería básicamente:

<welcome-file-list> <welcome-file>index.xhtml</welcome-file> </welcome-file-list>

De esta manera, si el usuario final solicita / y usted tiene /index.xhtml , entonces será atendido. O, si el usuario final solicita /foo y usted tiene /foo/index.xhtml , se le servirá, etc. Si no existe dicho archivo, se devolverá un error 404.

Ahora, parece que ha asignado su FacesServlet en un prefijo <url-pattern> de /faces/* . Este es un remanente de JSF 1.0 / 1.1 edades y realmente no se recomienda en estos días. Tal vez estaba leyendo un tutorial desactualizado dirigido a JSF 1.x, o un tutorial mal mantenido que fue escrito originalmente para JSF 1.xy luego actualizado sin cuidado para JSF 2.x en lugar de reescrito desde cero.

Ese tutorial tampoco parece haber explicado algunos conceptos básicos de servlet . Es decir, para que los componentes JSF de la página XHTML se ejecuten y generen algún resultado HTML, se debe invocar el FacesServlet cuando se solicita la página XHTML. Cuando solicita la página XHTML como /index.xhtml , mientras el FacesServlet se está mapeando en /faces/* , no se invocará. El navegador luego recuperaría el código fuente JSF sin analizar sin procesar en lugar de la salida HTML generada. Puede verlo haciendo clic derecho, Ver código fuente en el navegador web. Debería haber solicitado la página como /faces/index.xhtml para que FacesServlet pueda ejecutarse y producir una salida HTML que el navegador pueda comprender y presentar.

Eso solo no va bien junto con los archivos de bienvenida. Esto explica totalmente por qué se obtiene una página "en blanco" (en blanco) cuando se utiliza index.xhtml como archivo de bienvenida (algunos index.xhtml inferiores, como IE, generarían un diálogo de descarga de forma confusa debido a un tipo de contenido faltante / incorrecto en la respuesta que contiene el código fuente XHTML sin procesar ) FacesServlet simplemente no se invocaba. Simplemente deshágase del patrón de URL anticuado /faces/* y use el patrón de URL JSF 2.x minded *.xhtml lugar.

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

De esta forma, los archivos de bienvenida deberían funcionar y puede abrir páginas JSF solicitando directamente su URL física sin problemas con las URL virtuales. Esto no era posible en JSF 1.x porque permitiría que el FacesServlet ejecute en un bucle infinito que se llama a sí mismo y causa un desbordamiento de la pila.

Ver también:

En cuanto a esas advertencias, no están relacionadas pero son bastante buscables.


Puede configurar una página predeterminada en el archivo web.xml para que se invoque el facesServlet en JSF de 2 maneras:

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

o invoque el facesServlet directamente desde el archivo de bienvenida de esta manera:

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

¡Espero que ayude a alguien!


creo que esto funcionará

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