2012-09-22 22 views
7

Ich benutze JSF 2 mit PrettyFaces und auch die <h:link> und <f:param> Tags ausgiebig, um Lesezeichen-Seiten zu bekommen (Es ist toll, endlich alle diese POST-Anfrage in einer JSF-Anwendung zu vergessen).Refreshing URL mit JSF Ajax Anfrage

Einige dieser Links ändern jedoch nur einen kleinen Teil der Seite (hauptsächlich, wenn der Benutzer in der gleichen Ansicht bleibt), also ist es schöner, stattdessen Ajax-Anfragen zu senden. <f:ajax> kann jedoch nicht mit <h:link>, nur <h:commandlink> verwendet werden. Ich kann auch viele Parameter über einen Befehlslink senden, aber in diesem Fall bleibt die URL nach der Anfrage gleich. Es wird also nicht mehr mit dem Inhalt der Seite synchronisiert und kann nicht aktualisiert werden.

Ich habe Websites gesehen, die Links verwenden, die eine Mischung aus GET- und ajax-Anfragen senden (auf eine neue URL zeigen, während ich die Seite mit Ajax ändere), aber bisher habe ich keine Lösung gefunden.

Kann ich irgendwie die URL mit jsf aktualisieren, nachdem die Ajax-Anfrage abgeschlossen ist (oder wenn der Benutzer klickt)? Oder muss ich eine externe JS-Bibliothek verwenden?

BEARBEITEN: Die JS-Bibliothek, die hier benötigt wird, ist die neue JavaScript History API. More info. Ich denke, JSF verwendet diese API derzeit nicht. Aber ich bin aus der Sicht eines JSF-Entwicklers immer noch an diesem Thema interessiert.

Ist auch eine zukünftige Version von JSF geplant? Die Kombination <f:ajax> mit <h:link> wäre eine perfekte Lösung.

+0

Ich habe es vor ein paar Monaten für OmniFaces betrachtet. Das ist leider nicht billig/trivial. Die gleiche geänderte URL sollte in der Lage sein, genau den gewünschten JSF-Ansichtszustand zurückzugeben, einschließlich aller Ajax-Änderungen, die von Postbacks durch eine einzige einfache GET-Anfrage ausgeführt werden. Alle notwendigen Informationen, um dies in einer anwendungsweiten (sitzungsunabhängigen) Weise zu erreichen, machen die GET-URL sehr lang. Es gibt Möglichkeiten, die URL zu kürzen, aber immer noch ... Und dann nehme ich noch nicht die Besonderheiten der Komponentenbibliothek in Betracht. – BalusC

+0

Vielen Dank für die Antwort. Ich verstehe es jedoch nicht vollständig. Ich denke, es sollte die Verantwortung des Entwicklers sein, eine URL zu setzen, die genau die gleiche Seite zurückgibt, wenn sie aktualisiert wird - die Ansichten sollten die Anfrageattribute usw. bearbeiten. Tatsächlich habe ich das schon getan, da '' einen non-ajax GET Link generiert - Ich möchte nur eine Ajax Anfrage senden und die URL auf die zuvor von '' generierte URL setzen. Es könnte '' oder irgendetwas anderes sein, der Punkt ist, dass es so funktionieren sollte. – apcuk

+0

Wenn der Zweck reine Seiten-zu-Seite-Navigation ist, dann wäre es tatsächlich einfacher zu implementieren. Aber die '' wird im Allgemeinen für viele andere nützlichere Dinge als nur Navigation verwendet. * Dieser * Teil ist dann nicht trivial. – BalusC

Antwort

-1

<f:ajax> hat Attribut onevent. Es nimmt den Namen der javascript Funktion, die nach ajax request erfolgreich beendet wird. So ist es möglich, die Funktion js hinzuzufügen, die nach Beendigung des Ajax-Aufrufs zur gewünschten URL navigiert. Etwas wie:

 <h:commandLink id="testButton" 
         value="Test"> 
      <f:ajax event="action" 
        execute="@form" 
        render="@none" 
        listener="#{myBean.testButtonClickedHandler}" 
        onevent="navigate"/> 
     </h:commandLink> 

<script type="text/javascript"> 
    function navigate() { 
     window.location.href = "required url"; 
    } 
</script>