JSF2: передача метода в выражении EL - PullRequest
0 голосов
/ 15 сентября 2011

возможно ли передать метод в выражении EL?

У меня есть один боб и два представления. Во втором представлении есть кнопка, но какой метод запуска кнопки должен быть определен первым представлением. Поэтому я должен сказать второму представлению метод, при котором я связываю с первого представления.

Я представляю что-то вроде этого:

Первый просмотр:

<h:link outcome="secondView.xhtml" value="Second view with method A">
    <f:param name="methodToCall" value="#{bean.methodA}">
</h:link>
<h:link outcome="secondView.xhtml" value="Second view with method B">
    <f:param name="methodToCall" value="#{bean.methodB}">
</h:link>

Второй вид:

<h:commandButton action="#{methodToCall}" value="Call the method" />

Ответы [ 3 ]

3 голосов
/ 15 сентября 2011

Нет, это невозможно. Тем не менее, вы можете вызывать динамические методы bean-компонента, используя обозначение скобки [].

<h:link outcome="secondView.xhtml" value="Second view with method A">
    <f:param name="methodToCall" value="methodA">
</h:link>
<h:link outcome="secondView.xhtml" value="Second view with method B">
    <f:param name="methodToCall" value="methodB">
</h:link>

с

<h:commandButton action="#{bean[param.methodToCall]}" value="Call the method" />

Если bean-компонент также должен быть динамическим, вам придется отдельно передавать имя bean-компонента и знать его область действия.

<h:link outcome="secondView.xhtml" value="Second view with method A">
    <f:param name="beanToCall" value="bean">
    <f:param name="methodToCall" value="methodA">
</h:link>
<h:link outcome="secondView.xhtml" value="Second view with method B">
    <f:param name="beanToCall" value="bean">
    <f:param name="methodToCall" value="methodB">
</h:link>

с

<h:commandButton action="#{requestScope[param.beanToCall][param.methodToCall]}" value="Call the method" />
0 голосов
/ 15 сентября 2011

Я не думаю, что есть способ сделать это в JSF.Мое предложение состояло бы в том, чтобы вызов из первого представления выбрал делегата в компоненте поддержки, который вызывается при щелчке по действию из второго представления.

Примерно так:

public class Bean {

    public interface Delegate {
        void doSomething();
    }

    public class MethodADelegate implements Delegate {
        public void doSomething() {

        }
    }

    public class MethodBDelegate implements Delegate {
        public void doSomething() {

        }
    }

    private Delegate delegate;

    public String methodA() {
        this.delegate = new MethodADelegate();
        return "view2";
    }

    public String methodB() {
        this.delegate = new MethodBDelegate();
        return "view2";
    }

    public String view2Call() {
        delegate.doSomething();
        return "done";
    }
}

<h:commandLink action="#{bean.methodA}" value="Second view with method A" />
<h:commandLink action="#{bean.methodB}" value="Second view with method B" />

<h:commandButton action="#{bean.view2Call}" value="Call the method" />
0 голосов
/ 15 сентября 2011

Да, это возможно.Вот описание атрибута action:

MethodExpression, представляющее действие приложения, которое вызывается, когда этот компонент активируется пользователем.Выражение должно вычисляться для открытого метода, который не принимает параметров и возвращает объект (toString () которого вызывается для получения логического результата), который передается в NavigationHandler для этого приложения.

...