是否可以在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" />
答案 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" />