【问题标题】:Which scope to use for a series of pages, each dependent on the previous page?一系列页面使用哪个范围,每个页面都依赖于前一页?
【发布时间】:2014-09-30 12:55:03
【问题描述】:

目前我有四个页面,每个页面都由它们自己的 RequestScoped 托管 bean 支持。这方面的一个例子如下......

支持 search.xhtml

@RequestScoped
SearchBean

支持结果.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,所以在页面触发时会创建所有 4 个 ManagedBean。有没有比使用 RequestScoped bean 更好的方法。我想我可以为一系列页面使用一个 SessionScoped bean,并使用它来跨请求携带输入参数。这也将允许我使用重定向功能,并且在最终点击操作页面时不会加载所有四个托管 bean。任何建议,将不胜感激。谢谢。

【问题讨论】:

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


    【解决方案1】:

    根据您存储的数据的使用期限、页面是否实际按您列出的顺序出现以及您倾向于输入多少,您可以使用任何一种

    1. Flash scope:这个范围非常适合在 bean 和页面之间传输严格的临时信息。乍一看,这个范围似乎非常适合您的用例。我必须强调存储在此范围内的数据的临时性质。指出此范围 (especially with mojarra) had problems 的早期版本实现也可能是一件好事,因此使用风险自负。我个人对范围没有任何问题,因此归结为您正在运行的 JSF 版本

      使用闪光范围:

    2. @SessionScoped:这个作用域,正如你已经知道的那样持续很长时间。如果您使用的数据可能比您在此处列出的 bean/页面更持久,那么这就是要走的路。它还可以在刷新和重定向中幸免于难(而且还有一个额外的好处是减少了持久化和重用数据的工作)

    【讨论】:

    猜你喜欢
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    相关资源
    最近更新 更多