【问题标题】:JSF: When to add ClientBehavior to own componentJSF:何时将 ClientBehavior 添加到自己的组件
【发布时间】:2012-04-27 16:50:28
【问题描述】:

我正在开发一个包含 AJAX 客户端行为的组件。行为取决于提供给组件的参数(例如渲染和执行目标)。由于性能原因,我不想使用基于 facelet 的复合组件来实现组件。

我的问题是,何时应将客户端行为添加到组件中。如果我在encodeBegin() 方法中调用addClientBehavior(),我会在UIComponentBase.restoreBehaviorsState() 中收到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());
    }

}

感谢您的帮助,
延斯

【问题讨论】:

  • 我也面临同样的问题。你还记得这个问题的解决方案吗?

标签: ajax jsf uicomponents


【解决方案1】:

是的,“合适的方法或事件”称为 PreRenderViewEvent。我在这里写了如何使用它:http://blog.kennardconsulting.com/2010/10/safely-manipulating-component-tree-with.html

【讨论】:

    猜你喜欢
    • 2013-11-10
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    相关资源
    最近更新 更多