2009-08-04 17 views
5

Ho iniziato di recente a fare qualche lavoro JSF - prima ho sempre usato PHP o Python per lo sviluppo web.JSF commandLink, POSTing e il pulsante back

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

Sono stato con la commandLink come questo è a quanto pare il modo corretto per costruire applicazioni JSF. Perché JSF usa il POST per la navigazione? Cosa c'è di sbagliato in 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 navigabili usando h: commandLink. Funziona bene fino a quando non utilizzo il pulsante Indietro del browser. Come dovrei andare a gestire il pulsante Indietro in JSF?

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

risposta

4

Non ti aiuterà a creare un collegamento sul client, ma fai attenzione a outputLink.

C'è 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, si può fare l'URL di reindirizzamento da soli, 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 riesco a ricordare se sto codifica correttamente l'URL.

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

+0

sembra che JSF 2.X ha molto migliore supporto per GET e REST –

1

Sì. JSF è costruito attorno al POST ed è uno dei più grandi punti critici su JSF. Dai un'occhiata a JAX-RS/Seam o Spring per le pagine GETable segnalabili.

1

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

È possibile leggere il suo PostRedirectGetListener e risolverà il messaggio di conferma di nuovo invio/aggiornamento del modulo.

io consiglio di aggiungere quanto segue per beforePhase al fine di gestire l'elaborazione ajax parziale (se del caso):

if(event.getFacesContext().getPartialViewContext().isAjaxRequest()) 
{ 
    return; 
} 
Problemi correlati