Передать Аргумент в атрибут действия составного компонента
Название действительно говорит обо всем. Я сделал попытку, которая потерпела неудачу с ошибкой:
Illegal attempt to pass arguments to a composite component lookup expression (i.e. cc.attrs.[identifier]).
Моя попытка выглядит так:
<composite:interface>
<composite:attribute name="removeFieldAction" method-signature="void action(java.lang.String)" />
</composite:interface>
<composite:implementation>
<h:commandButton value="Remove" action="#{cc.attrs.removeFieldAction('SomeString')}"/>
</composite:implementation>
Какой правильный способ сделать это?
1 ответ
Это действительно не сработает. Вы не можете передавать "дополнительные" параметры впоследствии, как это. method-signature
как вы заявили, должно выполняться на той стороне, где использовался составной компонент. Например
<my:button action="#{bean.remove('Somestring')}" />
Реализация составного компонента должна выглядеть так
<h:commandButton value="Remove" action="#{cc.attrs.removeFieldAction}" />
Если это не то, что вам нужно, и вы действительно хотите передать его со стороны составного компонента, тогда я могу придумать два способа передачи дополнительных аргументов: использование <f:attribute>
со слушателем действия, чтобы передать его как атрибут компонента attidional, или <f:setPropertyActionListner>
позволить JSF установить его как свойство непосредственно перед тем, как будет вызвано действие. Но ни то, ни другое не обходится без изменений в составном компоненте. Вам потребуется запросить как минимум весь компонент в качестве атрибута составного компонента.
Вот пример с <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" />
В приведенном выше примере бин должен выглядеть так
public class Bean {
private String someString;
public void removeFieldAction() {
System.out.println(someString); // Somestring
// ...
}
// ...
}
Если вы придерживаетесь определенного соглашения, вы можете даже опустить property
атрибут в целом.