I have tried several ways to implement and adding programatically a commandButon with action or actionListener. I tried to implement an ajax behavior, set an action and set an actionListener without success. In my pom I added el-api dependence because my project didn't got MethodExpression,MethodExpressionActionListener and ExpressionFactory classes and they were necessary in some example codes. I don't get any error messages on glassfish log neither js log.
Edit If I change bean scope to Session the action method is invoked but never with request or view on this balus example
Methods' BeanUtils class
public static MethodExpression createMethodExpression(String valueExpression,Class<?> expectedReturnType,Class<?>[] expectedParamTypes) {
MethodExpression methodExpression = null;
try {
FacesContext fc = FacesContext.getCurrentInstance();
ExpressionFactory factory = fc.getApplication().getExpressionFactory();
methodExpression = factory.createMethodExpression(fc.getELContext(), valueExpression, expectedReturnType, expectedParamTypes);
} catch (Exception e) {
throw new FacesException("Method expression '" + valueExpression + "' could not be created.");
}
return methodExpression;
}
public static MethodExpressionActionListener createMethodActionListener(String valueExpression,Class<?> expectedReturnType,Class<?>[] expectedParamTypes) {
MethodExpressionActionListener actionListener = null;
try {
actionListener = new MethodExpressionActionListener(createMethodExpression(
valueExpression, expectedReturnType, expectedParamTypes));
} catch (Exception e) {
throw new FacesException("Method expression for ActionListener '" + valueExpression
+ "' could not be created.");
}
return actionListener;
}
Button code (same for every try)
CommandButton cancelBtn=(CommandButton)app.createComponent(CommandButton.COMPONENT_TYPE);
cancelBtn.setId("deleteText_btn_" + panel.getId());
cancelBtn.setAlt("Change");
cancelBtn.setTitle("Change");
cancelBtn.setValue("Change");
First try - Ajax behavior
MethodExpression me = BeanUtils.createMethodExpression("#{eventProvider.deleteText()}",null,new Class<?>[]{BehaviorEvent.class});
AjaxBehavior ajaxBehavior = (AjaxBehavior) app.createBehavior(AjaxBehavior.BEHAVIOR_ID);
ajaxBehavior.addAjaxBehaviorListener(new AjaxBehaviorListenerImpl(me, me));
cancelBtn.addClientBehavior("submit",ajaxBehavior);
Second try - setting an actionListener
FacesContext context = FacesContextWrapper.getCurrentInstance();
MethodExpressionActionListener methodExpression = new MethodExpressionActionListener(context.getApplication().getExpressionFactory()
.createMethodExpression(context.getELContext(),"#{eventProvider.deleteText}", null, new Class[] {ActionEvent.class}));
cancelBtn.addActionListener(methodExpression);
Third try - Setting an action
FacesContext context = FacesContext.getCurrentInstance();
MethodExpression methodExpression = context.getApplication().getExpressionFactory().createMethodExpression(
context.getELContext(), "#{eventProvider.deleteText}", null, new Class[] { ActionEvent.class });
cancelBtn.setActionExpression(methodExpression);
Method which must be called from action/actionListener
@Component("eventProvider")
@Scope("view")
public class EventProvider {
............
............
public void deleteText(ActionEvent event){
logger.entry("EventProvider.deleteText()");
System.out.print("debbuging");
}
}