How to pass a action string into a JSF 2 composite component?

此生再无相见时 提交于 2019-11-30 05:07:29
cayhorstmann

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}"/>
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!