<h:datatable value =“#{myBean.xxx}”>:getXxx()被调用了很多次,为什么?</h:datatable>

时间:2010-10-19 22:10:56

标签: java jsf datatable jsf-2 getter

关于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阶段 - RENDER_RESPONSE左右调用 5次。该页面有inputTextarea,因此我输入了一些内容,然后单击Post(commandButton)。然后getProfileComment被称为另一个 12次,通过阶段1-&gt; 4。每个阶段称此方法 3-4次。然后,属性newComment的setter方法得到调用(所以setNewComment()得到调用),getProfileComment再次调用phase 5。然后postReply()接听电话,然后getProfileComment再次拨打另一个 5次的电话phase 6。到底是怎么回事?是假设是这样的吗?如果您通过我的EJB getProfileComment查看我的scholarBean,我实际上是在查询数据库,因此必须像这样查询数据库20次这是一个非常糟糕的主意。

1 个答案:

答案 0 :(得分:5)

是的,在请求期间可以多次调用getter。只要它正确地完成它的唯一工作就没有坏处:返回bean属性。但是,在您的示例中,您将直接在getter方法中加载列表!这应该避免。初始化/加载模型应该在bean的构造函数或@PostConstruct或任何基于事件的方法(如action方法)中。他们只被召唤一次。 getter应该只返回模型数据而已(仅限于一些简单的日志记录或延迟加载)。

另见: