相关疑难解决方法(0)

为什么JSF多次调用getter

假设我像这样指定一个outputText组件:

<h:outputText value="#{ManagedBean.someProperty}"/>
Run Code Online (Sandbox Code Playgroud)

如果我在someProperty调用getter for时打印一条日志消息并加载页面,那么注意每个请求多次调用getter是很容易的(在我的情况下发生了两次或三次):

DEBUG 2010-01-18 23:31:40,104 (ManagedBean.java:13) - Getting some property
DEBUG 2010-01-18 23:31:40,104 (ManagedBean.java:13) - Getting some property
Run Code Online (Sandbox Code Playgroud)

如果someProperty计算的值很昂贵,这可能是一个问题.

我用Google搜索了一下,认为这是一个已知问题.一个解决方法是包括一个检查,看看它是否已经计算过:

private String someProperty;

public String getSomeProperty() {
    if (this.someProperty == null) {
        this.someProperty = this.calculatePropertyValue();
    }
    return this.someProperty;
}
Run Code Online (Sandbox Code Playgroud)

这个问题的主要问题是你得到大量的样板代码,更不用说你可能不需要的私有变量了.

这种方法有哪些替代方案?没有那么多不必要的代码,有没有办法实现这一目标?有没有办法阻止JSF以这种方式行事?

感谢您的输入!

getter performance jsf el

253
推荐指数
4
解决办法
9万
查看次数

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

简单的一段代码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调用 …

java datatable getter jsf jsf-2

2
推荐指数
1
解决办法
2010
查看次数

标签 统计

getter ×2

jsf ×2

datatable ×1

el ×1

java ×1

jsf-2 ×1

performance ×1