动态JSF(2.0)commandButtons-使用参数设置操作

动态JSF(2.0)commandButtons-使用参数设置操作,jsf,dynamic,jsf-2,action,Jsf,Dynamic,Jsf 2,Action,我正在尝试将JSF动态添加到我的网页中,目前为止,我已经将它们显示出来,但我无法像在静态页面中那样使用参数设置操作: action=“#{bean.function(parameter)}”。(这当然是使用EL-2.2) 环顾四周,我发现我必须创建一个MethodExpression,但这对我来说并不清楚,而且我还没有找到关于这方面的很多信息。如果有人能在雾中发光并解释如何做到这一点,我们将不胜感激 编辑:现在我有了这个 使用 然后可以按如下方式创建: createMethodExpressi

我正在尝试将JSF
动态添加到我的网页中,目前为止,我已经将它们显示出来,但我无法像在静态页面中那样使用参数设置操作:
action=“#{bean.function(parameter)}”
。(这当然是使用EL-2.2)
环顾四周,我发现我必须创建一个
MethodExpression
,但这对我来说并不清楚,而且我还没有找到关于这方面的很多信息。如果有人能在雾中发光并解释如何做到这一点,我们将不胜感激

编辑:现在我有了这个

使用

然后可以按如下方式创建:

createMethodExpression("#{bean.submit1}", null);
createMethodExpression("#{bean.submit2}", String.class);
createMethodExpression("#{bean.submit3('foo')}", null, String.class);
createMethodExpression("#{bean.submit4('foo')}", String.class, String.class);
createMethodExpression("#{bean.submit5('foo', 0)}", null, String.class, Long.class);
createMethodExpression("#{bean.submit6(0, 'foo')}", String.class, Long.class, String.class);
请注意,EL表达式与在普通视图文件中使用的表达式完全相同


更新这里有一个SSCCE,它在Tomcat 7.0.27上的Mojarra 2.1.12中运行良好


所以问题12098611
@ManagedBean
@请求范围
公共类Bean{
私人UIForm;
公共无效添加(){
String id=“button”+form.getChildCount();
UICommand按钮=新的HTMLCommand按钮();
按钮。设置id(id);
按钮设置值(id);
setActionExpression(createMethodExpression(String.format(“#{bean.submit(“%s”)}”,id),null,String.class));
form.getChildren().add(按钮);
}
公共作废提交(字符串参数){
System.out.println(“提交:+arg”);
}
公共UIForm getForm(){
申报表;
}
公共无效集合表格(UIForm表格){
this.form=形式;
}
公共静态MethodExpression createMethodExpression(字符串表达式、类returnType、类…参数类型){
FacesContext FacesContext=FacesContext.getCurrentInstance();
返回facesContext.getApplication().getExpressionFactory().createMethodExpression(
facesContext.getELContext(),表达式,返回类型,参数类型);
}
}


与具体问题无关,所有这些都是一个糟糕的做法。另请参见

是否可以使用渲染属性来显示/隐藏命令按钮?不,我正在使用按钮动态创建树节点以显示其他相关节点再过一段时间,你就是那个人。我在互联网上寻找这些信息,因为我已经做到了,但使用的是JSF 1.2。我想我过早地认为我需要一个
MethodExpression
,因为我在使用
按钮之前看到过它。setActionExpression(…)
。除了需要明显的参数外,使用
setActionExpression()
setAction()
之间的区别是什么?@Jake:
setAction()
是JSF 1.x使用“延迟EL”的剩余部分,它使用自己的EL实现来实现
ValueBinding
MethodBinding
等等(后来与JSP EL统一)。不要在JSF 2.x中使用任何不推荐使用的API。它们可能会被删除。另请参阅EL.hmm上的一些历史记录。按钮没有调用该操作,我将抛出一些编解码器。您是否暗示无参数方法会被正确调用?
public abstract MethodExpression createMethodExpression(
                                      ELContext context,
                                      java.lang.String expression,
                                      java.lang.Class<?> expectedReturnType,
                                      java.lang.Class<?>[] expectedParamTypes)
public static MethodExpression createMethodExpression(String expression, Class<?> returnType, Class<?>... parameterTypes) {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    return facesContext.getApplication().getExpressionFactory().createMethodExpression(
        facesContext.getELContext(), expression, returnType, parameterTypes);
}
public void submit1()
public String submit2()
public void submit3(String argument)
public String submit4(String argument)
public void submit5(String argument1, Long argument2)
public String submit6(Long argument1, String argument2)
createMethodExpression("#{bean.submit1}", null);
createMethodExpression("#{bean.submit2}", String.class);
createMethodExpression("#{bean.submit3('foo')}", null, String.class);
createMethodExpression("#{bean.submit4('foo')}", String.class, String.class);
createMethodExpression("#{bean.submit5('foo', 0)}", null, String.class, Long.class);
createMethodExpression("#{bean.submit6(0, 'foo')}", String.class, Long.class, String.class);