Bevor Sie fortfahren, lesen Sie Frage
Es ist JSF Form wird wieder wie folgt angezeigt:
%Vor% Beachten Sie, dass ich <input type="text" name="amount">
anstelle von <h:inputText id="amount">
verwendet habe. Um den Wert mithilfe des Seam EL-Resolvers abzurufen, verwende ich param.amount
.
Wenn ich <input type="text"
benutze und etwas auf der Serverseite schief geht, muss ich die Seite erneut anzeigen. Daher wird der übergebene Wert nicht abgerufen , da es sich um einen einfachen HTML-Code handelt. Aus diesem Grund muss ich stattdessen eine <h:inputText
JSF-Komponente verwenden.
Die Frage lautet also: Wie kann ich einen <h:inputText
JSF-Komponentenwert mithilfe der Ausdruckssprache abrufen?
Den JSF-Client-IDs wird die Clientid-ID der übergeordneten UINamingContainer
-Komponenten vorangestellt (z. B. h:form
, h:dataTable
, f:subview
). Wenn Sie die generierte HTML-Quelle in Ihrem Webbrowser überprüfen (Rechtsklick, Quelltext anzeigen), sollten Sie sie sehen. Die id
und name
der generierten Eingabeelemente werden mit dem id
des Elternformulars vorangestellt. Sie müssen denselben Namen als Schlüssel in der Parameterzuordnung verwenden. Da das Trennzeichen, der Doppelpunkt :
, ein "illegales" Zeichen in EL ist, müssen Sie die Klammernotation param['foo:bar']
verwenden, um sie abzurufen.
Ohne Seam-EL-ähnliche Methodenparameter (die Sie anscheinend nicht haben wollen / haben), können Sie sie auch in der Anforderungs-Parameterzuordnung mit den Client-IDs als Schlüssel aufrufen:
%Vor%Ich brauche nicht zu sagen, dass das böse ist. Machen Sie einfach die normale JSF-Methode, binden Sie die Werte mit den Bean-Eigenschaften.
Bearbeiten: gemäß der letzten Frage, die Sie bearbeitet haben:
Die Frage ist also: Wie erhalte ich einen
<h:inputText
JSF-Komponentenwert mit Expression Language?
Dies ist bereits zuvor beantwortet. Verwenden Sie den JSF-generierten Namen als Parameternamen. Dies entspricht normalerweise dem Muster von formId:inputId
, wobei formId
der id
der übergeordneten UIForm
-Komponente und% inputId
der id
der UIInput
-Komponente ist. Überprüfen Sie die generierte HTML-Ausgabe auf den genauen Namen des generierten <input type="text">
-Feldes. Um den Parameterwert zu erhalten, verwenden Sie die geschweifte Schreibweise ['name']
, da Sie den Doppelpunkt :
in EL nicht wie in ${param.formId:inputId}
verwenden können.
Also:
%Vor% Die Parameternamen / IDs für inputText
werden vom Steuer-Renderer gekapselt und sind letztlich ein Implementierungsdetail. In der Praxis verwenden sie die clientId
. Es sollte nicht notwendig sein, diese direkt von der Parameterkarte zu lesen; Verwenden Sie Wertbindung, um sie in das Modell zu schieben und sie von dort zu lesen.
Sie können Werte direkt aus der Komponente mit EL lesen, indem Sie die Komponente an eine verwaltete Bean binden. Der Einfachheit halber ist hier eine an den Anforderungsbereich gebunden:
%Vor%Aber im Allgemeinen gibt es keinen Vorteil gegenüber:
%Vor%Um zu vermeiden, dass die Anforderungszuordnung verschmutzt wird (was zu Kollisionen zwischen Sichten führen kann), verwenden Sie eine verwaltete Bean, um den Namespace einzukapseln und die Werte nicht direkt zu verwenden.
Obwohl ich den JSF-Komponentenwert über seine Client-ID abrufen kann, gibt es einige Nachteile wie folgt:
Wenn Sie sich also nicht auf die Client-ID verlassen wollen, können Sie Ihren eigenen ElResolver wie folgt implementieren:
%Vor%Jetzt kann ich etwas wie (Hinweis zurückziehen-Methode)
verwenden %Vor%view ist ein implizites JSF-Objekt (ähnlich wie FacesContext.getCurrentInstance (). getViewRoot ())
Dann registrieren Sie Ihren ELResolver wie unten gezeigt (faces-config.xml)
%Vor%Wenn Sie einen guten Einblick in ElResolver erhalten möchten, lesen Sie Erweitern des Java EE Unified Expression Sprache mit einem benutzerdefinierten ELResolver
Grüße,
Tags und Links binding components jsf seam