JSF2:在EL表达式中传递方法

时间:2011-09-15 08:56:40

标签: java jsf-2 el

是否可以在EL表达式中传递方法?

我有一个bean和两个视图。第二个视图有一个按钮,但按钮触发的方法应由第一个视图定义。所以我必须告诉第二个视图我从第一个视图链接的方法。

我想象这样的事情:

第一视图:

<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 个答案:

答案 0 :(得分:3)

不,那是不可能的。但是,您可以使用大括号表示法[]来调用动态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" />

答案 1 :(得分:0)

是的,这是可能的。以下是action属性的说明:

  

MethodExpression表示要调用的应用程序操作   该组件由用户激活。表达式必须评估   到不带参数的公共方法,并返回一个Object   (调用toString()以获取逻辑结果)   传递给此应用程序的NavigationHandler。

答案 2 :(得分:0)

我认为在JSF中没有办法做到这一点。我的建议是让第一个视图中的调用选择一个委托bean中的委托,当从第二个视图中单击动作时调用该委托。

像这样的东西

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" />