[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Patrón PRG con JSF
- To: mindfood@xxxxxxxxxxxxxxx
- Subject: Patrón PRG con JSF
- From: Rafael Luque Leiva <rafael.luque@xxxxxxxxxxxxxxx>
- Date: Fri, 26 Oct 2007 20:18:15 +0200
- Delivered-to: mailing list mindfood@orange-soft.com
- Delivered-to: moderator for mindfood@orange-soft.com
- Mailing-list: contact mindfood-help@orange-soft.com; run by ezmlm
- Organization: Orange Soft
- User-agent: KMail/1.9.7
Hola,
Como ya sabéis quienes desarrolláis aplicaciones web con JSF, los formularios
generados por JSF no permiten el uso de GET. Esto en principio no debería
suponer un gran inconveniente, aunque sí nos está obligando a usar el patrón
PRG (Post-Redirect-Get) [1], es decir, a enviar como respuesta una petición
de redirección una vez procesada la acción POST en el servidor. De esta
manera, conseguimos que las páginas que se presentan al cliente mantengan
algunas características tan importantes como que puedan usarse como
bookmarks o recargarse sin provocar dobles reenvíos.
El mecanismo de navegación de JSF soporta la redirección, basta con añadir el
elemento <redirection/> al <navigation-case> correspondiente. Sin embargo,
lamentablemente no es posible especificar parámetros ni usar expresiones EL
para construir la URL de destino, con lo que (incomprensiblemente) este
mecanismo no es válido para redirigir a recursos que requieran parámetros en
la petición.
Por este motivo, hasta ahora realizábamos la redirección manualmente desde las
clases controladoras (Managed Beans), evitando el uso de las reglas de
navegación de JSF, pero hace poco hemos dado con dos soluciones mucho más
convenientes que comparto con vosotros por si le resultan de utilidad a
alguien más:
1. Crear un ViewHandler propio que decore el original (p.ej. en nuestro caso
el de Facelets [2]), sobreescribiendo el método getActionURL para evaluar
previamente las posibles expresiones EL que se incluyan en la URL destino
[3]. Esta técnica nos permite crear reglas de navegación dinámicas como por
ejemplo:
<navigation-rule>
<navigation-case>
<from-action>#{SearchBean.search}</from-action>
<from-outcome>redirectToResult</from-outcome>
<to-view-id>/search.jsf?query=#{SearchBean.query}</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
2. Otra opción [4] consiste en crear y registrar una implementación de
PhaseListener que intercepte todas las peticiones de tipo POST antes de la
fase de representación de la respuesta y redirija el navegador a la vista
mediante GET.
Ambas soluciones aprovechan la gran extensibilidad de la arquitectura JSF y
nos permiten prescindir de la redirección manual desde los managed beans. En
cualquier caso, es sorprendente que el mecanismo de navegación estándar de
JSF no soporte algo tan básico. Esperemos que JSF 2.0 (JSR 314) [5] corrija
estas limitaciones.
Un saludo,
Rafa
[1] Patrón PRG: http://en.wikipedia.org/wiki/Post/Redirect/Get
[2] Facelets: https://facelets.dev.java.net/
[3]
http://typo.ars-subtilior.com/articles/2007/01/24/how-to-make-jsf-navigation-rules-more-dynamic
[4] http://learnjsf.com/wp/2006/08/06/a-prg-phase-listener-for-jsf
[5] http://jcp.org/en/jsr/detail?id=314
--
Rafael Luque Leiva
Orange Soft - http://www.orange-soft.com
Creando software para las personas
Urbanización Las Castañeras
Arroyo de los Combos, 26 bis
Arroyomolinos, E28939 Madrid
Tel: +34 692 613 639
Fax: +34 916 091 075
GnuPG Key ID: 0x4B9238A2