JSF 2:为什么我的第一个bean在ajax动作期间被调用到第二个bean?

时间:2011-10-03 09:36:49

标签: java jsf-2

我有两个backbeans,一个用于检索ui中的数据:repeat和一个用于执行操作。

当我的页面被渲染时,如果我用第二个backbean执行一个动作,第一个被调用(初始化),即使我使用Richfaces 4的ajax动作。如果我不使用重复,则不是这种情况零件。 令人讨厌的是,使用repeat元素调用第一个bean。

这是我的代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<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:ui="http://java.sun.com/jsf/facelets"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich">
<h:head>
</h:head>

<h:body>
    <h:form>
        <ui:repeat var="currentValue" value="#{test_form_backBean_1.testSimpleModels}">
            #{currentValue.name}
            <br />
        </ui:repeat>

        <a4j:commandButton value="Tester" actionListener="#{test_form_backBean_2.test}" execute="@this" render="@this">

        </a4j:commandButton>
    </h:form>

</h:body>
</html>

我的第一个豆子:

@Named("test_form_backBean_1")
@RequestScoped
public class Test_form_backBean_1 {

    private static final Logger logger = Logger.getLogger(Test_form_backBean_1.class);

    private List<Test_Simple_Model> testSimpleModels;

    @PostConstruct
    public void init() {

        if (logger.isTraceEnabled())
            logger.trace("Initialisation de Test_form_backBean_1.");

            testSimpleModels = new ArrayList<Test_Simple_Model>();
            testSimpleModels.add(new Test_Simple_Model(1L, "name_1"));
            testSimpleModels.add(new Test_Simple_Model(2L, "name_2"));
            testSimpleModels.add(new Test_Simple_Model(3L, "name_3"));
            testSimpleModels.add(new Test_Simple_Model(4L, "name_4"));
    }

    public List<Test_Simple_Model> getTestSimpleModels() {
        logger.trace("getTestSimpleModels() : appel.");
        return testSimpleModels;
    }

    public void setTestSimpleModels(List<Test_Simple_Model> testSimpleModels) {
        logger.trace("setTestSimpleModels() : appel.");
        this.testSimpleModels = testSimpleModels;
    }

}

第二个:

@Named("test_form_backBean_2")
@RequestScoped
public class Test_form_backBean_2 {

    private static final Logger logger = Logger.getLogger(Test_form_backBean_2.class);

    @PostConstruct
    public void init() {

        logger.trace("Initialisation de Test_form_backBean_2.");

    }

    public void test() {
        logger.trace("test() : appel de la fonction de test.");
    }
}

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

问题是你的bean是请求范围的,这意味着它们在请求 - 响应生命周期完成后就会超出范围,这是非面部请求(整页)或AJAX后退的结果请求。

您需要使用视图范围的bean。由于您正在使用CDI,您可以停止使用它并切换到使用具有@ViewScoped注释的JSF 2托管bean,或者您可以继续使用带有Seam Faces 3的CDI,它显然也支持@ViewScoped 。 (我不知道它做了什么魔术,但显然它只是有效。)

还请尝试使用普遍接受的Java命名约定,例如TestFormBackBean1而不是Test_form_backBean_1