[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Patrón PRG con JSF



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