По состоянию на JSF 2.x есть 4 боковых области:
- @SessionScoped
- @RequestScoped
- @ApplicationScoped
- @ViewScoped
Сфера сеанса: область сеанса сохраняется с момента установления сеанса до завершения сеанса. Сеанс завершается, если веб-приложение вызывает метод invalidate объекта HttpSession или время его истечения.
RequestScope: область запроса недолговечна. Он начинается, когда HTTP-запрос отправляется и заканчивается после отправки ответа клиенту. Если вы поместите управляемый компонент в область запроса, с каждым запросом создается новый экземпляр. Стоит рассмотреть область запроса, если вас беспокоит стоимость хранения области сеанса.
ApplicationScope: область применения сохраняется на весь срок действия веб-приложения. Эта область распределяется между всеми запросами и всеми сеансами. Вы размещаете управляемые компоненты в область приложения, если один компонент должен быть общим для всех экземпляров веб-приложения. Компонент создается, когда он сначала запрашивается любым пользователем приложения, и он остается в живых до тех пор, пока веб-приложение не будет удалено с сервера приложений.
ViewScope: область просмотра добавлена в JSF 2.0. Объект с видимым компонентом сохраняется, пока страница с JSF повторно отображается. (Спецификация JSF использует термин term для страницы JSF.) Как только пользователь переходит на другую страницу, компонент не работает.
Выберите область действия, основанную на ваших требованиях.
blockquote>Источник: Core Java Server Faces 3rd Edition от David Geary & amp; Кей Хорстманн [Стр. 51 - 54] [/g1]
Ответ Денниса правильный. Однако я хотел бы объяснить это решение немного более подробно (для пользователя Windows):
regedit
в поле поиска. HKEY_LOCAL_MACHINE\Software\JavaSoft
(теперь у Windows 10 есть это: HKEY_LOCAL_MACHINE\Software\WOW6432Node\JavaSoft
) New
-> Key
Prefs
, и все должно работать. В качестве альтернативы сохраните и выполните файл *.reg
со следующим содержимым:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs]
Это случилось со мной.
По-видимому, это связано с тем, что у Java нет разрешения на создание разделов реестра.
Проблема в том, что простая консоль не может редактировать реестр. Не нужно редактировать реестр вручную, просто запустите groovysh
один раз с административными привилегиями. Все последующие запуски работают без ошибок.
Я смог решить проблему, вручную создав следующий раздел реестра:
HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
Это на самом деле ошибка JDK. За несколько лет он сообщался несколько раз, но только в 8139507 он был серьезно воспринят Oracle.
Проблема заключалась в исходном коде JDK для WindowsPreferences.java
. В этом классе оба узла userRoot
и systemRoot
были объявлены как статические, как в:
/**
* User root node.
*/
static final Preferences userRoot =
new WindowsPreferences(USER_ROOT_NATIVE_HANDLE, WINDOWS_ROOT_PATH);
/**
* System root node.
*/
static final Preferences systemRoot =
new WindowsPreferences(SYSTEM_ROOT_NATIVE_HANDLE, WINDOWS_ROOT_PATH);
Это означает, что при первом обращении к классу статические переменные инициируется и этим будет создан ключ реестра для HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
(= системное дерево), если он еще не существует.
Таким образом, даже если пользователь принял все меры предосторожности в своем собственном коде и никогда не касались или не ссылались на системное дерево, тогда JVM на самом деле все равно попытается создать экземпляр systemRoot
, тем самым вызывая предупреждение. Это интересная тонкая ошибка.
В июне 2016 года исправлено право на источник JDK. Будет интересно посмотреть, будет ли он включен в Java 8.
Что вы см. на самом деле предупреждение от внутреннего регистратора JDK. Это не исключение. Я считаю, что предупреждение можно смело игнорировать ... если код пользователя действительно не хочет системных предпочтений, но это очень редко.
Ошибка не отображалась в версиях до Java 1.7.21, потому что до этого установщик JRE создавал для вас ключ реестра HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
, и это эффективно скрыть ошибку. С другой стороны, вам никогда не требовалось запускать установщик, чтобы иметь JRE на вашей машине, или, по крайней мере, это не было намерением Sun / Oracle. Как вам известно, Oracle много лет распространяет JRE для Windows в формате .tar.gz
.
Если кто-то пытается решить эту проблему в 64-разрядной версии Windows, возможно, вам потребуется создать следующий ключ:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs
Была аналогичная проблема при запуске apache jmeter в Windows 8 64 бит:
[]apache-jmeter-2.13\bin>jmeter
java.util.prefs.WindowsPreferences <init>
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.
Успешно использовалось решение Dennis Traub с объяснениями Mkorsch. Или вы можете создать файл с расширением «reg» и записать в него следующее:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs]
... затем выполнить его.
Я получил следующее сообщение:
Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002
, и он исчез после создания одного из этих разделов реестра, у меня 64 бит, поэтому я попробовал только это.
32 bit Windows
HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
64 bit Windows
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs