Wie Kriege ich eine JSF-Komponente-Wert mithilfe der EL?
Bevor, finden Sie diese Frage
Es ist JSF-Formular wird wieder angezeigt wie folgt:
<f:view>
<h:form>
<div>
<label>Id</label>
<input type="text" name="accountId"/>
</div>
<div>
<label>Amount</label>
<input type="text" name="amount"/>
</div>
<h:commandButton value="Withdraw" action="#{accountService.withdraw(param.accountId, param.amount)}"/>
</h:form>
</f:view>
Beachten Sie, dass ich verwendet habe <input type="text" name="amount">
statt <h:inputText id="amount">
. , Um seinen Wert abruft durch die Verwendung von Naht-EL-resolver, ich benutze param.amount
.
Passiert es, dass wenn ich <input type="text"
und etwas schief geht, auf der server-Seite, ich muss die Seite erneut. So Ihr übermittelten Wert nicht abgerufen werden, denn es ist eine Reine html-code. Weil ich brauchen, um eine <h:inputText
JSF-Komponente statt.
Die Frage ist also: Wie Kriege ich eine <h:inputText
JSF-Komponente Wert durch die Verwendung von Expression Language?
- Um zu beginnen, Ihre Frage war ziemlich verwirrend. Es so Aussehen, dass der Naht-Geschichte ist hier völlig irrelevant. In Zukunft poste bitte die JSF-code, den Sie wirklich haben und zu sagen, was genau Sie tun möchten, mit Ihrer - code.
- Das macht auch keinen Sinn. In plain JSP/Servlet, die Sie benutzt haben könnte
<input type="text" name="foo" value="${param.foo}">
für, die. - Ich empfehle dringend, um sich selbst durch eine anständige JSF-Buch/tutorial zu verstehen, wie JSF-Werke "unter den Hauben". Auch das lernen "plain-vanilla" JSP/Servlet, das würde helfen, eine Menge in Verständnis es. Du machst Annahmen und versuchen, Sie zu brechen, JSF Ideologie, indem alle seine arbeiten über in Ihren eigenen Händen. Sorry, wenn ich Klinge hart, aber das ist die Wahrheit.
- Sie sagte: Du machst Annahmen und versuchen, Sie zu brechen, JSF Ideologie, indem alle seine arbeiten über in Ihren eigenen Händen. Sorry, aber ich bin nicht Annahme. Wenn die Naht unterstützt, bietet die parametrisierte Methode, bindende und ich können dieses feature verwenden, was ist falsch ?
- Oh man sind mit Naht? Ich eine Antwort, die nicht die Naht Weg, aber dann waren Sie kommentieren, die Sie brauchen
FacesContext.getApplication().SOMETHING
? Dies ist nur Verwirrung in Hülle und fülle. - Wie Sie wissen BalusC, Es gibt eine implizite facesContext-Objekt: Das FacesContext-Instanz für den aktuellen request. Ok. Also ich denke, dass ich abrufen kann, eine Komponente festlegen, indem Sie das implizite Objekt. Sonst nichts.
- Ja das kenne ich. Aber der ganze Ansatz ist in meinen Augen schlicht fehlerhaft, und Ihre Frage war nicht so formuliert sehr klar.
- Obwohl ich Englisch Lesen sehr gut, ich habe einige Einschränkungen beim schreiben in englischer Sprache - ich bin ein nicht-Englisch-Muttersprachler. So fühlen sich frei zu Bearbeiten, meine eigenen Frage/Antwort-wenn notwendig - Sie haben mehr als 10k Ruf. Sorry Missverständnis.
Du musst angemeldet sein, um einen Kommentar abzugeben.
JSF-client-ID ' s sind vorangestellt die Clients-ID der übergeordneten
UINamingContainer
Komponenten (z.B.h:form
,h:dataTable
,f:subview
). Wenn Sie die generierten HTML-Quelle in Ihrem webbrowser (Rechtsklick, Quelltext anzeigen), dann sollte man Sie sehen. Dieid
undname
des generierten input-Elemente vorangestellt, mit derid
des übergeordneten Formulars. Sie müssen den gleichen Namen verwenden wie Taste in der parameter-map. Als Trennzeichen der Doppelpunkt:
, ist eine "illegale" Zeichen in der EL, müssen Sie die Nutzung der Klammer-notationparam['foo:bar']
um Sie abzurufen.Ohne Naht-EL-wie die Parameter der Methode (die Sie scheinbar nicht wollen/haben), können Sie auch greifen Sie in die request-parameter-map mit der client-ID, die als Schlüssel:
Unnötig zu sagen, das ist böse. Nur tun es die normalen JSF Weise binden Sie die Werte mit den bean-Eigenschaften.
Edit: wie pro die Letzte Frage, die Sie bearbeitet haben:
Dies ist bereits beantwortet, bevor Sie. Verwenden Sie die JSF-generiert name als parameter-name. Dies ist in der Regel in der Struktur der
formId:inputId
woformId
ist dieid
des übergeordnetenUIForm
Komponente und dieinputId
ist dieid
desUIInput
Komponente. Überprüfen Sie die generierten HTML-Ausgabe für die genauen Namen der generierten<input type="text">
Feld. Erhalten Sie den Wert des Parameters verwenden Sie die Klammer-notation['name']
, weil Sie nicht den Doppelpunkt:
in EL wie in${param.formId:inputId}
.Also:
h:inputText
im JSF-Seite und nicht<input>
? Auf diese Weise Sie brauchen, um es zu geben, (und das übergeordnete Formular) einid
und Holen Sie sich die param mit dem generierten client-ID als Schlüssel. Ich werde Bearbeiten meine Antwort bald.System.out.println(requestParameterMap);
so dass Sie sehen können, und die Muster?clientId
ist eine Implementierung detail (JSF 2 ändern: hiermit ändern Sie das Trennzeichen, zum Beispiel).Den parameter-Namen/ids für
inputText
sind gekapselt werden, durch die Kontrolle renderer und sind letztlich eine Implementierung detail. In der Praxis verwenden Sie dieclientId
. Es sollte keine müssen Lesen Sie diese direkt aus dem parameter anzeigen; die Verwendung von " Wert-Bindung auf, schieben Sie Sie in das Modell und Lesen Sie Sie von dort.Lesen Sie die Werte direkt von der Komponente über EL durch Bindung der Komponente an eine managed bean. Für Einfachheit, hier ist einer, der an die Anfrage Anwendungsbereich:
Aber, im Allgemeinen, es gibt keinen Vorteil, um diese über:
Zur Vermeidung der Verschmutzung der Anfrage anzeigen (das dazu führen könnte, dass Kollisionen über Ansichten), verwenden Sie eine verwaltete bean namespace/Kapseln Ihre Werte, anstatt den request-scope direkt.
Kann ich zwar abrufen, JSF Komponente Wert durch seine client-identifier, gibt Es einige Nachteil wie folgt:
Also, wenn Sie nicht wollen, verlassen sich auf den client-identifier, können Sie die Implementierung Ihrer eigenen ElResolver wie folgt:
Jetzt kann ich mit etwas wie (Ankündigung zurückzutreten Methode)
view ist eine implizite JSF-Objekt (ähnlich FacesContext.getCurrentInstance().getViewRoot())
Dann registrieren Sie Ihr ELResolver, wie unten gezeigt (faces-config.xml)
Wenn Sie wissen möchten, einen guten Einblick über ElResolver sehen Erweiterung der Java EE-Unified Expression Language, die eine Benutzerdefinierte ELResolver
Grüße,