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

Tha*_*ham 2 java datatable getter jsf jsf-2

简单的一段代码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>
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是getProfileComments()被召唤了很多.currentPhaseId将告诉我们该方法被调用的阶段.当页面首次加载时,在第6阶段 - getProfileComment5次接听电话RENDER_RESPONSE.页面有一个inputTextarea,所以我输入了一些内容,然后单击Post(commandButton).然后再通过阶段1-> 4 再getProfileComment调用12次.每个阶段调用此方法3-4次.然后,在属性newComment获取调用的setter方法(所以setNewComment()得到调用),getProfileComment再次调用get调用phase 5.然后postReply()得到的呼叫,然后getProfileComment再次获得呼吁其他5次phase 6.到底是怎么回事?是假设是这样的吗?如果你看看我的getProfileComment,通过我的EJB scholarBean,我实际上是在查询数据库,所以不得不像这样查询数据库20次这是一个非常糟糕的主意.

Bal*_*usC 5

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

也可以看看: