Является ли область диалога подходящей заменой области просмотра? - PullRequest
9 голосов
/ 01 января 2012

В JSF 2.0 наиболее очевидным вариантом использования области просмотра является отдельная страница с потенциально несколькими постбеками AJAX.Использование CDI вместо управляемых JSF-компонентов оставляет нас без области видимости, поэтому мы либо оставляем для реализации свою собственную, используем (возможно с ошибками) стороннюю реализацию или используем область диалога.

Мой вопрос:Является ли область диалога достойной заменой области представления в типичной ситуации AJAX?Как и область просмотра, позволяет ли она создавать несколько экземпляров за сеанс?Какие подводные камни?

Мне известна одна из ловушек, а именно то, что область диалога не удаляется автоматически, когда пользователь уходит со страницы, а вместо этого удаляется после тайм-аута.Но я не уверен, что происходит, когда пользователь переходит назад на эту страницу до истечения времени ожидания разговора.

ОБНОВЛЕНИЕ

Беседаобласть действия действительно поддерживает несколько экземпляров за сеанс. В этой книге говорится так же много, и я смог подтвердить это, используя код из гл.2.

1 Ответ

4 голосов
/ 01 января 2012

В любых @ConversationScoped бобах CDI у вас должно быть следующее поле:

@Inject
private Conversation conversation; 

Если вы хотите начать диалог, вам нужно проверить, находится ли бин в состоянии transient.В противном случае, IllegalStateException будет брошено.Это будет что-то вроде этого:

public void beginConversation() {
  if (conversation.isTransient()) conversation.begin();
}

При этом ваш бин будет в состоянии long-running.Следовательно, если пользователь уходит со страницы и возвращается позже, вы всегда можете проверить, истекло ли время его разговора или нет, и перенести его на страницу, где он ушел.

Кроме того, я былиспользуя @ViewScoped ManagedBean вместе с CDI bean некоторое время.Вы все еще можете использовать @Inject для внедрения CDI bean в MangedBean .Я не думаю, что вы можете сделать наоборот.Во всяком случае, я понятия не имею, если это приведет к чему-то плохому случиться позже.Однако до сих пор я никогда не встречал никаких проблем.Если вы действительно хотите использовать @ViewScoped, я думаю, вы можете попробовать: P.

ОБНОВЛЕНИЕ:

Является ли область разговора достойной заменойпосмотреть область в типичной ситуации AJAX?

Я не думаю, что @ConversationScoped сможет когда-либо полностью заменить @ViewScoped.

Как и область просмотра, позволяет ли онанесколько экземпляров за сеанс?

Нет, вы не можете иметь несколько экземпляров за сеанс.Как я уже говорил, если вы начнете новый разговор, пока старый разговор все еще находится в состоянии long-running, вы получите IllegalStateException.

Какие подводные камни?

Ну, одно из главных преимуществ @ViewScoped перед @RequestScoped заключается в том, что вам не нужно повторно инициировать данные каждый раз, когда пользователь отправляет форму в одно и то же представление.Однако с @ConversationScoped это преимущество используется слишком часто.Хотя эта проблема не так серьезна, как если бы вы использовали @SessionScoped, вам все равно нужно хранить инициализированные данные до тех пор, пока боб @ConversationScoped живет.Чем дольше разговор, тем больше данных вам может понадобиться.

...