Wie kann ich einen JSF-Komponentenwert mithilfe von EL abrufen?

8

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?

    
Arthur Ronald 21.12.2009, 06:34
quelle

3 Antworten

18

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.

%Vor%

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%     
BalusC 21.12.2009, 13:05
quelle
1

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.

    
McDowell 21.12.2009 14:10
quelle
0

Obwohl ich den JSF-Komponentenwert über seine Client-ID abrufen kann, gibt es einige Nachteile wie folgt:

  1. Laut McDowells Antwort ist die Client-ID ein Implementierungsdetail
  2. Die Client-ID kann von der Komponenten-ID abweichen, wenn in der Steuerhierarchie mehr als ein Benennungscontainer vorhanden ist. (JSF im Action Book)

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,

    
Arthur Ronald 27.12.2009 03:19
quelle

Tags und Links