目前我有四个页面,每个页面都有自己的RequestScoped托管bean支持。这方面的一个例子是......
支持search.xhtml
@RequestScoped
SearchBean
支持result.xhtml
@RequestScoped
ResultBean
支持detail.xhtml
@RequestScoped
DetailBean
支持action.xhtml
@RequestScoped
ActionBean
在每个页面(搜索页面除外)中,我从上一页注入bean以访问输入参数。例如......
@RequestScoped
public class Result {
@ManagedProperty("#{search}")
private Search search;
private ResultData resultData;
private Service service;
public Result() {
}
@PostConstruct
public void init() {
resultData = service.getResultData(search);
}
// getters & setters
}
@RequestScoped
public class Detail {
@ManagedProperty("#{result}")
private Result result;
private DetailData detailData;
private Service service;
public Detail() {
}
@PostConstruct
public void init() {
detailData = service.getDetailData(result);
}
// getters & setters
}
@RequestScoped
public class Action {
@ManagedProperty("#{detail}")
private Detail detail;
private ActionData actionData;
private Service service;
public Action() {
}
@PostConstruct
public void init() {
actionData = service.getActionData(detail);
}
// getters & setters
}
我想使用重定向,以便我可以使用后退按钮,但在这样做时,我丢失了请求中托管bean的输入数据。我可以为每个bean使用SessionScope,但我觉得我会滥用它。此外,当我到达操作页面时,我担心开销。此时,由于每个bean都会注入前一个bean,因此在触发页面时会创建所有四个ManagedBeans。有没有比使用RequestScoped bean更好的方法。我想我可以为一系列页面使用一个SessionScoped bean,并使用它来跨请求传送输入参数。这也允许我使用重定向功能,并且在最终命中操作页面时不会加载所有四个托管bean。任何建议,将不胜感激。感谢。
答案 0 :(得分:2)
根据您要存储的数据的使用期限,页面是否按照您列出的顺序实际发生以及您倾向于打字的数量,您可以使用
Flash scope:这个范围非常适合在bean和页面之间传输严格的临时信息。乍一看,这个范围看起来非常适合您的用例。我必须强调此范围中存储的数据的临时特性。指出此范围的实现的早期版本(especially with mojarra)had problems也可能是一件好事,因此请自行承担风险。我个人对示波器没有任何问题,所以它真的归结为你正在运行的JSF版本
使用闪存范围:
@SessionScoped
:您已经知道此范围的持续时间非常长。如果您使用的数据可能会比您在此处列出的bean /页面更耐用,那么这就是您的选择。它还可以在没有任何问题的情况下更新和重定向(并且还有更少的工作来保持和重用数据)