No puedo configurar una página predeterminada que se carga en el navegador cuando inicio un proyecto Java EE utilizando Tomcat 8.0 desde 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 demás 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 quizás index.jsp si hay alguna). Así que agregué index.html
e index.xhtml
páginas en mi carpeta WEB-INF
en el proyecto, con la esperanza de que se muestre al menos una de ellas. Sin embargo, nada sucede. El navegador siempre muestra solo la página en localhost:8080/JSFFaceletsTutorial/
URL, pero la página está en blanco, ni siquiera aparece 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: “Ventana / Navegador web / …” actuó durante un tiempo de manera diferente en los navegadores web externos que en el navegador web interno de 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 obsoleta. A pesar de que estaba absolutamente seguro de haberlo editado, guardado los cambios, reiniciado el servidor … y aún así, me mostró la versión obsoleta de la página. E incluso en este caso, aún ignoró los cambios realizados en el archivo web.xml
. Pero cuando lo bash ahora, vuelve a mostrar una página blanca en blanco en todos los navegadores. No estoy al tanto de ningún cambio que haya hecho, excepto la edición del archivo web.xml
…
Mi suposición es 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 ruta /JSFFaceletsTutorial/faces/login.xhtml
y /JSFFaceletsTutorial/faces/welcome.xhtml
. Eso es raro, porque no tengo ningún directorio “caras” en mi proyecto. Escribir todas las permutaciones posibles de:
faces/index.html faces/index.xhtm
en el web.xml
tampoco ayudó. No ayudó cuando escribí la dirección completa allí tampoco.
Aquí hay advertencias que recibo en la consola (omití las entradas de 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 ‘fuente’ en ‘org.eclipse. jst.jee.server: JSFFaceletsTutorial ‘no encontró una propiedad que coincida … ADVERTENCIA: JSF1074: Bean administrado llamado’ loginBean ‘ya se ha registrado. Reemplazar el tipo de clase de bean administrado existente com.tutorial.LoginBean con com.tutorial.LoginBean .Dic 19, 2014 9:39:57 AM org.apache.coyote.AbstractProtocol start ”
No estoy seguro de que esto sea útil. Estoy sin ideas ahora.
En primer lugar, el
no representa la ruta a la “página de inicio predeterminada”. Representa el nombre del archivo físico contenido en la carpeta que desea mostrar 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:
index.xhtml
De esta forma, si el usuario final solicita /
y usted tiene /index.xhtml
, entonces se /index.xhtml
. O bien, si el usuario final solicita /foo
y tiene /foo/index.xhtml
, se servirá, etc. Si no hay tal archivo, se devolverá un error 404.
Ahora, parece que asignó su FacesServlet
en un prefijo
de /faces/*
. Esto es un remanente de edades JSF 1.0 / 1.1 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.x y luego se actualizó de forma descuidada para JSF 2.x en lugar de reescribir desde cero.
Ese tutorial tampoco parece haber explicado algunos conceptos básicos de servlet . A saber, para poder ejecutar los componentes JSF en la página XHTML y generar algún resultado HTML, el FacesServlet
debe invocarse cuando se solicita la página XHTML. Cuando solicita la página XHTML como /index.xhtml
, mientras FacesServlet
se asigna en /faces/*
, no se invocará. El navegador recuperaría el código fuente JSF sin analizar en lugar de la salida HTML generada. Puede verlo haciendo clic con el botón derecho, Ver fuente en navegador web. Debería haber solicitado la página como /faces/index.xhtml
para que FacesServlet
pueda ejecutarse y producir resultados HTML que el navegador pueda comprender y presentar.
Eso solo no va bien junto con los archivos de bienvenida. Esto explica totalmente por qué obtienes una página “blanca limpia” (en blanco) cuando utilizas index.xhtml
como archivo de bienvenida (algunos index.xhtml
inferiores como IE generarían un diálogo de descarga de forma confusa debido a la falta de tipo de contenido incorrecto en la respuesta que contiene el código fuente XHTML sin procesar ) El FacesServlet
simplemente no se invocaba. Simplemente elimine el patrón de URL /faces/*
pasado de moda y use en su lugar el patrón de URL JSF 2.x minded *.xhtml
.
facesServlet *.xhtml
De esta forma, los archivos de bienvenida deberían funcionar y solo puede abrir páginas JSF solicitando directamente su URL física sin problemas con las URL virtuales. Esto no fue posible en JSF 1.x porque permitiría que el FacesServlet
ejecutara en un bucle infinito y provocara un desbordamiento de la stack.
En cuanto a esas advertencias, no están relacionadas pero son bastante googlables.
Puede configurar una página predeterminada en el archivo web.xml para que invoque facesServlet en JSF de 2 maneras:
facesServlet javax.faces.webapp.FacesServlet facesServlet *.xhtml index.xhtml
o invoque el facesServlet directamente desde el archivo de bienvenida de esta manera:
faces/index.xhtml
¡Espero que ayude a alguien!