我有以下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不能这样做,那么这样说就是一个有效的答案。
备注:
@PostConstruct
的{{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}"/>