如何将操作字符串传递给JSF 2复合组件?

时间:2010-05-17 18:33:24

标签: jsf jsf-2 action composite-component

我正在JSF 2中创建一个简单的菜单复合组件。但是,我无法将String属性传递给复合组件以在< h:commandLink>的action属性中使用。我的组件看起来像:

<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>

如何在&lt; h:commandLink&gt;的action属性中获取操作String?

2 个答案:

答案 0 :(得分:23)

看起来这吸引了Horstmanns :-)

您必须将属性命名为“action”并使用重定向。然后在

中以精致的清晰度(不是)描述了一些特殊处理

http://docs.oracle.com/javaee/6/javaserverfaces/2.0/docs/pdldocs/facelets/composite/attribute.html

以及我不允许粘贴其链接的ViewDeclarationLanguage.retargetMethodExpressions(而不是ViewHandler)的API文档。

这是你如何做到的。

<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>

答案 1 :(得分:1)

您需要将属性的类型定义为这样的方法:

<composite:attribute name="view" method-signature="java.lang.String f()"/>

或者,某些属性名称在jsf中专门处理。因此,如果您将属性命名为“action”,那么它也应该没有方法签名:

<composite:attribute name="action"/>

修改:我可能误解了这个问题,如果您想在不调用操作的情况下链接到视图ID,则可以使用h:link代码而不是h:commandLink:< / p>

<h:link outcome="#{cc.attrs.view}" value="#{cc.attrs.title}"/>