Mit id-Attribut in JSF 2 zusammengesetzte Komponente mit Zielen
Ich versuche zum erstellen einer JSF 2.1 zusammengesetzte Komponente für eine Schaltfläche:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich"
xmlns:c="http://java.sun.com/jstl/core">
<composite:interface>
<composite:attribute name="id" required="true" type="java.lang.String" />
<composite:attribute name="label" required="true" type="java.lang.String" />
<composite:attribute name="action" method-signature="java.lang.String action()" targets="#{cc.attrs.id}" />
</composite:interface>
<composite:implementation>
<a4j:commandLink id="#{cc.attrs.id}">
<span style="linkButton"><h:outputText value="#{cc.attrs.label}" /></span>
</a4j:commandLink>
</composite:implementation>
</html>
Ich habe ein problem mit diesem code ist, gibt es folgende Ausnahme, wenn die Seite gerendert wird:
java.lang.ClassCastException: javax.faces.component.UINamingContainer cannot be cast to javax.faces.component.ActionSource2
at com.sun.faces.application.view.FaceletViewHandlingStrategy$MethodRetargetHandlerManager$ActionRegargetHandler.retarget(FaceletViewHandlingStrategy.java:1536)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.retargetMethodExpressions(FaceletViewHandlingStrategy.java:689)
at com.sun.faces.facelets.tag.jsf.CompositeComponentTagHandler.applyNextHandler(CompositeComponentTagHandler.java:201)
at org.richfaces.view.facelets.html.BehaviorsAddingComponentHandlerWrapper.applyNextHandler(BehaviorsAddingComponentHandlerWrapper.java:53)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:196)
...
Wenn ich ersetzen Sie die #{cc.attrs.id}
im id
und targets
Attribut mit einem definierten String wie myId
dann die Komponente funktioniert wie erwartet aber das macht es nicht wieder auf der gleichen Seite und damit entfällt der komplette Einblick in die Erstellung einer composite component, in den ersten Platz.
Hab ich was verpasst hier?
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der JSF-komponentenbaum, der
#{cc.attrs.id}
ist bereits von<cc:implementation>
selbst. Du sollst nicht erneut verwendet ID der Komponente auf eine andere Komponente. Ihre konkrete funktionale Anforderung ist unklar, die Beschwerde "nicht wieder auf der gleichen Seite" macht wirklich keinen Sinn, wie es funktioniert einwandfrei (habe Sie eigentlich versuchte es und untersuchten die erzeugten HTML-Ausgabe?), so ist es schwer zu verstehen, welches problem genau Sie vor. Vielleicht haben Sie völlig übersehen, dass die composite-Komponenten Erben implizit vonNamingContainer
- und schon stellen Sie Ihre eigene id die der Kinder, wie<h:form>
,<h:dataTable>
etc auch tun?Wenn deine einzige Anforderung ist die Möglichkeit, die Referenz der composite-Komponente von außen durch ajax als in
<f:ajax render="compositeId" />
, dann müssen Sie wickeln den Körper der<cc:implementation>
in eine plain-vanilla-HTML<span>
oder<div>
wie folgt mit den#{cc.clientId}
statt:Siehe auch:
NamingContainer
- und es-ids werden verwendet als Präfix. Ich denke, ich sollte einen Blick auf das HTML-Ergebnis mehr oft. Aber irgendwie war ich auch der Hoffnung, dass ich könnte (von der Anrufer-Seite) definieren eine eindeutige id für diecommandLink
selbst (ohne Präfixe) zu erleichtern, die Entwicklung von arquillian tests. Aber aus einer anderen Antwort von Ihnen sehe ich, dass so etwas wieprependId="false"
ist nicht möglich für composite-Bauteile."button"
sowohl für die benutzerdefinierte Komponente tag in der Anrufer die passenden und diecommandLink
und dietargets
in der benutzerdefinierten Komponente die Ausnahme von oben wird auch ausgegeben, wenn die letzten id descommandLink
konstruiert werden sollte als"formId:button:button"
AFAIK.