【问题标题】:JSF: Showing page while backingBean is still workingJSF:在 backingBean 仍在工作时显示页面
【发布时间】:2011-01-11 00:46:34
【问题描述】:

也许这个标题并不准确,但问题就在这里。 我正在做一些 JSF 项目,我需要以下内容:

当用户登录我的应用程序时(即当他导航到主页时),需要调用一个从互联网和/或数据库获取一些货币汇率的方法。该方法的执行(页面解析、数据保存等)持续大约 5-6 秒。我不希望从登录到主页的导航持续 5-6 秒,我希望其中之一(尚未决定哪一个)发生:

1) 当用户登录时,他会看到主页(立即,而不是在 5-6 秒后),并且能够在方法在后台运行时单击和/或导航。

2)当用户登录时,他(立即)看到主页,页面的一部分有一些加载标志,在执行方法后,他看到带有汇率的dataTable。

问题是,如何做到这一点? 如果我将该方法放在 HomePageBean 构造函数中,则在执行方法之前不会显示页面。也许我可以在主页上放置一些不可见的元素并在某个 Getter 中调用该方法,但我不知道这是否是正确的做法(看起来像 hack)或者它是否真的有效。

我正在使用 JSF 2.0 和 Primefaces。 提前致谢

【问题讨论】:

    标签: ajax jsf-2 primefaces backing-beans


    【解决方案1】:

    使用 ApplicationScoped bean,如下例所示:

    @ManagedBean(name = "exchRateBean", eager = true)
    @ApplicationScoped
    public class ExchRateBean  {
    
      public List<Rate> getRates(Date date) {
        // cached data or DAO methods here
      }
    
      @PostConstruct
      public void init() {
        // Initial web-app initialization, will run once upon deploy
      }
    }
    

    这是访问应用程序范围 bean 的支持 bean。

    @RequestScoped
    public class MyBean  {
      @ManagedProperty(value="#{exchRateBean}")
      private ExchRateBean exchRateBean;
    
      // your JSF methods
      public List<Rate> getRates(Date date) {
        return getExchRateBean().getRates(date);
      }
    
      // G&S
      public ExchRateBean getExchRateBean() {
        return exchRateBean;
      }
    
      public void setExchRateBean(ExchRateBean exchRateBean) {
        this.exchRateBean = exchRateBean;
      }
    }
    

    【讨论】:

    • 感谢您的回答,但我不确定我是否完全理解。 MyBean 是否代表 LoginBean/HomePageBean 并且我的 ExchRate 数据表正在从 MyBean.rates 获取数据?如果这是真的,那么假设它立即显示主页和空白数据表并在执行 getRates(date) 后填充数据表,它可能会解决 2. 部分(我今天会尝试)。但是,1.,即。在哪里调用你的 getRates(date) 方法?
    • @Nikola MyBean 是您的 LoginBean/HomePageBean,而 ExchRate bean 是整个站点的一个。它提供了其他 bean 可以使用的通用方法和数据。在这种情况下,MyBean 正在从 ExchRate 获取费率。至于延迟 - 您可以在应用程序范围的 bean 中初始化(@PostConstruct)并维护比率哈希(缓存),从而快速响应 MyBean 和任何其他对交换比率感兴趣的 bean。
    • 还有其他解决方案,例如 ajax 后台加载,但不适用于您的特定情况。汇率是客观的,所有用户/请求都一样(我相信),如果网站需要考虑几秒钟来显示简单的汇率表,那就太奇怪了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多