Ajax JSF:何时向自己的组件添加ClientBehavior
我正在开发一个包含AJAX客户端行为的组件。行为取决于提供给组件的参数(例如渲染和执行目标)。由于性能原因,我不想使用基于facelet的复合组件实现该组件 我的问题是,什么时候客户端行为应该添加到组件中。如果我在Ajax JSF:何时向自己的组件添加ClientBehavior,ajax,jsf,uicomponents,Ajax,Jsf,Uicomponents,我正在开发一个包含AJAX客户端行为的组件。行为取决于提供给组件的参数(例如渲染和执行目标)。由于性能原因,我不想使用基于facelet的复合组件实现该组件 我的问题是,什么时候客户端行为应该添加到组件中。如果我在encodeBegin()方法中调用addClientBehavior(),我将在UIComponentBase.RestoreBhaviorsState()中收到NullPointerException。如果我在构建时添加行为,ajax请求可以工作,但是参数还不可用。是否有合适的方法
encodeBegin()
方法中调用addClientBehavior()
,我将在UIComponentBase.RestoreBhaviorsState()中收到NullPointerException
。如果我在构建时添加行为,ajax请求可以工作,但是参数还不可用。是否有合适的方法或事件来正确添加行为
我使用mojarra 2.1.7。下面是一个没有动态ajax功能的组件的简短示例:
@FacesComponent(value="simpleTestLink")
public class SimpleTestLink extends HtmlCommandLink{
private Logger logger=LoggerFactory.getLogger(getClass());
private AjaxBehavior ajax;
enum PropertyKeys{aProp};
public SimpleTestLink() {
logger.debug("SimpleTestLink created");
// adding ajax here works, but no parameters available yet
ajax = new AjaxBehavior();
ajax.setExecute(Arrays.asList(new String[]{"@this"}));
ajax.setRender(Arrays.asList(new String[]{"@form"}));
addClientBehavior(getDefaultEventName(), ajax);
}
@Override
public void encodeBegin(FacesContext context) throws IOException {
logger.debug("encodeBegin num: " + getAttr());
// adding ajax here fails
super.encodeBegin(context);
}
@Override
public boolean getRendersChildren() {
return true;
}
@Override
public void encodeChildren(FacesContext context) throws IOException {
Object attr = getAttr();
HtmlOutputText outputText = new HtmlOutputText();
outputText.setValue("testlink["+ attr+"]\n");
outputText.encodeAll(context);
super.encodeChildren(context);
}
private Object getAttr() {
return getAttributes().get(PropertyKeys.aProp.name());
}
}
谢谢你的帮助,
Jens是的,“合适的方法或事件”称为PreRenderViewEvent。我在这里写了如何使用它的博客:我也面临同样的问题。你还记得解决这个问题的方法吗?