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