2009-08-04 10 views
5

Ich habe vor kurzem begonnen, etwas JSF Arbeit zu tun - vorher habe ich immer PHP oder Python für Web-Entwicklung verwendet.JSF commandLink, POSTing und die Zurück-Taste

Ich war etwas überrascht zu finden, dass JSF HTTP-POSTs verwendet, um zu navigieren, wenn das h: commandLink-Tag verwendet wird.

Ich habe den BefehlLink verwendet, da dies offenbar der richtige Weg zum Erstellen von JSF-Anwendungen ist. Warum verwendet JSF POST für die Navigation? Was ist los mit GET? Ich kann nur annehmen, dass das Javascript, das von JSF automatisch für die onclick-Ereignisse generiert wird, die maximale Länge für eine GET-Anfrage überschreiten könnte.

Ich habe bereits eine Anzahl von Seiten, die mit h: commandLink navigiert werden. Dies funktioniert gut, bis ich den Zurück-Button des Browsers benutze. Wie gehe ich mit der Zurück-Schaltfläche in JSF um?

Ich habe Mühe zu verstehen, warum JSF um den POST herum aufgebaut wurde. Es bricht Bookmarking, Back-Paging und die Möglichkeit, Ihre Seite in Suchmaschinen indiziert zu haben.

Antwort

4

Es wird Ihnen nicht helfen, einen Link auf dem Client zu erstellen, aber beachten Sie outputLink.

Es gibt ein Redirect-Element für Navigationsregeln, das bei einigen Aktualisierungsproblemen helfen kann.

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

Wenn alles andere fehlschlägt, können Sie die Umleitungs-URL selbst tun, wie sie in dieser Aktion:

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

Caveats: Ich kann mich nicht erinnern, ob ich die URL richtig kodiert bin.

Verschiedene Bibliotheken von Drittanbietern fügen unterschiedliche Funktionen hinzu. Ich bin mir nicht sicher, ob in diesem Bereich etwas in JSF 2.0 getan wurde, aber es könnte einen Blick wert sein.

+0

Es scheint, dass JSF 2.X hat viel bessere Unterstützung für GET und REST –

1

Yup. JSF basiert auf POST und es ist einer der größten Knackpunkt bei JSF. Werfen Sie einen Blick auf die Seiten JAX-RS/Seam oder Spring, um Lesezeichen zu erstellen.

1

Wie BalusC auf seiner blog sagte, sollte GET für die Navigation zwischen den Seiten verwendet werden. Verwenden Sie h:outputLink für die Navigation.

Sie können seinen PostRedirectGetListener lesen, und er löst die Bestätigungsmeldung für die erneute Übermittlung des Formulars.

ich Rat Sie folgendes beforePhase hinzuzufügen, um Teil-Ajax-Verarbeitung zu handhaben (falls zutreffend):

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