减少对贪婪方法的多次调用

时间:2017-03-29 11:41:03

标签: jsf jsf-2 scope

我有以下JSF 2.0 bean:

@ApplicationScoped
class GreedyBean {
  Result doGreedyStuff(String userId) {
    ... // Takes lots of machine resources and time.
  }
}

@SessionScoped
class MyPageBean {
  String userId;
  GreedyBean greedyBean;
  String getFirstGreedyStuffStat() {
    Result result = greedyBean.doGreedyStuff(userId);
    return result.getString();
  }
  int getSecondGreedyStuffStat() {
    Result result = greedyBean.doGreedyStuff(userId);
    return result.getInt();
  }
  void setGreedyBean(GreedyBean greedyBean) { this.greedyBean = greedyBean; }
}

然后在我的JSF页面中:

<h:outputText value="#{myPageBean.firstGreedyStuffStat}"/>
<h:outputText value="#{myPageBean.secondGreedyStuffStat}"/>

如何在不实施缓存机制的情况下对GreedyBean::doGreedyStuff进行一次调用以重构此操作?如果JSF不能这样做,那么这样说就是一个有效的答案。

备注:

  • 我几乎没有任何JSF知识:我只修复了这个错误,然后我恢复了我常用的其他任务。
  • 我们使用Spring进行注入,我试图在JSF注释中翻译它们。如果那里有错误,请放纵我。
  • 正如@JasperdeVries所提到的,我无法将呼叫置于@PostConstruct的{​​{1}}中,因为数据不是最新的。结果应该在请求时更新,而不是在会话开始时。我理解这个原则并会强制执行它,虽然它对这个情况没有帮助。

1 个答案:

答案 0 :(得分:1)

来自@JasperdeVries&#39;解释,我需要添加一个新的请求范围的bean:

<强> GreedyBean.java

@ApplicationScoped
class GreedyBean {
  Result doGreedyStuff(String userId) {
    ... // Takes lots of machine resources and time.
  }
}

MyPageBean.java (应该重命名为关于会话的内容,而不是页面)

@SessionScoped
class MyPageBean {
  String userId;
  String getUserId() { return userId; }
}

<强> MyPageRequestBean.java

@RequestScoped
class MyPageRequestBean {
  // Beans
  MyPageBean myPageBean;
  GreedyBean greedyBean;

  // Data
  String firstGreedyStat;
  int secondGreedyStat;

  @PostConstruct
  public void init() {
    Result result = greedyBean.doGreedyStuff(myPageBean.getUserId());
    firstGreedyStat = result.getString();
    secondGreedyStat = result.getInt();
  }

  String getFirstGreedyStat() { return firstGreedyStat; }
  int getSecondGreedyStat() { return secondGreedyStat; }

  void setMyPageBean(MyPageBean myPageBean) { this.myPageBean = myPageBean; }
  void setGreedyBean(GreedyBean greedyBean) { this.greedyBean = greedyBean; }
}

<强> myPage.xhtml

<h:outputText value="#{myPageRequestBean.firstGreedyStuffStat}"/>
<h:outputText value="#{myPageRequestBean.secondGreedyStuffStat}"/>