Передайте Аргумент в атрибут действия составного компонента - PullRequest
13 голосов
/ 15 июня 2011

Название действительно говорит само за себя. Я сделал попытку, которая не удалась с ошибкой:

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 Ответ

32 голосов
/ 15 июня 2011

Это действительно не сработает. Вы не можете передавать «лишние» параметры впоследствии, как это. 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.

...