Начало работы с приложениями Java EE 6
В этом документе содержится краткое описание некоторых возможностей, добавленных в спецификацию Java Enterprise Edition 6 (Java EE 6). Для демонстрации новых возможностей в этом руководстве будет представлен пример создания простого веб-приложения Java EE 6, содержащего фасад сеансного компонента без сохранения состояния EJB 3.1 для класса сущностей. Для создания класса сущностей и сеансного компонента в среде IDE используются мастеры. В созданном с помощью мастера коде используются запросы, определенные в интерфейсе Criteria API, который добавлен в JPA 2.0 и входит в состав спецификации Java EE 6. Затем создается управляемый компонент с именем, имеющий доступ к фасаду сеанса и уровню представления, на котором используется инфраструктура вида Facelets, как указано в JSF 2.0.
Данное руководство основано на сообщении в блоге Простейший компонент JSF 2 / EJB 3.1 / JPA - с развертыванием WAR , Адам Бьен (Adam Bien). Дополнительные примеры по Java EE можно найти в проекте Kenai Эдама Бьена (Adam Bien) Шаблоны Java EE и практические рекомендации, а также в его книге "Реальные шаблоны Java EE - пересмотр практических рекомендаций", которую можно найти по адресу http://press.adam-bien.com.
Упражнения по темам руководства
Для работы с этим руководством требуются программное обеспечение и ресурсы, перечисленные ниже.
Примечания.
- Для среды IDE NetBeans 6.9, 7.0 и сервера GlassFish 3.x необходим пакет программ для разработки приложений на языке Java (JDK) 6.
Предпосылки
Предполагается, что читатель обладает базовыми знаниями по следующим технологиям или опытом программирования с их использованием:
- Программирование на Java
- Среда IDE NetBeans
Можно загрузить готовый проект в виде архива ZIP.
Создание проекта веб-приложения
В этом упражнении создается простое веб-приложение. При создании веб-приложения укажите входящий в комплект поставки сервер приложений GlassFish Server 3 в качестве целевого контейнера Java EE. Сервер GlassFish совместим с Java EE и включает в себя библиотеки JSF 2.0, требуемые для этого приложения.
В мастере создания проекта выберите Java EE 6 Web в качестве версии Java EE. Java EE 6 Web является упрощенным профилем Java EE 6, который содержит подмножество полной платформы Java EE 6. Профиль Java EE 6 Web разработан для веб-приложений, для которых не требуются расширенные технологии Java EE 6, такие как поддержка удаленных интерфейсов, полная спецификация EJB 3.1 и интерфейс API службы передачи сообщений (JMS).
Веб-профиль поддерживает обработку транзакций и управление сохранением состояния, которые часто используются в веб-приложениях уровня предприятия. Веб-профиль Java EE Web можно использовать для веб-приложений, в которых применяются сеансные компоненты с локальным интерфейсом или без интерфейса. При использовании в приложении удаленного интерфейса необходим полный профиль Java EE.
- Выберите в главном меню "Файл" > "Создать проект" (CTRL+SHIFT+N).
- Выберите веб-приложение из категории "Java Web" и нажмите кнопку "Далее".
- Введите SimpleEE6App в качестве имени проекта и укажите местоположение проекта.
- Снимите флажок "Использовать отдельную папку", если он установлен. Нажмите кнопку "Далее".
(В рамках этого руководства копирование библиотек проекта в отдельную папку нецелесообразно, поскольку совместное использование библиотек с другими пользователями или проектами не требуется.)
- Выберите сервер GlassFish и установите в поле "Версия Java EE" версию Java EE 6 Web. Нажмите кнопку "Далее".
- Выберите в панели "Платформы" JavaServer Faces. Нажмите кнопку "Готово".
В случае разработки веб-приложения Java EE 6 и его развертывания на сервере GlassFish в среде IDE По умолчанию устанавливается библиотека JSF 2.0. Библиотека JSF 2.0 обеспечивает возможность использования архитектуры Facelets для языка страницы, а также поддержку для JSF 1.2 и JSP.

При нажатии кнопки "Завершить" проект будет создан в среде IDE, который откроется в окне "Проекты". В среде IDE автоматически будет создана страница JSF index.xhtml и открыта в редакторе.
Создание класса сущностей и фасада сеанса
В этом разделе будет создан класс сущностей и фасад сеанса для класса сущностей. Класс сущностей – это простой старый объект Java (Plain Old Java Object, POJO), простой класс Java, идентифицированный аннотацией @Entity как сущность. Начиная со спецификации Java EE 5 классы сущностей можно использовать в качестве устойчивых объектов для представления таблиц в базе данных. Интерфейс Java Persistence API позволяет использовать сохранение состояния в веб-приложениях без необходимости создания модуля EJB.
Фасад сеанса для класса сущностей в этом приложении является сеансным компонентом без сохранения состояния. Архитектура Enterprise JavaBean (EJB) 3.1, добавленная в спецификацию Java EE 6, позволяет создавать сеансные компоненты без бизнес-интерфейсов, которые требовались в EJB 3.0. Кроме того, спецификация Java EE 6 позволяет запаковывать компоненты EJB непосредственно в архив WAR. Благодаря этому упрощается разработка небольших приложений за счет исключения необходимости создания отдельных модулей EJB, которые запаковываются как архив JAR в архив EAR. Однако для больших приложений J2EE, которые распределяются на разных машинах, остается необходимость в создании архивов EAR для отделения бизнес-логики от уровня представления.
Подробные сведения об использовании EJB 3.1 в среде IDE приведены в учебном курсе Создание приложения J2EE с помощью EJB 3.1.
Подробные сведения о классах сущностей приведены в главе Введение в интерфейс Java Persistence API в учебном курсе по Java EE 6. Часть I.
Подробные сведения о сеансных компонентах приведены в главе Что такое сеансный компонент? в учебном курсе по Java EE 6, часть I.
Создание класса сущностей
В этом упражнении с помощью мастера создания класса сущностей будет создан простой устойчивый класс сущностей. Также будет описан мастер создания единицы сохранения состояния, которая определяет источник данных и диспетчер сущностей, используемые в приложении. Будет добавлено одно поле в класс для представления данных в таблице и созданы методы получения и установки для нового поля.
Класс сущностей должен иметь первичный ключ. При создании класса сущностей с помощью мастера в среде IDE по умолчанию создается поле id и создается аннотация @Id для объявления этого поля в качестве первичного ключа. Также в среде IDE добавляется аннотация @GeneratedValue и указывается стратегия создания ключей для первичного поля id.
Использование в проекте интерфейса Java Persistence значительно упрощает разработку приложения в силу отсутствия необходимости настройки дескрипторов развертывания для определения информации относительно объектно-реляционного сопоставления для сохраняющих состояние полей или свойств. Вместо этого можно использовать аннотации для определения этих свойства непосредственно в простом классе Java.
Сохранением состояния объекта управляет интерфейс API EntityManager. Интерфейс API EntityManager обрабатывает контекст сохранения состояния, а каждый контекст сохранения состояния представляет собой группу экземпляров объекта. При разработке приложения для обозначения устойчивого экземпляра контекста для классов сущностей к классу можно добавить аннотации. В дальнейшем жизненный цикл экземпляров объекта управляется контейнером.
Для создания класса сущностей выполните следующие действия.
- Щелкните узел проекта правой кнопкой мыши и выберите команду "Создать" > "Другие".
- Выберите "Класс сущностей" в категории "Сохранение состояния". Нажмите кнопку "Далее".
- В поле "Имя класса" введите Message.
- В поле "Пакет" введите entities.
- Нажмите кнопку "Создать модуль сохранения состояния". Нажмите кнопку "Далее".
Примечание. При нажатии в среде IDE NetBeans 6.8 кнопки "Создать модуль сохранения состояния" будет открыто диалоговое окно создания модуля сохранения состояния.
- Выберите источник данных (например, выберите jdbc/sample, если необходимо использовать JavaDB).
Источник данных для jdbc/sample находится в составе пакета среды IDE при установке среды IDE и сервера приложений GlassFish. Однако можно указать другой источник данных, если это необходимо.
Можно сохранить другие параметры по умолчанию (имя единицы сохранения состояния, поставщик сохранения состояния EclipseLink). Убедитесь в том, что для единицы сохранения состояния используется интерфейс Java Transaction API и что для стратегии создания таблиц установлено значение "Создать", т. е. таблицы на основе классов сущностей создаются при развертывании приложения.
- В мастере создания единицы сохранения состояния нажмите кнопку "Завершить".
При нажатии кнопки "Завершить" в среде IDE будет создан класс сущностей, который откроется в редакторе. Как видно из примера, в среде IDE было создано поле id private Long id;, и для поля созданы аннотации @Id и @GeneratedValue(strategy = GenerationType.AUTO).
- В редакторе добавьте поле message (выделено полужирным шрифтом) под полем id.
private Long id;
private String message;
- Правой кнопкой мыши щелкните в области редактора и выберите команду "Вставить код" (CTRL+I), затем выберите "Методы получения и установки".
- В диалоговом окне "Создание методов получения и установки" выберите поле message и нажмите кнопку "Создать".
В среде IDE будут созданы методы получения и установки для поля message.

- Сохраните изменения.
Класс сущностей представляет собой таблицу в базе данных. При запуске этого приложения автоматически будет создана таблица базы данных для сообщения. Таблица будет состоять из столбцов id и message.
Если проанализировать единицу сохранения состояния в редакторе XML, можно увидеть, что в приложении используется интерфейс Java Transaction API (JTA) (transaction-type="JTA"). Это указывает на то, что управление жизненным циклом сущностей в контексте сохранения состояния осуществляется контейнером. В результате требуется меньше строк кода, так как жизненный цикл сущностей управляется контейнером, а не приложением. Подробные сведения об использовании JTA для управления транзакциями приведены в документации по интерфейсу Java Transaction API.
Создание фасада сеанса
В этом упражнении будет использоваться мастер создания фасада сеанса без сохранения состояния для сущности Message. Согласно спецификации EJB 3.1. теперь бизнес-интерфейсы для сеансных компонентов не являются обязательными. В этом приложении, где клиент, имеющий доступ к компоненту, является локальным клиентом, для отображения компонента существует возможность использования представления с локальным интерфейсом или без интерфейса.
Для создания сеансного компонента выполните следующие шаги.
- Щелкните узел проекта правой кнопкой мыши и выберите команду "Создать" > "Другие".
- Выберите "Сеансные компоненты" для "Классов сущностей" из категории "Java EE". Нажмите кнопку "Далее".
- Выберите сущность Message и нажмите кнопку "Добавить". Нажмите кнопку "Далее".
- В поле "Пакет" введите boundary. Нажмите кнопку "Завершить".
Обратите внимание на то, что создавать бизнес-интерфейс для сеансного компонента не требуется. Вместо этого в данном приложении компонент будет отображаться для локально управляемого компонента в представлении без интерфейса.

При нажатии кнопки "Готово" в среде IDE создается класс фасада сеанса MessageFacade.java и AbstractFacade.java, и в редакторе открываются файлы. Аннотация @Stateless, используемая в приведенном созданном коде, служит для объявления класса MessageFacade.java в качестве элемента сеансного компонента без сохранения состояния. Класс MessageFacade.java расширяет класс AbstractFacade.java, содержащий бизнес-логику и управляющий транзакцией.
@Stateless
public class MessageFacade extends AbstractFacade<Message> {
@PersistenceContext(unitName = "SimpleEE6AppPU")
private EntityManager em;
При создании фасада для сущности с помощью мастера в среде IDE по умолчанию добавляется аннотация PersistenceContext (@PersistenceContext(unitName = "SimpleEE6AppPU")) для ввода ресурса диспетчера сущностей в элемент сеансного компонента и для определения имени единицы сохранения состояния. В этом примере имя единицы сохранения состояния объявлено явно, но имя не является обязательным, если в приложении используется только одна единица сохранения состояния.
Кроме того, среда IDE создает методы в AbstractFacade.java для создания, редактирования, удаления и поиска сущностей. В интерфейсе API EntityManager определяются методы взаимодействия с контекстом сохранения состояния. При этом в среде IDE создается несколько часто используемых методов запроса по умолчанию, которые могут использоваться для поиска объектов сущностей. В методах findAll, findRange и count используются методы, определенные в интерфейсе Criteria API для создания запросов. Интерфейс Criteria API добавлен в спецификацию JPA 2.0 в составе спецификации Java EE 6.
Создание управляемого компонента JSF и страниц JSF
В примере в этом разделе с помощью JavaServer Faces (JSF) 2.0 будет создан уровень представления для приложения и управляемый базовый компонент, используемый на страницах JSF. Спецификация JSF 2.0 добавляет поддержку для Facelets в качестве предпочитаемой технологии управления представлением для приложений на основе JSF. Начиная с версии JSF 2.0, можно использовать аннотацию @ManagedBean в исходном коде для объявления класса управляемого компонента. Для объявления управляемых компонентов JSF больше не требуется добавлять записи в файл faces-config.xml. Для получения доступа к методам в управляемом компоненте можно использовать имена компонентов на страницах JSF.
Подробные сведения о поддержке среды IDE для спецификации JavaServer Faces 2.0 приведены в разделе Поддержка JSF 2.0 в среде IDE NetBeans версии 6.8.
Подробные сведения о спецификации JavaServer Faces 2.0 приведены в разделе "Технология JavaServer Faces" в учебном курсе по Java EE 6, часть I.
Создание управляемого компонента
В этом упражнении будет создан простой управляемый компонент JSF, используемый для получения доступа к фасаду сеанса. Спецификация JSF 2.0, которая является частью Java EE 6, позволяет использовать аннотации в классе компонента для определения класса в качестве управляемого компонента JSF, указывать контекст и имя компонента.
Для создания управляемого компонента выполните следующие шаги.
- Щелкните узел проекта правой кнопкой мыши и выберите команду "Создать" > "Другие".
- Выберите "Управляемый компонент JSF" в категории "JavaServer Faces". Нажмите кнопку "Далее".
- В поле "Имя класса" введите MessageView.
Имя управляемого компонента MessageView используется в качестве значения для inputText и commandButton на странице JSF index.xhtml при вызове методов в компоненте.
- В поле "Пакет" введите my.presentation.
- В поле "Имя", используемое для управляемого компонента, введите MessageView.
Примечание. При создании управляемого компонента с помощью мастера компоненту в среде IDE по умолчанию будет присвоено имя на основе имени класса компонента, начинающееся со строчной буквы. Для наглядности присвоим компоненту имя, начинающееся с прописной буквы, явным образом. При ссылке на этот компонент вместо messageView на страницах JSF будет использоваться MessageView. Если имя не присваивается явным образом, по умолчанию на страницах JSF используется messageView.
- Установите контекст для запроса. Нажмите кнопку "Завершить".
При нажатии кнопки "Завершить" в среде IDE будет создан класс компонента, который откроется в редакторе. В окне "Проекты" выводятся следующие файлы.
В редакторе можно увидеть, что в среде IDE добавлены аннотации @ManagedBean и @RequestScoped и имя компонента.
@ManagedBean(name="MessageView")
@RequestScoped
public class MessageView {
/** Создает новый экземпляр MessageView */
public MessageView() {
}
}
Теперь добавляем аннотацию @EJB для использования учета зависимостей, чтобы получить ссылку на сеансный компонент MessageFacade. Также вызовем методы findAll и create, представленные в фасаде. Автозавершение кода среды IDE помогает при вводе методов.
- Правой клавишей мыши щелкните в области редактора и выберите команду "Вставить код" (CTRL+I) для открытия всплывающего меню.
- В всплывающем меню выберите "Вызов компонента EJB".
- В диалоговом окне "Вызов компонента EJB" выберите MessageFacade. Нажмите кнопку "OК".
При нажатии кнопки "ОК" в среде IDE добавляется следующий код (выделено полужирным шрифтом) для ввода компонента.
public class MessageView {
/** Создание экземпляра MessageView */
public MessageView() {
}
// Ввод компонента сеанса MessageFacade при помощи аннотации @EJB
@EJB
private MessageFacade messageFacade;
}
- Для создания нового экземпляра добавьте следующий код.
/** Создает новый экземпляр MessageView */
public MessageView() {
this.message = new Message();
}
- Добавьте следующий код к классу.
// Создает новое поле
private Message message;
// Создает новый экземпляр Message
public MessageView() {
this.message = new Message();
}
// Вызывает getMessage для получения сообщения
public Message getMessage() {
return message;
}
// Возвращает общее число сообщений
public int getNumberOfMessages(){
return messageFacade.findAll().size();
}
// Сохраняет сообщение и затем возвращает строку "theend"
public String postMessage(){
this.messageFacade.create(message);
return "theend";
}
- Исправьте выражения импорта (CTRL+SHIFT+I) и сохраните измененные данные.
Можно использовать автозавершение кода в редакторе, упрощающее ввод кода.
Обратите внимание, что метод postMessage возвращает строку "theend". Спецификация JSF 2.0 позволяет использование имплицитных правил перехода в приложениях, в которых используется технология Facelets. В этом приложении не настроены правила перехода в faces-config.xml. Вместо этого обработчик переходов пытается найти подходящую страницу в приложении. В этом случае обработчик переходов пытается найти страницу с именем theend.xhtml при вызове метода postMessage.
Изменение страницы-указателя
В этом упражнении будет выполнено несколько простых изменений страницы index.xhtml для добавления компонентов пользовательского интерфейса. Выполняется добавление формы с текстовым полем для ввода и кнопкой.
- Откройте в редакторе index.xhtml.
- Измените файл для добавления следующей простой формы между тегами <h:body>.
<h:body>
<f:view>
<h:form>
<h:outputLabel value="Message:"/><h:inputText value="#{MessageView.message.message}"/>
<h:commandButton action="#{MessageView.postMessage}" value="Post Message"/>
</h:form>
</f:view>
</h:body>
Автозавершение кода JSF может помочь при вводе кода.
- Сохраните изменения.
Компоненты inputText и commandButton вызывают методы в управляемом компоненте JSF с именем MessageView. Метод postMessage возвращает "theend", а обработчик переходов выполняет поиск страницы с именем theend.xhtml.
Создание страницы результатов
В этом упражнении будет создана страница JSF theend.xhtml. Эта страница будет отображаться при нажатии пользователем кнопки "Отправить сообщение" в index.xhtml и при вызове метода postMessage в управляемом компоненте JSF.
- Щелкните узел проекта правой кнопкой мыши и выберите команду "Создать" > "Другие".
- В категории "JavaServer Faces" выберите "Страница JSF". Нажмите кнопку "Далее".
- В поле "Имя файла" введите theend.
- Убедитесь, что выбран параметр Facelets. Нажмите кнопку "Завершить".
- Измените файл посредством ввода следующего кода между тегов <h:body>.
<h:body>
<h:outputLabel value="Thanks! There are "/>
<h:outputText value="#{MessageView.numberOfMessages}"/>
<h:outputLabel value=" messages!"/>
</h:body>
В начале ввода в среде IDE автоматически добавляется определение библиотеки тегов xmlns:h="http://java.sun.com/jsf/html к файлу для элементов JSF.
Выполнение приложения
Кодировка приложения завершена. Теперь можно протестировать приложение в обозревателе.
- Щелкните правой кнопкой мыши узел проекта в окне "Проекты" и выберите "Выполнить".
При выборе команды "Выполнить" в среде IDE происходит сборка и развертывание приложения, и в обозревателе открывается index.xhtml.
- Введите сообщение в текстовое поле. Нажмите кнопку "Отправить сообщение".
При нажатии кнопки "Отправить сообщение" сообщение сохраняется в базе данных, и извлекается и отображается число сообщений
Загрузка проекта решения
Простые проекты, используемые в этом руководстве, можно загрузить следующими способами.
- Загрузите архив завершенного проекта в формате zip.
- Выполните проверку исходных файлов проекта на выходе из примеров NetBeans, выполнив перечисленные ниже действия.
- Выберите в главном меню "Группа > Subversion > Проверить".
- В диалоговом окне "Проверка" введите следующий URL-адрес репозитория:
https://svn.netbeans.org/svn/samples~samples-source-code
Нажмите кнопку "Далее".
- Нажмите кнопку "Обзор" для открытия диалогового окна "Обзор папок репозитория".
- Разверните корневой узел и выберите samples/javaee/SimpleEE6App. Нажмите кнопку "ОК".
- Укажите локальную папку для исходных файлов (папка должна быть пустой).
- Нажмите кнопку "Готово".
После нажатия кнопки "Готово" среда IDE инициализирует локальную папку в качестве репозитория Subversion и выполняет проверку исходных файлов проекта на выходе.
- Щелкните команду "Открыть проект" в диалоговом окне, которое появится после завершения проверки.
Примечания.
Дополнительные сведения
Дополнительные сведения о разработке приложений для Java EE в среде IDE NetBeans приведены в следующих материалах:
Подробные сведения об использовании технологий Java EE 6 для развертывания приложений приведены в учебном курсе по Java EE 6.
Для того, чтобы иметь возможность оставлять комментарии и предложения, обращаться за поддержкой и получать информацию о последних достижениях в области функциональных возможностей разработки для Java EE с помощью среды IDE NetBeans, подпишитесь на список рассылки nbj2ee.