JSF 2: Почему мой первый bean-компонент вызывается во время действия ajax для второго bean-компонента? - PullRequest
0 голосов
/ 03 октября 2011

У меня есть два backbean-компонента, один для извлечения данных в пользовательском интерфейсе: повтор и один для выполнения действия.

Когда моя страница отображается, если я выполняю действие со вторым бэканом, первая вызывается (инициализируется), даже если я использую действие ajax с Richfaces 4. Это не тот случай, если я не использую повтор составная часть. Раздражает, что первый компонент вызывается с повторяющимся элементом.

Вот мой код:

<!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 голосов
/ 03 октября 2011

Проблема заключается в том, что ваши bean-компоненты находятся в области запроса, то есть они выходят за пределы области действия, как только завершается жизненный цикл запроса-ответа, будь то результат запроса без лиц (полная страница) или постбэк AJAXrequest.

Вместо этого вам нужно использовать bean-компоненты вида.Поскольку вы используете CDI, вы можете либо прекратить использовать это и переключиться на использование управляемых компонентов JSF 2 с аннотацией @ViewScoped, либо вы можете продолжать использовать CDI с Seam Faces 3, который, очевидно, также поддерживает @ViewScoped.(Я не знаю, каким волшебством он это делает, но, видимо, он просто работает.)

Пожалуйста, попробуйте также использовать общепринятые соглашения об именах для Java, например TestFormBackBean1 вместо Test_form_backBean_1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...