这确实行不通。之后你不能像那样传递“额外”参数。正如您所声明的method-signature
,必须在使用复合组件的一侧实现。例如
<my:button action="#{bean.remove('Somestring')}" />
复合组件实现应该看起来像这样
<h:commandButton value="Remove" action="#{cc.attrs.removeFieldAction}" />
如果这不是您想要的并且您真的想从复合组件端传递它,那么我可以考虑两种传递额外参数的方法:使用<f:attribute>
动作侦听器将其作为 attidional 组件属性传递,或者<f:setPropertyActionListner>
让JSF 在调用操作之前将其设置为属性。但两者都不是没有复合组件的变化。您需要至少请求整个 bean 作为复合组件的属性。
这是一个例子<f:setPropertyActionListener>
。这会在调用操作之前设置属性。
<composite:interface>
<composite:attribute name="bean" type="java.lang.Object" />
<composite:attribute name="action" type="java.lang.String" />
<composite:attribute name="property" type="java.lang.String" />
</composite:interface>
<composite:implementation>
<h:commandButton value="Remove" action="#{cc.attrs.bean[cc.attrs.action]}">
<f:setPropertyActionListener target="#{cc.attrs.bean[cc.attrs.property]}" value="Somestring" />
</h:commandButton>
</composite:implementation>
这将用作
<my:button bean="#{bean}" action="removeFieldAction" property="someString" />
对于上面的例子,bean 应该看起来像
public class Bean {
private String someString;
public void removeFieldAction() {
System.out.println(someString); // Somestring
// ...
}
// ...
}
如果您遵守特定约定,您甚至可以property
完全省略该属性。