I'm creating a simple menuing composite component in JSF 2. However, I am unable to pass a String attribute into the composite component to use in the action attribute of the <h:commandLink>. My component looks like:
<composite:interface>
<composite:attribute name="title" required="true" type="java.lang.String"/>
<composite:attribute name="view" required="true" />
</composite:interface>
<!--implementation-->
<composite:implementation>
<li><h:commandLink action="#{cc.attrs.view}" value="#{cc.attrs.title}" /></li>
</composite:implementation>开发者_如何学Python;
How can I get an action String into the action attribute of the <h:commandLink>?
Looks like this attracts the Horstmanns :-)
You must name the attribute "action" and use retargeting. Then some special handling kicks in that is described with exquisite clarity (not) at
http://docs.oracle.com/javaee/6/javaserverfaces/2.0/docs/pdldocs/facelets/composite/attribute.html
and the API doc of ViewDeclarationLanguage.retargetMethodExpressions (not ViewHandler) whose link I am not allowed to paste in.
Here is how you do it.
<composite:interface>
<composite:attribute name="title" required="true" type="java.lang.String"/>
<composite:attribute name="action" targets="view" required="true" />
</composite:interface>
<!--implementation-->
<composite:implementation>
<li><h:commandLink id="view" value="#{cc.attrs.title}" /></li>
</composite:implementation>
You need to define the type of the attribute to be a method like this:
<composite:attribute name="view" method-signature="java.lang.String f()"/>
Or alternatively, some attribute names are handled specially in jsf. So if you name your attribute "action" it should also work without the method-signature:
<composite:attribute name="action"/>
Edit: I probably misunderstood the question, if you want to link to a view id without calling an action you can use the h:link
tag instead of h:commandLink
:
<h:link outcome="#{cc.attrs.view}" value="#{cc.attrs.title}"/>
精彩评论