如何以编程方式将AjaxBehavior添加到具有primefaces的UIComponent

如何以编程方式将AjaxBehavior添加到具有primefaces的UIComponent,ajax,jsf-2,primefaces,Ajax,Jsf 2,Primefaces,因为我已经问过了(还没有回答),我继续寻找解决方案,最后我找到了我认为可以帮助实现我想要的东西 所以,我尝试了这个解决方案(这本身就是一个解决办法),但它仍然不适合我 以下是代码,这只是对该问题的测试: index.xhtml: <?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="htt

因为我已经问过了(还没有回答),我继续寻找解决方案,最后我找到了我认为可以帮助实现我想要的东西

所以,我尝试了这个解决方案(这本身就是一个解决办法),但它仍然不适合我

以下是代码,这只是对该问题的测试:

index.xhtml:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:c="http://java.sun.com/jsp/jstl/core">

<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>dyn add comps test </title>
</h:head>
<body>
<h:form id="form1">
<!-- once this first commandLink is clisked it will generate another commandlink below it  -->
<h:commandLink value="cliick me">
<f:ajax event="click" listener="#{myBean.firstcmdLinkListenerHandler}"/>
</h:commandLink>

</h:form>
</body>
</html>
MyAjaxBehavior.java作为primefaces论坛文章中的解决方法:

package mybeans;

import java.util.HashMap;

import javax.el.ELContext;
import javax.el.MethodExpression;
import javax.faces.component.UIComponentBase;
import javax.faces.context.FacesContext;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.BehaviorEvent;

import org.primefaces.component.behavior.ajax.AjaxBehavior;

public class MyAjaxBehavior extends AjaxBehavior {

    @Override
    public Object saveState(FacesContext context) {
        HashMap<String, Object> map;
        map = new HashMap<String, Object>();
        map.put("update", getUpdate());
        map.put("process", getProcess());
        map.put("oncomplete", getOncomplete());
        map.put("onerror", getOnerror());
        map.put("onsuccess", getOnsuccess());
        map.put("onstart", getOnstart());
        map.put("listener", getListener());

        if (initialStateMarked())
            return null;
        return UIComponentBase.saveAttachedState(context, map);

    }

    @SuppressWarnings("unchecked")
    @Override
    public void restoreState(FacesContext context, Object state) {
        if (state != null) {
            HashMap<String, Object> map;
            map = (HashMap<String, Object>) UIComponentBase
                    .restoreAttachedState(context, state);

            setUpdate((String) map.get("update"));
            setProcess((String) map.get("process"));
            setOncomplete((String) map.get("oncomplete"));
            setOnerror((String) map.get("onerror"));
            setOnsuccess((String) map.get("onsuccess"));
            setOnstart((String) map.get("onstart"));
            setListener((MethodExpression) map.get("listener"));
        }

    }

    @Override
    public void broadcast(BehaviorEvent event) throws AbortProcessingException {
        ELContext eLContext = FacesContext.getCurrentInstance().getELContext();

        // Backward compatible implementation of listener invocation
        if (getListener() != null) {
            try {
                getListener().invoke(eLContext, new Object[] { event });
            } catch (IllegalArgumentException exception) {
                getListener().invoke(eLContext, new Object[0]);
            }
        }
    }

}
打包mybeans;
导入java.util.HashMap;
导入javax.el.ELContext;
导入javax.el.MethodExpression;
导入javax.faces.component.UIComponentBase;
导入javax.faces.context.FacesContext;
导入javax.faces.event.AbortProcessingException;
导入javax.faces.event.BehaviorEvent;
导入org.primefaces.component.behavior.ajax.AjaxBehavior;
公共类MyAjaxBehavior扩展了AjaxBehavior{
@凌驾
公共对象保存状态(FacesContext上下文){
HashMap图;
map=新的HashMap();
put(“update”,getUpdate());
put(“process”,getProcess());
put(“oncomplete”,getOncomplete());
put(“onerror”,getOnerror());
put(“onsuccess”,getOnsuccess());
put(“onstart”,getOnstart());
put(“listener”,getListener());
if(initialStateMarked())
返回null;
返回UIComponentBase.saveAttachedState(上下文,映射);
}
@抑制警告(“未选中”)
@凌驾
public void restoreState(FacesContext上下文,对象状态){
如果(状态!=null){
HashMap图;
map=(HashMap)UIComponentBase
.restoreAttachedState(上下文、状态);
setUpdate((字符串)map.get(“更新”);
setProcess((String)map.get(“process”);
setOncomplete((String)map.get(“oncomplete”);
setOnerror((String)map.get(“onerror”);
setOnsuccess((字符串)map.get(“onsuccess”);
setOnstart((字符串)map.get(“onstart”);
setListener((MethodExpression)map.get(“listener”);
}
}
@凌驾
公共无效广播(BehaviorEvent事件)引发AbortProcessingException{
ELContext ELContext=FacesContext.getCurrentInstance().getELContext();
//侦听器调用的向后兼容实现
如果(getListener()!=null){
试一试{
getListener().invoke(eLContext,新对象[]{event});
}捕获(IllegalArgumentException异常){
getListener().invoke(eLContext,新对象[0]);
}
}
}
}
像这样做

Panel tp = new Panel();
FacesContext fc = FacesContext.getCurrentInstance();
ExpressionFactory ef = fc.getApplication().getExpressionFactory();

MethodExpression me = ef.createMethodExpression(fc.getELContext(), "#{myView.closeIt}", null, new Class<?>[]{BehaviorEvent.class});
AjaxBehavior ajaxBehavior = (AjaxBehavior) fc.getApplication().createBehavior(AjaxBehavior.BEHAVIOR_ID);
ajaxBehavior.setProcess("@this");
ajaxBehavior.addAjaxBehaviorListener(new AjaxBehaviorListenerImpl(me, me));
tp.addClientBehavior("close", ajaxBehavior);

component.getChildren().add(tp);

您需要导入org.primefaces.behavior.ajax.AjaxBehavior。小心不要导入javax.faces.component.behavior.AjaxBehavior必须使用正确的
导入org.primefaces.behavior.ajax.AjaxBehavior。
Panel tp = new Panel();
FacesContext fc = FacesContext.getCurrentInstance();
ExpressionFactory ef = fc.getApplication().getExpressionFactory();

MethodExpression me = ef.createMethodExpression(fc.getELContext(), "#{myView.closeIt}", null, new Class<?>[]{BehaviorEvent.class});
AjaxBehavior ajaxBehavior = (AjaxBehavior) fc.getApplication().createBehavior(AjaxBehavior.BEHAVIOR_ID);
ajaxBehavior.setProcess("@this");
ajaxBehavior.addAjaxBehaviorListener(new AjaxBehaviorListenerImpl(me, me));
tp.addClientBehavior("close", ajaxBehavior);

component.getChildren().add(tp);
public void closeIt(CloseEvent ce){
    Panel p = (Panel) ce.getComponent();
    System.out.println("Do what ever you want");
}