我正在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?
答案 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}"/>