Sincronización de páginas en la barra de direcciones en una aplicación web utilizando JSF2
-
26-10-2019 - |
Pregunta
Estoy trabajando en una aplicación JSF2 y tengo un problema con el nombre de la página que se muestra en la barra de direcciones. Cuando navego a otra página que tengo en la dirección del nombre de la página anterior.
Gracias.
Solución
Esto se debe a que está utilizando POST en lugar de obtener la navegación de página a página y JSF predeterminado se envía a la misma vista con el que está utilizando <h:form>
. El uso de la publicación para la navegación de página a página es en cualquier caso un enfoque muy pobre. No solo no es fácil de usar (no es marcable y confuso), sino que tampoco es amigable con SEO (SearchBots no sigue <form>
comportamiento).
Para resolver este problema, debe dejar de usar <h:commandLink>
para navegación de página a página. Usar <h:link>
en cambio.
<h:link value="Go to next page" outcome="nextpage" />
Esto solo renderizará un
<a href="/contextpath/nextpage.xhtml">Go to next page</a>
Lo cual es perfectamente marcable, fácil de usar y amigable con el SEO.
Cuando estás navegando a una página diferente como resultado de un formulario de publicación real, también lo reemplazaría devolviendo null
o void
Y simplemente rinde el resultado/mensajes condicionalmente en la misma vista. O si se supone que el resultado es marcable (por ejemplo, resultados de búsqueda), debe usar enlaces normales o simples <form>
en vez de <h:form>
y use <f:viewParam>
En la vista del objetivo.
Ver también:
Otros consejos
Esto es más tardío porque, en JSF, cuando está navegando a una nueva página, el servidor está realizando un reenvío a la nueva página. El navegador desconoce el reenvío y muestra la URL anterior. Para que el servidor realice una redirección en lugar de reenviar, debe:
Si está utilizando reglas de navegación, agregue un <redirect/>
a cada regla:
<navigation-rule>
<from-view-id>/pages/from.xhtml</from-view-id>
<navigation-case>
<from-outcome>to</from-outcome>
<to-view-id>/pages/to.xhtml</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
Si está devolviendo un resultado de un método de frijoles, agregue un ?faces-redirect=true
al resultado:
public String navigate() {
return "/pages/to?faces-redirect=true";
}