如何将ajax行为添加到辅助bean中动态创建的组件?

时间:2011-10-07 13:37:30

标签: ajax jsf-2

在另一个帖子中处理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:selectOneMenu项中添加ajax行为,当这些组件中的值发生变化时,我可以调用另一个支持用于获取新值的ajax行为的bean侦听器。

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

有人发贴示例代码可以为值更改或模糊事件添加ajax行为吗?这是我用来在代码中创建组件的代码 - 我如何修改它以添加ajax行为?     hpg = new HtmlPanelGrid();     children = hpg.getChildren();     children.clear();     ....     input = new HtmlInputText();     ....           children.add(输入);

我需要添加什么代码来替换“在这里添加ajax行为”这一行,以及侦听器方法的争论是什么(争论替换下面的?????的方法)?

public void myAjaxListener(?????){...... {

我一直试图解决这个问题。我觉得我非常接近,但不知道我需要的语法。我可以提供有关如何获取组件ID并在我的动作侦听器中搜索值的更多信息,如果这将有所帮助。

由于

1 个答案:

答案 0 :(得分:0)

这是如何动态地将AjaxBehaviorListener添加到yor组件:

...
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)中的实际值,不确定但是immediate属性也可以影响它。