¿Cuál es la diferencia entre crear páginas JSF con la extensión.jsp o.xhtml o.jsf
facelets file-extension (2)
JSP es una tecnología de vista antigua y ampliamente utilizada en combinación con JSF 1.x. Facelets (por algunas personas sobregeneralizadas como XHTML ) es el sucesor de JSP e introducido como tecnología de vista predeterminada de JSF 2.x a finales de 2009. Cuando veías JSPs, tal vez estabas leyendo libros obsoletos, tutoriales o recursos dirigidos a JSF 1 .X. En general, debe ignorarlos al desarrollar con JSF 2.x y dirigirse a los recursos dirigidos a JSF 2.x, de lo contrario, puede terminar en confusión porque muchas cosas se hacen de forma diferente en JSF 2.x en Facelets.
El *.jsf
es solo uno de los patrones de URL ampliamente utilizados de la asignación de FacesServlet
en web.xml
. Otros son *.faces
y /faces/*
, pero esos son de atrás en las edades JSF 1.0 / 1.1. Todos ellos no representan la extensión / ruta de archivo concreta, sino solo una extensión / ruta de archivo virtual y debe especificarse en las URL solo como http://example.com/contextname/page.jsf . Si está familiarizado con los Servlets básicos, debe saber que servletcontainer invocará el servlet cuando la URL de solicitud coincida con el patrón de URL del servlet. Por lo tanto, cuando la URL de solicitud coincida con *.jsf
, el FacesServlet
se invocará de esta manera. Al usar JSP, en realidad ejecutaría page.jsp
. Al usar Facelets, esto realmente compilaría page.xhtml
.
Desde JSF 2.x también puede usar *.xhtml
como patrón de URL. De esta forma, no necesita confundirse al especificar las URL. El uso de *.xhtml
como patrón de URL no fue posible en JSF 1.x con Facelets 1.x, porque el FacesServlet
se ejecutaría entonces en un bucle infinito que se llamaba cada vez. Una ventaja adicional de usar *.xhtml
es que el usuario final no podrá ver el código fuente JSF sin procesar siempre que el usuario final cambie deliberadamente la extensión URL en la barra de direcciones del navegador, por ejemplo, de .jsf
a .xhtml
. No es posible usar *.jsp
como patrón de URL, porque de esta manera el JspServlet
del contenedor, que ya está usando ese patrón de URL, sería anulado y entonces FacesServlet
ya no podría alimentar a los JSP.
Ver también:
Vi algunos ejemplos que crean las páginas JSF con la extensión .jsp
, otros ejemplos las crean con extensión .xhtml
y otros ejemplos eligen .jsf
. Solo me gustaría saber cuál es la diferencia entre las extensiones anteriores cuando se trabaja con páginas JSF, y cómo elegir la extensión adecuada.
.jsp
archivos .jsp
generalmente se usan para vistas JSF definidas usando JavaServer Pages. .xhtml
archivos .xhtml
generalmente se usan para vistas JSF definidas usando Facelets.
Esto se puede cambiar a través de la configuración (por ejemplo, consulte los parámetros de configuración javax.faces.DEFAULT_SUFFIX
y javax.faces.FACELETS_SUFFIX
).
Otras asignaciones de extensión ( *.jsf
, *.faces
) tienden a ser utilizadas para procesar solicitudes a través de FacesServlet
. Esta es una asignación lógica a la vista que manejará el tiempo de ejecución JSF. La forma en que se manejan las asignaciones se define en el web.xml
(que no tiene que hacerse con extensiones, el mapeo /faces/*
se usa a menudo).
De la especificación:
Mapeo de servlets
Todas las solicitudes a una aplicación web se asignan a un servlet particular basándose en la coincidencia de un patrón de URL (como se define en la especificación de servlet de Java) con la parte de la URL de solicitud después de la ruta de contexto que seleccionó esta aplicación web. Las implementaciones de JSF deben admitir aplicaciones web que definan un
<servlet-mapping>
que asigne cualquier url-pattern válido al FacesServlet. Se puede usar un mapeo de prefijo o extensión. Al usar la asignación de prefijos, se recomienda la siguiente asignación, pero no es necesario:
<servlet-mapping> <servlet-name> faces-servlet-name </servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping>
Cuando se utiliza el mapeo de extensión, se recomienda el siguiente mapeo, pero no es obligatorio:
<servlet-mapping> <servlet-name> faces-servlet-name </servlet-name> <url-pattern>*.faces</url-pattern> </servlet-mapping>
Además de FacesServlet, las implementaciones de JSF pueden admitir otras formas de invocar el ciclo de vida de procesamiento de la solicitud JavaServer Faces, pero las aplicaciones que dependen de estos mecanismos no serán portátiles.