Wie ajax-refresh dynamische Inhalte einschließen, die durch Navigations-Menü? (JSF SPA)
Ich bin nur zu lernen, JSF 2 Dank dieser Seite hatte ich viel gelernt in so kurzer Zeit.
Meine Frage ist in Bezug auf die Implementierung einer gemeinsamen layout auf alle meine JSF 2 Seiten und nur der content-Teil der Seite aktualisieren, nicht die ganze Seite, wenn ich auf einen link/Menü ein anderes panel. Ich bin mit dem Facelets-Ansatz es tut, was ich will, außer dass jedes mal, wenn ich auf einen link aus einem panel (z.B. Menü-items von Links) die ganze Seite aktualisiert wird. Was ich Suche, ist ein Weg zu aktualisieren Sie nur die Inhalte Teil meiner Seite. Um dies zu illustrieren, unten ist mein Ziel pagelayout.
Nicht mein code, da ich nicht sicher bin, ob Facelets kann dies tun . Gibt es andere Ansatz besser geeignet für meine Anforderung andere als Facelets?
InformationsquelleAutor royjavelosa | 2011-08-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein einfacher Ansatz wäre die folgende Ansicht:
Mit dieser bean:
In diesem Beispiel, die tatsächlichen sind Vorlagen sind
include1.xhtml
,include2.xhtml
undinclude3.xhtml
im/WEB-INF/includes
Ordner (Ordner und Speicherort ist völlig frei, nach Ihrer Wahl; die Dateien werden nur in/WEB-INF
um verhindern den direkten Zugriff durch erraten der URL in der browser-Adressleiste).Dieser Ansatz funktioniert in alle MyFaces-Versionen, sondern erfordert ein minimum von Mojarra 2.3.0. Falls Sie mit einem Mojarra ältere version als 2.3.0, dann ist dies alles schlägt fehl, wenn die
<ui:include>
Seite wiederum enthält eine<h:form>
. Jedes postback wird scheitern, denn es fehlt völlig die Sicht Zustand. Sie können dies lösen, indem Sie ein Upgrade auf minimal Mojarra 2.3.0 oder mit einem script, finden Sie in dieser Antwort h:commandButton/h:commandLink funktioniert nicht auf ersten Klick funktioniert nur auf den zweiten Klick, oder wenn Sie bereits mit JSF-utility-Bibliothek OmniFaces, verwenden Sie das entsprechende FixViewState Skript. Oder, wenn Sie bereits mit PrimeFaces und verwenden ausschließlich<p:xxx>
ajax, dann ist es schon transparent berücksichtigt.Stellen Sie außerdem sicher, dass Sie über minimal-Mojarra 2.1.18 Vorhandensein von älteren Versionen wird nicht in zu halten der Blick scoped bean lebendig, sodass die falsche include verwendet wird, während postback. Wenn Sie nicht aktualisieren, dann müssten Sie zurückgreifen, um die unter (relativ ungeschickt) Ansatz bedingt rendering stattdessen die Ansicht der Gebäude bedingt die Ansicht:
Der Nachteil ist, dass die anzeigen werden würde, die relativ groß sind und dass alle zugehörigen managed beans möglicherweise unnötig initialisiert, selbst wenn, Sie würden nicht verwendet werden, wie pro die gerenderten Zustand.
Als um die Positionierung der Elemente, das ist nur eine Frage der Anwendung der richtigen CSS. Dass über den Rahmen der JSF 🙂 zumindest
<h:panelGroup layout="block">
macht eine<div>
, so dass sollte gut genug sein.Nicht zuletzt, SPA (Single Page Application) - Ansatz ist nicht SEO-freundlich. Alle Seiten sind nicht indizierbar durch such-Roboter noch bookmarkable von Endkunden, können Sie brauchen, zu hantieren mit HTML5-history im client und bieten eine server-side-fallback. Außerdem wird im Falle von Seiten mit Formularen, der gleiche Blick scoped bean-Instanz würde wiederverwendet werden, auf allen Seiten, was in der unintuitive scoping Verhalten, wenn Sie navigieren zurück zu einer zuvor besuchten Seite. Ich würde vorschlagen, Sie gehen mit Template-Ansatz statt, wie beschrieben im 2. Teil dieser Antwort: Wie andere XHTML XHTML mit JSF 2.0 Facelets? Siehe auch Wie die Navigation in JSF? Wie man die URL entsprechend der aktuellen Seite (und nicht die Vorherige).
Super Antwort! Dank
Hi,vielen Dank für die fantastische Antwort BalusC. Ich habe ein Formular Einreichen, die in dieser Vorlage wie include1 und ich will gehen, um inklusive 2 durch einen Befehl-Knopf, aber es muss angeklickt werden.Gibt es eine Möglichkeit das zu korrigieren?
href="http://showcase.omnifaces.org/scripts/FixViewState" >showcase.omnifaces.org/scripts/FixViewState
Wie kann ich das nutzen fixviewstate.js für primeface4(<p:commandButton)? Danke.
InformationsquelleAutor BalusC
Wenn Sie nur aktualisieren möchten Teil der Seite, es gibt nur 2 Wege zu gehen (für das web im Allgemeinen, nicht nur JSF). Sie haben die Verwendung von frames oder Ajax. JSF 2 unterstützt ajax nativ, überprüfen Sie heraus das f:ajax-tag-update nur 1 Komponente, ohne Neuladen der gesamten Seite.
stimmt...könnte haben zu spielen, um auch mit entweder wickeln den gesamten Abschnitt in einer form, vs, einschließlich der form, in der ajaxified Abschnitt
Ich war mehr mit Bezug mit
<ui:include src="#{bean.dynamicinclude}" />
syntax. Aus irgendeinem Grund ist der src behoben ist anders während der Wiederherstellung Ansicht von einem postback als es war während der render-response-was wiederum dazu führt, dass das Formular nicht gefunden wird und somit nichts ist, verarbeitet wurden. Aber das könnte auch nur ein Mojarra bug. Ich bin mir nicht sicher. Noch.Interessanterweise habe ich versucht MyFaces 2.1.1 und es wird einfach nicht angezeigt, die gewünschte Dynamik gehören beim Rendern Antwort bereits.
Um Ihnen die Arbeit ui:include src="..." als mit facelets 1.1.x setzen Sie web config param org.apache.myfaces.REFRESH_TRANSIENT_BUILD_ON_PSS zu wahren. Siehe MYFACES-3271 für details.
InformationsquelleAutor GBa
Netbeans enthält einen Assistenten, der die Erstellung des vorgeschlagenen Layouts mit minimalem Aufwand durch JSF. Also, der beste Weg zu beginnen ist, werfen Sie einen Blick auf Facelets-Template-Assistenten und Blick auf die erzeugte Quelle.
Ja,du hast Recht.Netbeans erzeugt nicht Teil. Aber es hat einen schönen Assistenten definieren Sie das layout. Der ajax-Teil offensichtlich muss manuell gemacht werden.Es gibt viele Möglichkeiten, es zu tun, aus mit "gerendert" - Eigenschaft zu verwenden ui:include src="...". Wenn Sie mehrere Formulare auf einer Seite, und Sie müssen zu halten "synchronisiert" das Land, das Sie verwenden können, dieser hack, die auf myfaces: <script type="text/javascript"> Fenster.myfaces = Fenster.myfaces || {}; myfaces.config = myfaces.config || {}; myfaces.config.no_portlet_env = true; </script>MYFACES-3159
InformationsquelleAutor lu4242