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