使用ExpressionFactory#createMethodExpression()
を持っています。
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);
EL式は、通常のビューファイルで使用するものとまったく同じであることに注意してください。
更新は、ここでのTomcat 7.0.27にクロサギ科2.1.12と私のために正常に動作SSCCEです。具体的な問題へ
@ManagedBean
@RequestScoped
public class Bean {
private UIForm form;
public void add() {
String id = "button" + form.getChildCount();
UICommand button = new HtmlCommandButton();
button.setId(id);
button.setValue(id);
button.setActionExpression(createMethodExpression(String.format("#{bean.submit('%s')}", id), null, String.class));
form.getChildren().add(button);
}
public void submit(String arg) {
System.out.println("submit: " + arg);
}
public UIForm getForm() {
return form;
}
public void setForm(UIForm form) {
this.form = form;
}
public static MethodExpression createMethodExpression(String expression, Class<?> returnType, Class<?>... parameterTypes) {
FacesContext facesContext = FacesContext.getCurrentInstance();
return facesContext.getApplication().getExpressionFactory().createMethodExpression(
facesContext.getELContext(), expression, returnType, parameterTypes);
}
}
無関係
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
>
<h:head>
<title>SO question 12098611</title>
</h:head>
<h:body>
<h:form binding="#{bean.form}">
<h:commandButton value="add" action="#{bean.add}" />
</h:form>
</h:body>
</html>
、上記のすべてが悪い習慣です。関連項目
How does the 'binding' attribute work in JSF? When and how should it be used?
レンダリングされたプロパティを使用してコマンドボタンを表示/非表示にできませんか? – RajV
nah私は他の関連ノードを表示するためのボタンでツリーノードを動的に作成しています –