2015-03-06 2 views
0

Я читал обо всех различиях между типами области (@SessionScoped, @ViewScoped, @ApplicationScope and @RequestScope), однако, я все еще сталкиваюсь с каким-то образом проблемой с моим приложением. У меня есть page-1 с сеткой, и я отправляю выбранный элемент на page-2 (оба page-1 и page-2 используют один и тот же бэк-файл) для редактирования, а затем сохраняются. Мой управляемый bean использовал @RequestScoped от javax.faces.bean.RequestScoped, поскольку я понял, что это идеальная область применения, но это не сработало, бит уничтожается и данные теряются.Is @SessionScoped хорошая практика?

Возобновление истории, я изменил аннотацию на @SessionScoped, и это сработало, но я хотел бы знать, является ли это хорошей практикой или нет? Поскольку я читал, что использовать @SessionScoped не рекомендуется, так как данные будут сохранены до тех пор, пока клиент не выйдет из системы.

+0

Вкратце, сценарий, который вы упомянули, полностью прозрачно зависит от бизнес-требований, которые можно использовать или выбирать, когда. – Tiny

ответ

4

Лучшей практикой является выбор подходящей области видимости (либо сеансовой, либо другой). соответствующий возможности для выбора в вашем случае является @SessionScoped фасоль, потому что в случае:

  • RequestScoped: Новый компонент будет создан после каждого цикла HTTP запрос-ответ, который вы уже сталкивались, когда вы пытались объем запроса:

    бин разрушалась, и данные были теряться

  • ViewScoped: Новый боб будет создан, как только вы перейти на другую страницу (page-2 в вашем случае)

    NB: Новый компонент будет также создаваться каждый раз, когда вы взаимодействуете с одной и той же страницы, используя возвращаемое значение отличается чем void или null.

  • @ApplicationScoped: Просто не имеет никакого смысла в этом примере (использовать его только тогда, когда вы хотите поделиться данными/состояние между всеми пользователями)

Я сильно Recommand вам взглянуть на это Q/A: How to choose the right bean scope?, который содержит подробное объяснение того, как правильно выбирать области видимости бобов.

Другие предложения могут быть рассмотрены, которая зависит от вашего Функционального требований и/или применение среда:

  1. Как вы используете один и тот же компонент в обеих страницах, вы можете considere с помощью одной страницы JSF и используйте атрибуты rendered, затем вы можете аннотировать свой bean-компонент как @ViewScoped (В этом случае не забудьте вернуть void или null в метод действия вашего компонента). Здесь вы можете найти несколько примеров: The benefits and pitfalls of @ViewScoped. Или,

  2. Вы можете использовать новую Flash scope концепции, пример можно найти здесь: Understand Flash Scope in JSF2.Или,

  3. Если в вашей среде уже поддерживают КДИ (Или же вы можете просто добавить поддержку CDI), затем с помощью @ConversationScoped будет лучшим выбором в отношении вашего дела, вы можете найти хороший пример здесь: How does JSF 2 ConversationScope work?. Или,

  4. После комментария Kukeltje, вы можете использовать @ViewAccessScoped или @GroupedConversationScoped обеспечивается Apache DeltaSpike, которые являются более гибкими, чем станд. @ConversationScoped.

+0

Я не хотел редактировать ваш ответ напрямую, но я думаю, что лучшая область в этих случаях - это [@ViewAccessScoped] (http://deltaspike.apache.org/documentation/jsf.html#__viewaccessscoped), доступная в DeltaSpike. Он короче, чем SessionScoped, дольше, чем ViewScoped, и сравнивается с ConversationScoped, он «автоматически» поддерживается – Kukeltje

+0

@Kukeltje Спасибо за информацию, но я ответил так, потому что OP, похоже, говорит только о облаках JSF, без упоминания поддержки CDI или любого другого librairies. Так как мы на самом деле не являемся сейчас точной средой, в которой он работает, я сначала предложил выбрать подходящий компонент (в случае, если он должен работать только с областями JSF), тогда я представил дополнительные предложения, если он не полагается на области JSF только. Таким образом, использование '@ ViewAccessScoped' для меня является дополнительным предложением, если он хочет использовать внешние библиотеки (BTW, я не был знаком с этой областью, с удовольствием узнаю дополнительную информацию) – Tarik

+0

@Kukeltje обновлено с вашим предложением – Tarik

Смежные вопросы