Ich habe eine benutzerdefinierte Komponente in JSF 2.0 erstellt
Das Tag sieht so aus:
%Vor%Die entsprechende Java-Klasse:
%Vor%Wenn ich
verwende %Vor% Alles funktioniert wie erwartet, aber wenn ich EL für myTag-Attribute verwende, wird die Methode setName()
niemals aufgerufen. Also für,
Ich erhalte immer null
für die name
Eigenschaft innerhalb meiner encodeBegin
Methode. Nach dem Debuggen ist mir aufgefallen, dass die Methode setName
niemals aufgerufen wird. Ich dachte, dass etwas in Bezug auf EL Dinge vermasselt (und ich glaube immer noch, dass der Grund damit zusammenhängt), aber was wirklich seltsam ist, ist dass die id
Eigenschaft gut funktioniert: der Setter wird aufgerufen, und der Wert ist wie erwartet Die Prüfung beginnt.
Ich muss erwähnen, dass wenn ich getAttributes().get("name")
von der Methode encodeBegin
aufruft, bekomme ich den korrekten Namen Wert, aber ich bin fasziniert, warum es nicht mit Getter und Setter funktioniert.
Irgendwelche Ideen, was meiner Komponente fehlt?
Dieses Verhalten wird erwartet und nach Spezifikation. Attributwerte, die Wertausdrücke sind, werden von UIComponent#setValueExpression()
. Sie sollen nämlich nur dann ausgewertet werden, wenn sie wirklich verwendet werden, normalerweise während der Renderzeit der Ansicht.
Das Attribut id
(und binding
) hat eine spezielle Behandlung: Es wird während der Aufbauzeit ausgewertet, bevor es gesetzt wurde, also würde der "reguläre" Setter anstelle von% co_de aufgerufen werden % (weil das Rendern der Ansicht andernfalls abstürzen würde, wenn das Attribut setValueExpression()
(oder id
) dynamisch aus anderen Gründen einen anderen Wert als während der Ansichtsgenerierungszeit auswertet).
Besser ist es, die Getter / Setter zu zu delegieren binding
anstelle von lokalen Eigenschaften. Das UIComponent#getStateHelper()
endet schließlich auch in setValueExpression()
(beachten Sie, dass es den Setter überhaupt nicht aufruft; rufen Sie einfach den Getter, wenn Sie die Daten benötigen) und das StateHelper
löst auch die Werte von getAttributes()
.
Beachten Sie, dass Sie die Methoden StateHelper
und getId()
sicher entfernen können, da sie bereits in der übergeordneten Klasse setId()
definiert sind.
Tags und Links attributes jsf jsf-2 custom-component