Ответ 1
Это действительно не сработает. После этого вы не сможете передавать "дополнительные" параметры. method-signature
, как вы заявили, должен выполняться в той части, где использовался составной компонент. Например.
<my:button action="#{bean.remove('Somestring')}" />
Реализация составного компонента должна выглядеть так:
<h:commandButton value="Remove" action="#{cc.attrs.removeFieldAction}" />
Если это не то, что вы хотите, и вы действительно хотите передать его со стороны составного компонента, я могу представить два способа передачи дополнительных аргументов: using <f:attribute>
с прослушивателем действий, чтобы передать его как атрибут аттинентального компонента, или <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
.