Domanda

Di recente ho iniziato a lavorare su JSF, prima di allora ho sempre usato PHP o Python per lo sviluppo web.

Sono stato un po 'sorpreso di scoprire che JSF utilizza i POST HTTP per navigare quando viene utilizzato il tag h: commandLink.

Sto usando il commandLink poiché questo è apparentemente il modo corretto di creare app JSF. Perché JSF utilizza POST per la navigazione? Cosa c'è di sbagliato con GET? Posso solo supporre che il Javascript generato automaticamente da JSF per gli eventi onclick possa superare la lunghezza massima per una richiesta GET.

Ho già un numero di pagine che vengono navigate usando h: commandLink. Funziona bene fino a quando non utilizzo il pulsante Indietro del browser. Come devo fare per gestire il pulsante Indietro in JSF?

Faccio fatica a capire perché JSF è stato costruito attorno al POST. Rompe il bookmarking, il back-paging e la possibilità di avere la tua pagina indicizzata nei motori di ricerca.

È stato utile?

Soluzione

Non ti aiuterà a costruire un collegamento sul client, ma tieni presente outputLink .

Esiste un elemento di reindirizzamento per le regole di navigazione che può aiutare per alcuni problemi di aggiornamento.

<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>

Se tutto il resto fallisce, puoi eseguire tu stesso l'URL di reindirizzamento, come in questa azione:

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;
}

Avvertenze: non ricordo se sto codificando correttamente l'URL.

Varie librerie di terze parti aggiungono quantità diverse di funzioni. Non sono sicuro che sia stato fatto qualcosa in JSF 2.0 in quest'area, ma potrebbe valere la pena dare un'occhiata.

Altri suggerimenti

Yup. JSF è costruito attorno a POST ed è uno dei maggiori punti critici su JSF. Dai un'occhiata a JAX-RS / Seam o Spring per le pagine GETable con segnalibro.

Come ha detto BalusC sul suo blog , GET dovrebbe essere usato per la navigazione tra le pagine. Utilizzare h: outputLink per la navigazione.

Puoi leggere il suo PostRedirectGetListener e risolverà il messaggio di conferma di reinvio del modulo di ritorno / aggiornamento.

Ti consiglio di aggiungere quanto segue a beforePhase per gestire l'elaborazione parziale di ajax (se pertinente):

if(event.getFacesContext().getPartialViewContext().isAjaxRequest())
{
    return;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top