如何以编程方式将AjaxBehavior添加到具有primefaces的UIComponent
因为我已经问过了(还没有回答),我继续寻找解决方案,最后我找到了我认为可以帮助实现我想要的东西 所以,我尝试了这个解决方案(这本身就是一个解决办法),但它仍然不适合我 以下是代码,这只是对该问题的测试: index.xhtml:如何以编程方式将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
<?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");
}