Введение во внедрение контекстов и зависимостей и JSF 2.0

Составитель: Энди Гибсон (Andy Gibson), редактор: Трой Джуниперо (Troy Giunipero)

Содержимое на этой странице применимо к IDE NetBeans 7.1, 7.2 и 7.3

Внедрение контекстов и зависимостей (CDI), определяемое документом JSR-299, является неотъемлемой частью Java EE 6 и обеспечивает архитектуру, позволяющую компонентам Java EE (например, сервлетам, компонентам EJB и JavaBeans) существовать в жизненном цикле приложения с четко определенными контекстами. Кроме того, службы CDI позволяют компонентам Java EE (например, компонентам сеансов EJB и управляемым компонентам JavaServer Faces) внедряться и свободно взаимодействовать путем запуска и обработки событий.

Этот учебный курс основан на записи блога Энди Гибсона (Andy Gibson) Введение в JSF 2.0 и CDI в JEE 6. В нем рассматривается использование среды IDE для настройки веб-проекта Java с поддержкой JSF 2.0 и CDI. Затем описано связывание управляемых компонентов CDI со страницами Facelets и приводится краткий пример интеграции CDI и технологии EJB.

В NetBeans IDE обеспечена встроенная поддержка для внедрения контекстов и зависимостей, включая поддержку создания файла конфигурации CDI beans.xml при создании проекта, поддержку редактора и навигации для аннотаций, а также различных мастеров для создания часто используемых артефактов CD.


Для работы с этим учебным курсом требуется программное обеспечение и материалы, перечисленные ниже.

Программное обеспечение или материал Требуемая версия
IDE NetBeans 7.1, 7.2, 7.3, пакет Java EE
Комплект для разработчика на языке Java (JDK) версия 6
Сервер GlassFish Open Source Edition 3.1 или 3.0.1

Примечания

  • The IDE NetBeans Java bundle also includes the GlassFish Server Open Source Edition 3.x, which is a Java EE 6-compliant container.
  • Поддержка CDI также доступна в NetBeans 6.8 после установки Исправления 1.

Создание веб-проекта Java с поддержкой CDI

В этом упражнении выполняется создание веб-проекта Java с поддержкой JSF 2.0 и CDI.

  1. Нажмите кнопку 'Создать проект' ( Кнопка 'Создать проект' ) на главной панели инструментов IDE (Ctrl-Shift-N; ⌘-Shift-N в Mac).
  2. В мастере создания проекта выберите категорию Java Web и команду "Веб-приложение". Нажмите кнопку "Далее".
  3. Введите cdiDemo в качестве имени проекта и укажите местоположение проекта. Нажмите кнопку "Далее".
  4. Укажите "GlassFish 3.x" в качестве сервера и "Java EE 6 Web" в качестве версии Java EE. Убедитесь, что установлен флажок "Разрешить внедрение контекстов и зависимостей".
    Включить параметр CDI, предоставленный в мастере создания веб-приложений
    При выборе параметра "Включить внедрение контекстов и зависимостей" создается файл beans.xml в папке проекта WEB-INF при создании шаблона проекта. Файл beans.xml используется CDI для указания серверу, совместимому с Java EE, что проект является модулем, содержащим компоненты CDI.
  5. Нажмите кнопку "Далее".
  6. На панели "Платформы" выберите параметр JavaServer Faces.
  7. Перейдите на вкладку "Настройка" и убедитесь, что в качестве предпочтительного языка страницы выбран "Facelets". Нажмите кнопку "Завершить".

    При нажатии кнопки "Завершить" в среде IDE создается проект веб-приложения и в редакторе открывается страница приветствия index.xhtml.

  8. В окне "Проекты" откройте папку Web Pages > WEB-INF и обратите внимание на отображаемый файл beans.xml Файл пуст, но может использоваться как альтернатива аннотациям для указания информации, связанной с компонентами, в формате XML.
    Новый проект отображается в окне 'Проекты'

    Если развернуть узел "Библиотеки > Сервер GlassFish", вы увидите, что была автоматически добавлена библиотека weld-osgi-bundle.jar. В состав сервера GlassFish входит Weld, который является реализацией спецификации CDI JSR-299 от JBoss.

Доступ к Beans из языка выражений JSF

В этом упражнении демонстрируется способ связи компонентов, управляемых CDI, со страницами Facelets с помощью синтаксиса EL.

  1. В окне "Проекты" щелкните правой кнопкой узел "Исходные файлы" и выберите команду "Создать" > "Класс Java".
  2. В мастере создания класса Java введите имя класса MessageServerBean и введите exercise1 в поле "Пакет". Новый пакет будет создан после завершения работы мастера.
    Мастер создания классов Java
  3. Нажмите кнопку "Завершить". Создаются новый пакет и класс, после чего класс открывается в редакторе.
  4. Создайте аннотацию к классу с помощью javax.inject.Named и создайте простой метод, возвращающий строку.
    package exercise1;
    
    import javax.inject.Named;
    
    @Named
    public class MessageServerBean {
    
        public String getMessage() {
            return "Hello World!";
        }
    }
    После ввода аннотации @Named нажмите сочетание клавиш CTRL+ПРОБЕЛ для вызова автозавершения кода и документации Java. Если применить аннотацию с помощью функций автозавершения кода редактора (например, выбрав подходящую аннотацию и нажав ENTER), в файл автоматически добавляется оператор импорта .

    Во всплывающем окне Javadoc также можно нажать кнопку 'Показывать документацию во внешнем веб-браузере' ( Показать документацию с помощью кнопки во внешнем веб-браузере ) для отображения полноразмерного Javadoc в отдельном окне.
  5. Сохраните файл (сочетание клавиш Ctrl-S; ⌘-S в Mac). После добавления аннотации @Named класс MessageServerBean стал управляемым компонентом , в соответствии с определением CDI.
  6. Переключитесь в редакторе на страницу Facelets index.xhtml(нажмите сочетание клавиш CTRL+TAB) и добавьте следующий текст в теги <h:body>.
    <h:body>
        Hello from Facelets
        <br/>
        Message is: #{messageServerBean.message}
        <br/>
        Message Server Bean is: #{messageServerBean}
    </h:body>
    Для отображения подсказок автозавершения кода можно нажать сочетание клавиш CTRL+ПРОБЕЛ внутри выражения EL. Списки автозавершения редактора содержат управляемые компоненты и их свойства. Поскольку аннотация @Named преобразует класс MessageServerBean в управляемый компонент, он становится доступным в синтаксисе EL, как если бы он был управляемым компонентом JSF.
    Мастер создания классов Java
  7. Нажмите кнопку 'Запустить проект' (Кнопка 'Выполнить проект') на главной панели инструментов IDE. Файл компилируется и развертывается в GlassFish, и страница приветствия приложения (index.xhtml ) отображается в веб-браузере. На странице отображается текст "Hello World!" из MessageServerBean.
    Страница приветствия отображается в браузере
  8. Вернитесь к компоненту сообщения и измените сообщение на другое (например, "Hello Weld!"). Сохраните файл (Ctrl-S; ⌘-S в Mac), затем обновите браузер. Автоматически отображается новое сообщение. Это происходит благодаря возможности "Развертывание при сохранении" среды IDE, все сохраненные изменения вызывают компиляцию и повторное развертывание на сервере.

    В третьей строке на этой странице видно, что имя класса – exercise1.MessageServerBean Обратите внимание, что компонент представляет собой объект POJO (Plain Old Java Object, простой старый объект Java). Несмотря на использование Java EE, при разработке отсутствует комплексная иерархия классов, связанная уровнями транзакций, перехватами и другие сложные особенности.

Порядок действий

При развертывании приложения наличие файла beans.xml означает, что модуль содержит управляемые компоненты CDI, поэтому в классах производится поиск аннотаций CDI. В модуле CDI все компоненты регистрируются в Weld, и для сопоставления компонентов с точками внедрения используется аннотация @Named. При отображении страницы index.xhtml JSF пытается разрешить значение messageServerBean на странице с применением зарегистрированных средств разрешения выражений JSF. Одно из них – средство разрешения Weld EL имеет класс MessageServerBean, зарегистрированный под именем MessageServerBean Можно было указать другое имя в аннотации @Named, но поскольку это не было сделано, класс был зарегистрирован под именем по умолчанию, которое совпадает с именем класса, первая буква которого находится в нижнем регистре. Средство разрешения Weld возвращает экземпляр этого компонента в ответ на запрос JSF. Именование компонентов требуется только при использовании выражений EL и не должно использоваться в качестве механизма внедрения, поскольку CDI обеспечивает безопасность по типу при внедрении по типу класса и аннотациям квалификатора.


Переход к EJB

Благодаря EJB 3.1 и использованию стека Java EE можно с небольшими изменениями легко развертывать компонент в качестве EJB.

  1. Откройте MessageServerBean и добавьте аннотацию javax.ejb.Stateless на уровне класса, затем замените строку на "Hello EJB!".
    package exercise1;
    
    import javax.ejb.Stateless;
    import javax.inject.Named;
    
    /**
     *
     * @author nbuser
     */
    @Named
    @Stateless
    public class MessageServerBean {
    
        public String getMessage() {
            return "Hello EJB!";
        }
    }
  2. Сохраните файл (Ctrl-S; ⌘-S в Mac), затем перейдите в браузер и обновите. Отображается приблизительно следующее:
    Сведения о EJB отображается в браузере
    Поразительно, POJO превратился в полнофункциональный EJB с помощью всего одной аннотации. После сохранения изменений и обновления страницы были отображены изменения. Для этого не потребовалось проводить комплексную настройку проекта, создавать локальные интерфейсы или сложные дескрипторы развертывания.

Различные типы EJB

Также можно использовать аннотацию @Stateful. В качестве альтернативы можно использовать новую аннотацию @Singleton для экземпляров единичных классов. При этом существует две аннотации: javax.ejb.Singleton и javax.inject.Singleton. Эти аннотации соответствуют двум видам единичных классов. Единичный класс CDI javax.inject.Singleton позволяет определить экземпляр единичного класса вне EJB при использовании CDI в окружении, отличном от EJB. Единичный класс EJB javax.ejb.Singleton предоставляет все возможности EJB, например управление транзакциями. Поэтому можно сделать выбор в зависимости от потребностей и от того, используется ли среда EJB.


Дополнительные сведения

В следующей части рассматривается внедрение CDI и приведены подробности использования CDI для управления зависимостями в среде Java EE 6.

Дополнительные сведения о CDI и JSF 2.0 приведены в следующих материалах.

get support for the NetBeans

Support


By use of this website, you agree to the NetBeans Policies and Terms of Use. © 2013, Oracle Corporation and/or its affiliates. Sponsored by Oracle logo