一系列页面使用哪个范围,每个页面都依赖于前一页?

时间:2014-09-30 12:55:03

标签: jsf-2 managed-bean icefaces-3

目前我有四个页面,每个页面都有自己的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。任何建议,将不胜感激。感谢。

1 个答案:

答案 0 :(得分:2)

根据您要存储的数据的使用期限,页面是否按照您列出的顺序实际发生以及您倾向于打字的数量,您可以使用

  1. Flash scope:这个范围非常适合在bean和页面之间传输严格的临时信息。乍一看,这个范围看起来非常适合您的用例。我必须强调此范围中存储的数据的临时特性。指出此范围的实现的早期版本(especially with mojarrahad problems也可能是一件好事,因此请自行承担风险。我个人对示波器没有任何问题,所以它真的归结为你正在运行的JSF版本

    使用闪存范围:

  2. @SessionScoped:您已经知道此范围的持续时间非常长。如果您使用的数据可能会比您在此处列出的bean /页面更耐用,那么这就是您的选择。它还可以在没有任何问题的情况下更新和重定向(并且还有更少的工作来保持和重用数据)