Qué URL usar para vincular/navegar a otras páginas JSF
jsf-2 hyperlink (1)
En primer lugar, JSF es un generador de código HTML. Por lo tanto, no es diferente en JSF que en HTML "simple". Simplemente no debe mirar la estructura del sistema de archivos en el proyecto de aplicación web al crear enlaces en HTML. Debe mirar la estructura de URL pública de esos recursos. Es el navegador web quien debe invocar y descargar esos recursos, no el servidor web. El navegador web no sabe absolutamente nada sobre la estructura del sistema de archivos en el servidor web. Esto no es específico para proyectos JSF. Esto se aplica a todos los proyectos web.
Las URL relativas no son relativas a su ubicación en la estructura del sistema de archivos en el proyecto de aplicación web.
Son relativos a la URL de solicitud del documento HTML abierto actualmente, exactamente el que ve en la barra de direcciones del navegador.
Se debe tener en cuenta que cuando un elemento
<base>
está presente en el documento HTML, todas las URL relativas en el documento HTML que no comienzan con
/
se volverán relativas a él.
Dada una aplicación web que se configura con el patrón de URL de mapeo
FacesServlet
de
*.xhtml
, y se implementa en
localhost:8080
con una ruta de
/context
de
/context
, la URL de un archivo
/index.xhtml
en la raíz web del proyecto será la siguiente:
http://localhost:8080/context/index.xhtml
---- -------------- ------- -----------
| | | `-- resource
| | `-- path (can be multiple folders)
| `-- domain (and port)
`-- scheme
Cuando se encuentra actualmente en
http://localhost:8080/context/index.xhtml
, y desea crear un enlace a
http://localhost:8080/context/index.xhtml
, todas las formas siguientes en última instancia, apunta exactamente a la misma URL absoluta.
-
Una URL relativa que comienza con
//
es relativa al esquema actual.<a href="//localhost:8080/context/calculate/calculate.xhtml">link</a>
-
Una URL relativa que comienza con
/
es relativa al dominio.<a href="/context/calculate/calculate.xhtml">link</a>
-
Una URL relativa que no comienza con
/
es relativa a la ruta.<a href="calculate/calculate.xhtml">link</a>
Y cuando se encuentra actualmente en
http://localhost:8080/context/calculate/calculate.xhtml
http://localhost:8080/context/index.xhtml
, y desea vincular a
http://localhost:8080/context/index.xhtml
, se aplican las mismas reglas:
-
Una URL relativa que comienza con
//
es relativa al esquema actual.<a href="//localhost:8080/context/index.xhtml">link</a>
-
Una URL relativa que comienza con
/
es relativa al dominio.<a href="/context/index.xhtml">link</a>
-
Una URL relativa que no comienza con
/
es relativa a la ruta.<a href="../index.xhtml">link</a>
Como probablemente ya se haya dado cuenta, una URL relativa que comienza con
/
no
depende de la ruta y el dominio actuales.
Entonces, esa es la URL que realmente desea usar en todas partes en su aplicación web sin preocuparse por problemas de mantenimiento al cambiar de dominio o mover archivos en el servidor.
Lo único que queda es la dinámica de la ruta de contexto.
Probablemente ya sepa que este valor no es controlable desde el interior de la aplicación web.
Realmente te gustaría evitar codificarlo.
Sin embargo, puede dejar que JSF lo imprima mediante programación con un poco de ayuda de EL.
Es decir, solo está disponible por
HttpServletRequest#getContextPath()
y
HttpServletRequest
está en EL disponible como objeto implícito
#{request}
.
<a href="#{request.contextPath}/index.xhtml">link</a>
<a href="#{request.contextPath}/calculate/calculate.xhtml">link</a>
Solo se vuelve tedioso repetir esto cada vez.
Afortunadamente, JSF ofrece el componente
<h:link>
con el solo propósito de generar un elemento HTML
<a>
con la ruta de contexto actual automáticamente en línea.
<h:link value="link" outcome="index.xhtml" />
<h:link value="link" outcome="calculate/calculate.xhtml" />
Tenga en cuenta que el
outcome
debe representar una ID de vista JSF, que no es necesariamente la misma que la ruta URL (lo será cuando
FacesServlet
en
*.xhtml
).
Incluso puede omitir la extensión del archivo aquí, JSF lo detectará automáticamente como parte del mecanismo de "navegación implícita".
<h:link value="link" outcome="index" />
<h:link value="link" outcome="calculate/calculate" />
Ver también:
- ¿Se recomienda usar la etiqueta <base> html?
- ¿Cuáles son esas URL que comienzan con //, que puedes ver en la fuente html de Google+?
- Facelets JSF: a veces veo que la URL es .jsf y otras veces .xhtml. ¿Por qué?
- Objetos implícitos en EL
- ¿Cómo navegar en JSF? Cómo hacer que la URL refleje la página actual (y no la anterior)
Estoy confundido acerca de cómo vincular entre archivos en un proyecto Java Server Faces, cuando algunos de los archivos están en subcarpetas. (Iba a adjuntar capturas de pantalla para que pueda ver la vista del proyecto Nebeans y la vista de archivos del ejemplo que estoy intentando ... pero todavía no tengo permitido agregar imágenes).
En mi proyecto de ejemplo, tengo archivos llamados "index.xhtml" y "Calculate / Calculate.xhtml". También tengo un archivo llamado "template.xhtml" que ambos usan. La pregunta es qué formato de URL usar en la plantilla que funcionará para ambos archivos.
En html directo, usaría algo como lo siguiente para proporcionar un enlace a la página de inicio que funcione desde cualquier ubicación:
<a href="/index.html">Home</a>
Pero no puedo entender qué cuenta como la carpeta raíz para una aplicación JSF, y si usar la estructura de carpetas "vista de proyecto" o la estructura de carpetas "lista de archivos".