2010-11-22 3 views
10

В настоящее время я изучаю JSF 2.0, и я так рад за существование этой функции области разговора, что очень полезно при открытии новой вкладки или в новом окне на одна и та же страница и имеет отдельные ресурсы, не перекрывая друг друга.JSF CDI: область разговора по бокам [s] лучшая практика

Но им любопытно, как это реализовать в хорошем смысле, о том, когда начать разговор и когда его закрыть.

В моем случае у меня есть каждый CDI-компонент для каждой страницы JSF. И скажем, что у меня есть меню, и когда его нажимают, это приведет к странице A, а от A может привести к B, B может привести к тому, что C, C может привести к D, все эти 4 страницы связаны в одном цепь.

Доступ к свойствам A из компонентов B или C или D возможен, доступ к свойствам B также возможен из C или D-компонентов и так далее.

Теперь им совсем запутались:

  • ли все эти A B C D должен быть в разговоре рамки или нет, возможно, просто? Потому что я думаю, что иногда с другой страницы, которая за пределами цепи ABCD, например, на странице F, она может перейти на страницу B, , хотя я не знаю, как поставить данных bean B еще.
  • ли все эти ABCD должны быть объединены в один боб
  • , где и когда начать разговор, им думать о конструктора, но я не думаю, что это хорошая идея, потому что я предпочитаю, начиная разговор при первом обращении страницу, а не боб
  • , где и когда, чтобы остановить разговор, так что не будут неиспользованных ресурсов торчать

Пожалуйста, поделитесь своими мыслями с этим вопросом.

+3

CDI не входит в стандартный JSF.CDI означает контекст и инжекцию зависимостей (JSR-299), который охватывает аннотации пакета 'javax.enterprise'. Область разговора также не является частью стандартного JSF. Это было изобретение JBoss Seam во времена JSF 1.2 и было принято спецификацией JSF 2.0 как View Scope, togglable посредством аннотации '@ ViewScoped'. Теперь, о чем вы на самом деле говорите? – BalusC

+0

Здравствуйте, BalusC, спасибо за разъяснение. Я использовал термин CDI, чтобы четко понять, что я использую, но, может быть, эта информация не связана с моим вопросом, мои извинения :) Насколько я знаю, @ViewScoped предназначен для того, чтобы одна страница была повторно отображена, и свойства будут сохранялось. Но то, что я хотел достичь из области разговора, заключается в том, что я могу открыть одну и ту же страницу на нескольких вкладках, причем каждая вкладка будет иметь свою собственную область сеанса. Поэтому, отправляя значение «albert» на myBean.name на вкладке, не будет переопределять myBean.name на других вкладках. Но я смутился о том, с чего начать и закончить разговор. – bertie

+0

И это становится более запутанным для меня, если есть 4 страницы, например, страница A - это страница просмотра, где пользователь может выполнять поиск, страница B - это страница подробностей, где пользователь может изменять детали, на странице C пользователь может изменить суб подробно и т. д. Если бы я хотел открыть страницу A на нескольких вкладках, не затрагивая другую, я должен использовать область разговора для компонента A. Но я полагаю, что это тоже будет область разговора для B C и D? Также о том, где и когда я должен начать/завершить разговор. Я имею в виду, пользователь может открыть новые вкладки и закрыть вкладки. Как я могу обнаружить это и закрыть разговор? – bertie

ответ

11

JSF 2 предоставляет области применения, просмотра, сеанса и приложений. CDI вводит область разговора, но что более важно, она вводит стандарт, по которому новые возможности могут быть добавлены на платформу.

Охват, который вы описываете, вероятно, лучше подходит для пользовательской области, такой как область окна. Два проекта, реализующие эту область, являются:

  1. Apache MyFaces CODI
  2. ICEfaces имеет JSF (не-CDI) Window scope implementation.

Тем не менее, я бы посоветовал вам переосмыслить структуру вашего компонента. Я очень увлекся областью представления в сочетании с параметрами представления JSF 2 для распространения информации с одной страницы на другую (и из одного экземпляра области обзора в другой).

Объект «Просмотр доступа» MyFaces выглядит как еще один опрятный подход, когда компонент остается в области видимости, пока страницы, на которые вы ориентируетесь, сохраняют ссылку на эту область.

+0

Спасибо! Я тоже думал о View scope, и он также может использоваться в среде с несколькими или несколькими окнами. То, что вы имели в виду, передавая параметры просмотра из одного вида viewcope в другой viewcope, заключается в том, что тот, который был достигнут с помощью кнопки h: и вложенного f: param, и с f: метаданных с вложенным f: viewParam, я прав? Если im не ошибается, кнопка h: приведет к запросу GET, и это создает для меня проблему, поскольку иногда, например, нажатие удаления со страницы B (POST) вернет навигацию на страницу A. Есть ли способ отправить в этом случае параметр param из B в A? – bertie

+0

Вы можете добавить строку «? IncludeViewParams = true» в правило навигации, и параметры вида, определенные на «целевой странице», будут автоматически включены для вас. –

+0

Хорошо, спасибо. Прочитайте об этом один раз, но никогда не думали использовать его раньше. Я думаю, что я привык к области сеанса, где все там, где оно есть. Должен попробовать это :) – bertie

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