JSF: показ страницы, пока backingBean все еще работает - PullRequest
0 голосов
/ 11 января 2011

возможно, это название не совсем точное, но вот проблема. Я делаю какой-то проект JSF, и мне нужно следующее:

Когда пользователь входит в мое приложение (т. Е. Когда он переходит на домашнюю страницу), необходимо вызвать метод, который получает обменные курсы из Интернета и / или базы данных. Выполнение этого метода (разбор страниц, сохранение данных и т. Д.) Длится около 5-6 секунд. Я не хочу, чтобы переход с логина на домашнюю страницу длился 5-6 секунд, я хочу, чтобы один из них (еще не определился) происходил:

1) Когда пользователь входит в систему, он видит домашнюю страницу (сразу, а не через 5-6 секунд) и может щелкать и / или перемещаться, пока метод работает в фоновом режиме.

2) Когда пользователь входит в систему, он видит домашнюю страницу (сразу), какой-то знак загрузки в одной части страницы и после выполнения метода он видит таблицу данных с курсами обмена.

Вопрос в том, как это сделать ? Если я добавлю этот метод в конструктор HomePageBean, страница не будет отображаться до тех пор, пока метод не будет выполнен. Может быть, я могу поместить какой-то невидимый элемент на Домашнюю страницу и вызвать этот метод в каком-то Getter, но я не знаю, является ли это правильным способом (похоже на взлом) или он действительно будет работать.

Я использую JSF 2.0 и Primefaces. Заранее спасибо

1 Ответ

0 голосов
/ 11 января 2011

Используйте компонент ApplicationScoped, как в примере ниже:

@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
  }
}

А вот ваш компонент поддержки, обращающийся к компоненту в области приложения.

@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;
  }
}
...