如何将ajax行为添加到后台bean中动态创建的组件



在另一个线程中响应Infragile的请求,我将此作为一个单独的问题而不是后续问题。

这是我试图解决的问题:我正在从JSF1.2迁移到JSF2。在JSF1.2中一切正常。我已经重写了一个关键项目是一个复合组件,这基本上是一个面板创建在我的后台bean通过添加组件的代码。

特别是,我在代码中创建了h:inputText和h:selectOneMenu组件,以及"Apply"h:commandButton。"Apply"按钮有一个动作监听器,用于检查h:inputText和h:selectOneMenu组件中的值。所有这些都可以正常工作,但是当我从h:inputText或h:selectOneMenu组件中获取值时,我得到的是原始值,而不是用户输入的新值。就像我说的,这在JSF1.2中工作得很好(我得到了新的值),但由于某种原因,在JSF2中不行。

我尝试了几种方法来解决这个问题,但都没有成功,所以我想我应该向h:inputText和h: selectonemenuu项添加ajax行为,当这些组件中的值发生变化时,我可以为ajax行为调用另一个后备bean侦听器来获取新值。

我试图将ajax行为添加到我在代码中创建的组件(未绑定到页面组件)。我可以毫无问题地创建组件。但是,我遇到的问题是如何将ajax行为添加到组件中。

可以有人张贴样例代码添加一个ajax行为的值变化或模糊事件?下面是我用来在代码中创建组件的代码——我需要如何修改它来添加ajax行为?hpg = new HtmlPanelGrid();children = hpg.getChildren();children.clear ();….input = new htmlputtext ();….children.add(输入);

我必须添加什么代码来替换"在这里添加ajax行为"行,侦听器方法的参数是什么(替换????? . js的方法的参数)下面)?

公共无效myAjaxListener(?????) {......{

我一直在努力解决这个问题一段时间了。我觉得我很接近了,但不知道我需要的语法。如果有帮助的话,我可以提供更多关于如何获取组件id和在操作侦听器中搜索值的信息。

谢谢

这是如何动态添加AjaxBehaviorListener到你的组件:

...
HtmlInputText inpuText = new HtmlInputText();
AjaxBehavior blurBehavior = new AjaxBehavior();
blurBehavior.addAjaxBehaviorListener(new BlurListener());
blurBehavior.setTransient(true);
inputText.addClientBehavior("blur", blurBehavior)
...
public class BlurListener implements AjaxBehaviorListener {
    public BlurListener() {
    }
    @Override
    public void processAjaxBehavior(AjaxBehaviorEvent event) {
        // do your job
        HtmlInputText inputText = event.getComponent(); // your input text component
        ...
    }
}

"blur"表示触发此监听器的事件。请记住,JSF组件必须支持这个事件,否则它将无法工作。(在这里您可以看到下面的内容以及如何构建自定义AJAX组件http://weblogs.java.net/blog/driscoll/archive/2009/10/09/jsf-2-custom-java-components-and-ajax-behaviors?force=670)

然而,在你的情况下,我认为问题是按钮ActionListener在实际组件值被提交之前被触发。你可以解决它通过移动你的ActionListener逻辑按钮动作,通过前面提到的AJAX,也许通过在UIComponents (HtmlInputText, UISelectOne)中找到实际值,不确定,但直接属性也可以影响它。