Pregunta

Recientemente comencé a trabajar en JSF, antes de eso siempre he usado PHP o Python para el desarrollo web.

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

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

Ya tengo varias páginas que se navegan usando h: commandLink. Esto funciona bien hasta que uso el botón de retroceso del navegador. ¿Cómo debo manejar el botón Atrás en JSF?

Me cuesta entender por qué JSF se creó alrededor de la POST. Rompe los marcadores, el back-paging y la capacidad de indexar su página en los motores de búsqueda.

¿Fue útil?

Solución

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

Hay un elemento de redireccionamiento 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 la URL de redireccionamiento usted mismo, 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 recuerdo si estoy codificando la URL correctamente.

Varias bibliotecas de terceros agregan diferentes niveles de características. No estoy seguro de si se ha hecho algo en JSF 2.0 en esta área, pero valdría la pena echarle un vistazo.

Otros consejos

Sí. JSF se basa en POST y es uno de los puntos más importantes de JSF. Eche un vistazo a JAX-RS / Seam o Spring para ver las páginas GETable que se pueden marcar.

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

Puede leer su PostRedirectGetListener y resolverá el mensaje de confirmación de reenvío del formulario de devolución / actualización.

Le aconsejo que agregue lo siguiente a beforePhase para manejar el procesamiento parcial de ajax (si corresponde):

if(event.getFacesContext().getPartialViewContext().isAjaxRequest())
{
    return;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top