2009-08-04 35 views
5

Recientemente he empezado a hacer algunos trabajos JSF; antes de eso, siempre he usado PHP o Python para el desarrollo web.JSF commandLink, POSTing y el botón Atrás

Me sorprendió un poco descubrir que JSF utiliza HTTP POST para navegar cuando se usa la etiqueta h: commandLink.

He estado usando commandLink ya que esta es aparentemente la forma correcta de crear aplicaciones JSF. ¿Por qué JSF usa POST para la navegación? ¿Qué pasa con GET? Solo puedo suponer que el Javascript generado automáticamente por JSF para los eventos onclick podría exceder la longitud máxima para una solicitud GET.

Ya tengo un número de páginas navegadas con h: commandLink. Esto funciona bien hasta que utilizo el botón Atrás del navegador. ¿Cómo debo manejar el botón Atrás en JSF?

Estoy luchando por entender por qué JSF fue construido en torno al POST. Rompe marcadores, retrocesos y la posibilidad de indexar su página en los motores de búsqueda.

Respuesta

4

No lo ayudará a construir un enlace en el cliente, pero tenga en cuenta outputLink.

Hay un elemento de redirección para las reglas de navegación que puede ayudar con algunos problemas de actualización.

<navigation-rule> 
    <display-name>navBack</display-name> 
    <from-view-id>/navBack.jsp</from-view-id> 
    <navigation-case> 
    <from-outcome>navTo</from-outcome> 
    <to-view-id>/navTo.jsp</to-view-id> 
    <redirect /> 
    </navigation-case> 
</navigation-rule> 

Si todo lo demás falla, puede hacer lo mismo URL de redireccionamiento, como en esta acción:

public String doAction() { 
    System.out.println("Did some non-idempotent operation"); 
    FacesContext context = FacesContext.getCurrentInstance(); 
    ExternalContext extContext = context.getExternalContext(); 
    Application app = context.getApplication(); 
    ViewHandler viewHandler = app.getViewHandler(); 
    String url = viewHandler.getActionURL(context, "/navTo.jsp"); 
    url = url + (url.indexOf('?') < 0 ? '?' : '+') + "foo=bar"; 
    url = extContext.encodeResourceURL(url); 
    try { 
    extContext.redirect(url); 
    } catch (IOException e) { 
    throw new FacesException(e); 
    } 
    return null; 
} 

Advertencias: No puedo recordar si estoy codifica la dirección URL correctamente.

Varias bibliotecas de terceros agregan diferentes funciones. No estoy seguro de si se ha hecho algo en JSF 2.0 en esta área, pero podría valer la pena verla.

+0

Parece que JSF 2.X tiene mucho mejor soporte para GET y REST –

1

Sí. JSF se basa en POST y es uno de los mayores puntos de fricción sobre JSF. Eche un vistazo a JAX-RS/Seam o Spring para las páginas GETables que marcan un lugar.

1

Como BalusC dijo en su blog, GET se debe utilizar para la navegación entre páginas. Use h:outputLink para la navegación.

Puede leer su PostRedirectGetListener y lo resolverá de nuevo/actualizará el mensaje de confirmación de reenvío.

consejo que usted pueda añadir lo siguiente a beforePhase con el fin de manejar el procesamiento ajax parcial (si procede):

if(event.getFacesContext().getPartialViewContext().isAjaxRequest()) 
{ 
    return; 
} 
Cuestiones relacionadas