JSF 2 - Anzeigen Parameter-Validierung und-Umleitung
Sind wir mit JSF 2 + Primefaces + Glassfish + CDI/WELD für die Entwicklung.
Wir haben ein datalist - /dataTable-Buch Angebote auf unserer Suche.xhtml-Seite, die jeweils so dargestellt, als einen outputLink. Auf Klick auf einen Eintrag Ansicht.xhtml angezeigt wird, mit all den Buch-details. Dies ist der code, der in unserer Suche.xhtml, die aufgerufen wird:
<h:outputLink value="${request.contextPath}/viewBook.xhtml?id=${book.id}">${book.title}
</h:outputLink>
In der viewBook.xhtml, basierend auf dem Buch-Id an die URL übergeben, die details sind aufgefüllt, die vor dem Rendern der Seite wie folgt:
<f:metadata>
<f:viewParam name="id" value="#{bookBean.id}"/>
</f:viewParam>
<f:event type="preRenderView" listener="#{bookBean.populate}" />
</f:metadata>
Unsere Anforderung ist zu überprüfen die Id vor dem Rendern der Seite und, wenn nicht in unserer DB ist, müssen wir umleiten auf eine Fehlerseite oder zeigen die Fehler msg auf der gleichen Seite, d.h. der Seite suchen
Versuchten wir überprüfen die Buch-Id in zwei verschiedenen Arten:
1. Mit der Validierung in den füllen-Methode wie folgt
if (bookFound)
{
//Display details
}
else
{
FacesContext fc = FacesContext.getCurrentInstance();
fc.addMessage("id", new FacesMessage("No such book found in the system. Please try again."));
fc.renderResponse();
}
-
Durch Einhaken eine benutzerdefinierte validator-in den Blick.xhtml und warf einen validator Ausnahme (Flächen-Nachricht) auf dem Bildschirm. Wir nutzen CDI-SCHWEIßEN, so dass wir verwenden können-Injektion.
<f:metadata> <f:viewParam name="id" value="#{bookBean.id}"/> <f:validator validatorId="bookIdValidator"/> </f:viewParam> <f:event type="preRenderView" listener="#{bookBean.populate}" /> </f:metadata>
Diese beiden Ansätze funktionieren, sondern Sie zeigen die Fehler auf dem Bildschirm, nicht die Suche-Bildschirm. Es ist möglich, umleiten auf eine Fehlerseite mit dem code:
FacesContext.getCurrentInstance().getExternalContext().redirect("/error.xhtml");
- Ist es ein Weg zur Abwicklung der Validierung, so dass die Fehlermeldungen angezeigt werden auf der Seite suchen, wo die outputLink geklickt wird. Wir verstehen, dass wir brauchen, um zu behandeln, die Validierung auf der Suche Seite, aber wie kann man assoziieren ein validator mit dem h:outputLink. Kann man mit h:link alternativ (Wir verwenden müssen, um GET-Anfragen nicht POSTEN..so mit ein commmandLink oder-Taste ist nicht möglich)
-
Gibt es eine bessere Möglichkeit die Umleitung auf eine Fehlerseite, als wir es tun.
(FacesContext.getCurrentInstance().getExternalContext().redirect("/Fehler.xhtml");)
Alle Zeiger wäre sehr dankbar.
Dank und Grüße
Du musst angemeldet sein, um einen Kommentar abzugeben.
gkari,
Können Sie JSF verwenden für die navigation? Ich bin nicht vertraut mit SCHWEIßNAHT, sondern eine Reine JSF Lösung könnte wie folgt funktionieren. Dies setzt Voraus, Sie haben eine backing-bean genannt bookBean. Es sollte eine Eigenschaft, die man als
id
mit einem getter (getId
) und setter (setId
).Erstellen Sie eine leere Methode in der backing-bean. Es muss keine Parameter und gibt einen String zurück.
Ändern Sie Ihre
h:outputLink
zu einemh:commandLink
, die nennt sich die neue Methode:Aktualisieren Sie die Verknüpfung mit einer Aktion bookBean ist
id
- Eigenschaft, wenn der link aktiviert wird:Update die neue Methode in der backing bean zu tun, die erforderlichen Validierungs -, und gibt einen string zurück, der Erfolg oder Misserfolg:
Erstellen Sie die navigation-Regeln in die faces-config.xml das weiterleiten an die richtige Ziel-je nach Ergebnis-code:
Dies ermöglicht es der backing bean zu zeigen das Ergebnis für JSF und JSF-Bibliothek behandelt die Umleitung an den entsprechenden Speicherort.
Es klingt wie das problem, das Sie haben ist, dass Sie erstellen eine FacesMessage auf der einen Seite noch haben wollen, ist es angezeigt, auf einem anderen. Sie benötigen zum verstauen der FacesMessage in der Benutzer-session (oder ggf. eines kürzeren lebte Umfang, wenn vorhanden) und ziehen Sie Sie dann heraus auf die Seite, in der Sie es wollen angezeigt.
Gibt es einige versuche zur Automatisierung dieses:
Es ist ein Flash-scope in JSF 2 und eine Methode setKeepMessages. Sie können versuchen, diese, aber ich hatte noch nicht viel Glück mit ihm.
Es ist copy-und-paste-phase-listener Lösung hier diskutiert: http://ocpsoft.com/java/persist-and-pass-facesmessages-over-page-redirects/
Meldungen über Umleitungen ist auch ein Merkmal der Naht 3.