Это будет первый из небольшой серии блогов, посвященных предлагаемым новым функциям в JSF 2.0. Имейте в виду, что ни одна из описанных функций не является окончательной и может измениться, но это хорошая возможность показать эти функции в том виде, в каком они существуют в настоящее время, и дать незаконную обратную связь.
Скоро мы начнем публиковать ночные сборки Mojarra 2.0.0 на сайте проекта, но пока вам придется проверять исходные коды и создавать реализацию самостоятельно (к счастью, сборка очень проста).
Итак, что такое функция ProjectStage? Короче говоря, JSF 2.0 EG дал добро на функциональность Ruby on Rails RAILS_ENV .
javax.faces.application.ProjectStage предоставляет следующие параметры:
- производство
- развитие
- Модульный тест
- SystemTest
- расширение
Эти значения настраиваются через контекстный параметр init следующим образом:
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
Во время выполнения вы можете запросить объект Application для настроенного значения, вызвав Application.getProjectStage (). Возвращаемое значение будет одним из определенных перечислений. Если явно не настроен, то по умолчанию будет ProjectStage.Production.
Все значения за пределами Расширения достаточно понятны, так для чего же Расширение ? Это позволяет разработчику использовать пользовательские этапы. Таким образом, если указано значение, которое не соответствует существующим значениям перечисления, тогда оно будет значением для использования. При вызове Application.getProjectStage () будет возвращено значение перечисления Extension. Вызов toString ()на возвращаемые значения в этот момент вернется значение, настроенное в web.xml. Это будет полезно для разработчиков, использующих инфраструктуру JSF для добавления этапов, влияющих на поведение, выходящее за рамки предопределенных типов.
В целом идея заключается в том, чтобы иметь возможность влиять на поведение JSF на основе этих значений. В качестве примера того, где это полезно: рассмотрим простое представление JSF, в котором есть несколько проверенных полей ввода и проверка не проходит Если в представлении нет компонента h: messages, страница, похоже, ничего не делает. Я не могу сказать вам, сколько сообщений на форуме я встречал, где встречаются подобные вещи, и первым ответом всегда является «добавьте h: messages в ваше представление и попробуйте снова».
Вот где приходит ProjectStage: если текущим этапом является разработкаи нет h: сообщения присутствуют в представлении, мы добавим одно автоматически для пользователя. Если этап « Производство», мы не предпримем никаких действий (если пользователь
исправит все это — не нужно пытаться изменить дерево).
Хотя эта функция может показаться относительно незначительной, сначала я хотел обсудить ее, поскольку она влияет на функцию, о которой я буду рассказывать в следующей статье — следите за обновлениями!
ОБНОВЛЕНИЕ: 19.02.2008 — Реализована конфигурация JNDI
В соответствии с отзывами к этой записи блога мы реализовали возможность настройки ProjectStage через JNDI. Затем сначала вызывается Application.getProjectStage (), сначала он проверяет значение из JNDI, если он не найден, а затем проверяет
параметр init контекста, в конечном итоге по умолчанию используется значение ProjectStage.Production, если не найдено настроенное значение. Имя JNDI, которое в настоящее время специфицировано, является java: comp / env / jsf / ProjectStage.
Кроме того, мы добавили JNDI ObjectFactory в Mojarra, чтобы облегчить разработчикам создание собственного глобального ресурса JNDI для настройки ProjectStage.
Вот пример того, как определить эту ObjectFactory в GlassFish:
[Img_assist | NID = 4361 | название = | убывание = | ссылка = нет | Align = нет | ширина = 640 | высота = 271]
Значение свойства stage — это то, что будет возвращено из поиска JNDI.
Следует отметить, что отображение глобальных ресурсов JNDI на ресурсы компонентов (java: comp / env), к сожалению, является процессом, специфичным для реализации. Итак, чтобы продолжить использовать GlassFish в качестве примера, вам нужно добавить запись resource-ref
в web.xml:
<resource-ref>
<res-ref-name>jsf/ProjectStage</res-ref-name>
<res-type>java.lang.String</res-type>
</resource-ref>
Затем вам нужно сопоставить res-ref-name с глобальным ресурсом JNDI через sun-web.xml (также в / WEB-INF /):
<resource-ref>
<res-ref-name>jsf/ProjectStage</res-ref-name>
<jndi-name>javax.faces.PROJECT_STAGE</jndi-name>
</resource-ref>
В качестве альтернативы, настройка JNDI может быть выполнена с помощью простой записи env в файле web.xml, но это не позволяет настроить ProjectStage для всех приложений без изменения файла web.xml.