: getXxx () вызывается так много раз, почему? - PullRequest
2 голосов
/ 20 октября 2010

Простой кусок кода о dataTable. CentralFeed - это SessionScoped Bean, а PostComment - это RequestScoped Bean

<h:form id="table">
    <h:dataTable value="#{CentralFeed.profileComments}" var="item">
        <h:column>
            <h:outputText value="#{item.comment}"/><br/>
            <h:inputTextarea value="#{item.newComment}" rows="2"/><br/>
            <h:commandButton value="Post" action="#{PostComment.postReply(item)}" />
        </h:column>
    </h:dataTable>
</h:form>

внутри CentralFeed.java

private List<NewsFeed> profileComments = null;

public List<NewsFeed> getProfileComments() {
    PhaseId currentPhaseId = FacesContext.getCurrentInstance().getCurrentPhaseId();
    profileComments = scholarBean.findProfileCommentsByUserId(getSelectedUser().getId());
    //model = new ListDataModel<NewsFeed>(profileComments);
    return profileComments;
}

Моя проблема в том, что getProfileComments() часто звонят. currentPhaseId скажет нам, на какой стадии вызывается метод. Когда страница загружается впервые, getProfileComment получает вызов около 5 раз , на этапе 6 - RENDER_RESPONSE. На странице есть inputTextarea, поэтому я что-то набираю и нажимаю Post (кнопка command). Затем getProfileComment будет вызван другой 12 раз , проходящий фазу 1-> 4. На каждом этапе вызывайте этот метод 3-4 раза . Затем, после этого, метод установки атрибута newComment получает вызов (поэтому setNewComment () получает вызов), getProfileComment снова получает вызов на phase 5. Затем postReply() получить вызов, затем getProfileComment получить вызов еще раз для 5 раз при phase 6. Что здесь происходит? Это должно быть так? Если вы посмотрите на мой getProfileComment через мой EJB scholarBean, я на самом деле опрашиваю базу данных, так что запросить базу данных примерно 20 раз, как это, очень плохая идея.

1 Ответ

5 голосов
/ 20 октября 2010

Да, геттеры могут вызываться несколько раз во время запроса.Он не причиняет вреда до тех пор, пока не выполняет свою единственную работу должным образом: возвращая свойство бина.Однако в вашем примере вы загружаете список прямо в методе getter!Этого следует избегать.Инициализация / загрузка модели должна идти в конструкторе компонента или @PostConstruct или любых методах, основанных на событиях, таких как метод действия.Их вызывают только один раз.Получатели должны возвращать только данные модели и ничего более (кроме некоторой простой регистрации или отложенной загрузки).

См. Также:

...