2009-08-04 7 views
5

Niedawno zacząłem wykonywać niektóre prace JSF - wcześniej zawsze używałem PHP lub Python do tworzenia stron internetowych.JSF commandLink, POSTing i przycisk powrotu

Byłem nieco zaskoczony tym, że JSF korzysta z HTTP POST do nawigacji, gdy używany jest znacznik h: commandLink.

Używam komendy commandLink, ponieważ jest to najwyraźniej poprawny sposób tworzenia aplikacji JSF. Dlaczego JSF używa POST do nawigacji? Co jest nie tak z GET? Mogę tylko założyć, że JavaScript, który jest automatycznie generowany przez JSF dla zdarzeń onclick, może przekroczyć maksymalną długość dla żądania GET.

Mam już wiele stron, które są nawigowane za pomocą polecenia h: commandLink. Działa to dobrze, dopóki nie użyję przycisku wstecz przeglądarki. Jak powinienem postępować z obsługą przycisku wstecz w JSF?

Staram się zrozumieć, dlaczego JSF został zbudowany wokół POST. Łamie zakładki, back-paging i możliwość indeksowania twojej strony w wyszukiwarkach.

Odpowiedz

4

Nie pomoże Ci utworzyć linku do klienta, ale pamiętaj o outputLink.

Istnieje element przekierowujący dla reguł nawigacji, który może pomóc w niektórych problemach z odświeżaniem.

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

Jeśli wszystko inne zawiedzie, można zrobić przekierowanie sam, jak w tym działania:

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

Ostrzeżenia: Nie mogę sobie przypomnieć, czy mam poprawnie kodowania URL.

Różne biblioteki stron trzecich dodają różne funkcje. Nie jestem pewien, czy cokolwiek zostało zrobione w JSF 2.0 w tej dziedzinie, ale może warto byłoby rzucić okiem.

+0

Wydaje się, że JSF 2.X ma znacznie lepsze wsparcie dla GET i odpoczynek –

1

Yup. JSF jest zbudowany wokół POST i jest jednym z największych punktów spornych dotyczących JSF. Spójrz na stronę JAX-RS/Seam lub Spring, aby zobaczyć interesujące strony GETable.

1

Jak powiedział BalusC na swoim blog, GET powinien być używany do nawigacji między stronami. Skorzystaj z nawigacji h:outputLink.

Możesz przeczytać jego PostRedirectGetListener, a rozwiąże ona komunikat o ponownym przesłaniu formularza zwrotu/odświeżenia.

radzę Ci dodać następujące beforePhase w celu obsługi częściowe przetwarzanie ajax (jeśli dotyczy):

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