Начало работы с приложениями для Java EE
В этом руководстве рассматриваются основы разработки приложений уровня предприятия с помощью технологии EJB 3.0, которая входит в состав платформы Java EE 5. Здесь демонстрируется упрощение процесса разработки приложений уровня предприятия благодаря технологии EJB 3.0.
В этом документе представлена среда IDE NetBeans, выпуск 6.1. Действия, описанные в данном руководстве, также могут применяться при работе с версией среды IDE 6.0, однако некоторые возможности, доступные в среде IDE NetBeans 6.1, в более ранних выпусках отсутствуют.
Предполагаемая продолжительность: 30 минут
Упражнения по темам руководства
Для работы с этим руководством требуется программное обеспечение и ресурсы, перечисленные ниже.
| Среда IDE NetBeans |
Web & Java EE, версия 6.1 или
версия 6.0 |
| Комплект для разработчика на языке Java (JDK) |
версия 6 или
версия 5 |
| Сервер приложений GlassFish |
V2 |
Предварительные условия
Предполагается, что читатель обладает базовыми знаниями по следующим технологиям или опытом программирования с их использованием:
- Программирование на Java
- Среда IDE NetBeans
Создание проекта приложения уровня предприятия
Цель этого упражнения состоит в создании проекта приложения уровня предприятия NewsApp, имеющего в своем составе модуль EJB и веб-модуль. В приложении NewsApp используется управляемый сообщениями компонент, предназначенный для получения и обработки сообщений, передаваемых в очередь сервлетом. Сервлеты используются в приложении для передачи сообщений в управляемый сообщениями компонент, и для вывода сообщений на экран.
Создание приложения уровня предприятия
- Выберите в главном меню "File > New Project" (Ctrl-Shift-N).
- Выберите "Enterprise Application" в категории "Enterprise" и нажмите кнопку "Next".
- Назовите проект NewsApp и определите местоположение проекта.
- Снимите флажок "Use Dedicated Folder", если он выбран.
(Этот параметр доступен в среде IDE NetBeans 6.1. В рамках этого руководства копирование библиотек проекта в выделенную папку лишено смысла, поскольку совместное использование библиотек с другими пользователями или проектами не потребуется.)
Нажмите кнопку "Next".
- Выберите сервер "GlassFish" и установите в поле "Java EE Version" версию "Java EE 5".
- Установите флажки "Create EJB Module" и "Create Web Application Module", если они не установлены.
- Нажмите кнопку "Finish".
Заключение
В этом упражнении было создано приложение уровня предприятия Java EE 5, содержащее модуль EJB и веб-модуль.
Написание кода модуля EJB
Это упражнение посвящено созданию объектов в модуле EJB. Будет создан класс объектов, управляемый сообщениями компонент и фасад сеанса. Также будет создана единица сохранения состояния, обеспечивающая контейнер информацией, необходимой для управления объектами, а также ресурсы службы передачи сообщений Java (Java Message Service, JMS), предназначенные для использования новым компонентом.
Создание единицы сохранения состояния
Сначала создадим единицу сохранения состояния, которая определяет источник данных и диспетчер объектов, используемые в приложении.
- Щелкните правой кнопкой мыши модуль EJB и выберите "New > Other".
- Выберите "Persistence Unit" в категории "Persistence" и нажмите кнопку "Next".
- Оставьте имя единицы (Persistence Unit Name) по умолчанию.
- В качестве источника сохранения (Persistence Provider) выберите значение TopLink (default).
- В поле "Data Source" необходимо выбрать источник данных (например, jdbc/sample, если предполагается использовать базу данных Java).
- Убедитесь в том, что для единицы сохранения состояния используется интерфейс API транзакций Java, и что для стратегии создания таблиц (Table Generation Strategy) установлено значение "Create", т.е. на основании классов объектов при развертывании приложения создаются таблицы.
- Нажмите кнопку "Finish".
После нажатия кнопки "Finish" в среде IDE создается файл persistence.xml, который открывается в редакторе исходного кода в режиме проектирования. Закройте persistence.xml.
Создание класса объектов NewsEntity
Это упражнение посвящено созданию класса объектов NewsEntity. Класс объектов – это простой класс Java, как правило, соответствующий таблице в базе данных. При создании класса объектов в среде IDE добавляется аннотация @Entity, определяющая класс как класс объектов. После создания класса создаются поля класса, представляющие данные, которые должны содержаться в таблице.
Каждый класс объектов должен обладать первичным ключом. При создании класса объектов в среде IDE добавляется аннотация @Id, указывающая поле, используемое в качестве первичного ключа. Также добавляется аннотация @GeneratedValue и указывается стратегия создания ключей для первичного идентификатора.
Для создания класса NewsEntity необходимо выполнить следующие действия:
- Щелкните правой кнопкой мыши модуль EJB в окне "Project" и выберите "New > Other". Откроется мастер создания файла "New File".
- Выберите "Entity Class" в категории "Persistence" и нажмите кнопку "Next".
- Введите NewsEntity в качестве имени класса, ejb в качестве пакета и оставьте тип первичного ключа (Primary Key Type) Long. Нажмите кнопку "Finish".
После нажатия кнопки "Finish" класс объектов NewsEntity.java открывается в редакторе исходного кода. Выполните следующие действия в редакторе исходного кода:
- Добавьте к классу следующие объявления полей:
private String title;
private String body;
- Щелкните правой кнопкой мыши в редакторе исходного кода и выберите "Insert Code"; затем выберите "Getter and Setter" для создания методов получения и установки для каждого из полей.
- В диалоговом окне "Generate Getters and Setters" выберите поля body и title и нажмите кнопку "Generate".
- Сохраните изменения.
В следующем действии создается управляемый сообщениями компонент – NewMessage.
Создание управляемого сообщениями компонента NewMessage
Теперь создадим в модуле EJB управляемый сообщениями компонент NewMessage. Для создания компонента и требуемых ресурсов JMS используется мастер "New Message-Driven Bean".
Для создания управляемого сообщениями компонента NewMessage необходимо выполнить следующие действия:
- Откройте мастер создания файла. Для этого щелкните правой кнопкой мыши модуль EJB в окне "Projects" и выберите "New > Other".
- Выберите "Message-Driven Beans" в категории "Enterprise" и нажмите кнопку "Next".
- Введите имя класса NewMessage.
- Выберите ejb из раскрывающегося списка "Package".
- Нажмите кнопку "Add" рядом с полем "Project Destination" для открытия диалогового окна "Add Message Destination".
- В диалоговом окне "Add Message Destination" введите jms/NewMessage и выберите очередь ("Queue") в качестве типа назначения. Нажмите кнопку "OK".
- Убедитесь в том, что адресат проекта настроен правильно, и нажмите кнопку "Finish".
После нажатия кнопки "Finish" новый класс управляемого сообщениями компонента NewMessage.java открывается в редакторе исходного кода. Нетрудно заметить, что к классу добавлена аннотация @MessageDriven и свойства настройки.
@MessageDriven(mappedName = "jms/NewMessage", activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})
Эта аннотация позволяет указать, что данный компонент является управляемым сообщениями, а также привести ресурсы JMS, используемые компонентом. При автоматическом создании класса в среде IDE имя привязки ("Mapped Name") ресурса (jms/NewMessage) определяется на основе имени класса (NewMessage.java). Ресурс JMS привязан к имени JNDI адресата, от которого в компонент поступают сообщения. Информация о ресурсах JMS уже добавлена в sun-resources.xml мастером создания управляемого сообщениями компонента. Интерфейс API EJB 3.0 позволяет выполнять поиск объектов в пространстве имен JNDI изнутри класса компонента, так что настройка дескрипторов развертывания для указания ресурсов JMS не требуется.
Спецификации EJB 3.0 позволяют вводить ресурсы непосредственно в класс с помощью аннотаций. Ниже будет показано, как аннотации можно использовать для ввода в класс ресурса MessageDrivenContext, а затем и ресурса PersistenceContext, который используется интерфейсом API EntityManager для управления устойчивыми экземплярами объектов. Аннотации добавляются к классу в редакторе исходного кода.
- Введите ресурс MessageDrivenContext в класс путем добавления к классу следующего аннотированного поля (выделяется полужирным шрифтом):
public class NewMessage implements MessageListener {
@Resource
private MessageDrivenContext mdc;
- Введите диспетчер объекта в класс, для чего щелкните код правой кнопкой мыши и выберите "Persistence > Use Entity Manager" в появившемся меню.
При этом в исходный код добавляется следующая аннотация:
@PersistenceContext
private EntityManager em;
В коде создается следующий метод:
public void persist(Object object) {
em.persist(object);
}
- Замените имя метода persist на save. Метод должен выглядеть следующим образом:
public void save(Object object) {
em.persist(object);
}
- Добавьте к телу метода onMessage следующие строки:
public void onMessage(Message message) {
ObjectMessage msg = null;
try {
if (message instanceof ObjectMessage) {
msg = (ObjectMessage) message;
NewsEntity e = (NewsEntity) msg.getObject();
save(e);
}
} catch (JMSException e) {
e.printStackTrace();
mdc.setRollbackOnly();
} catch (Throwable te) {
te.printStackTrace();
}
- Нажмите комбинацию клавиш Ctrl-Shift-I для автоматического создания всех необходимых операторов импорта.
Примечание: При автоматическом создании операторов импорта должен быть предусмотрен импорт библиотек jms и javax.annotation.Resource.
- Сохраните файл.
Создание сеансного компонента
Ниже будет продемонстрировано создание фасада сеанса для класса объектов NewsEntity. Для создания фасада сеанса необходимо выполнить следующие действия:
- Щелкните правой кнопкой мыши модуль EJB и выберите "New > Other".
- Выберите "Session Beans for Entity Classes" в категории "Persistence" и нажмите кнопку "Next".
- Выберите "ejb.NewsEntity" из списка доступных классов объектов и нажмите кнопку "Add", а затем кнопку "Next".
- Убедитесь в том, что для параметра "Package" установлено значение ejb, а также в том, что создается локальный интерфейс.
- Нажмите кнопку "Finish".
После нажатия кнопки "Finish" создается класс фасада сеанса NewsEntityFacade.java, который затем открывается в редакторе исходного кода. Также в среде IDE создается локальный интерфейс NewsEntityFacadeLocal.java.
Технология EJB 3.0 позволяет упростить создание сеансных компонентов путем уменьшения количества требуемого кода. Обратите внимание, что аннотация @Stateless используется для объявления класса в качестве элемента сеансного компонента без состояния, причем оператор, реализующий javax.ejb.SessionBean, для этого класса более не требуется. Код становится аккуратнее, поскольку бизнес-методы в технологии EJB 3.0 не должны содержать код, определяющий выдачу проверенных исключений.
Заметим, что ресурс PersistenceContext при создании фасада сеанса вводится непосредственно в элемент сеансного компонента.
Заключение
В этом упражнении в модуле EJB был создан код класса объектов и управляемый сообщениями компонент. Затем для класса объектов был создан фасад сеанса. Также созданы ресурсы JMS, используемые в приложении.
Написание кода веб-модуля
Теперь необходимо создать сервлеты ListNews и PostMessage в веб-модуле. Эти сервлеты используются для чтения и добавления сообщений.
Создание сервлета ListNews
В этом упражнении создается несложный сервлет для вывода данных на экран. Для вызова компонента объекта из сервлета используются аннотации.
- Щелкните правой кнопкой мыши проект веб-модуля и выберите "New > Servlet".
- Введите имя класса ListNews.
- Введите имя пакета web и нажмите кнопку "Finish".
После нажатия кнопки "Finish" класс ListNews.java открывается в редакторе исходного кода. Выполните следующие действия в редакторе исходного кода:
- Щелкните правой кнопкой мыши исходный код и выберите "Enterprise Resources > Call Enterprise Bean".
- Выберите "NewsEntityFacade" в диалоговом окне "Call Enterprise Bean" и нажмите кнопку "OK". После этого в сервлет с помощью аннотации @EJB вводится ресурс компонента объекта.
- Раскомментируйте код в методе processRequest и добавьте следующие строки, выделенные полужирным шрифтом, в тело метода:
out.println("<h1>Servlet ListNews at " + request.getContextPath () + "</h1>");
List news = newsEntityFacade.findAll();
for (Iterator it = news.iterator(); it.hasNext();) {
NewsEntity elem = (NewsEntity) it.next();
out.println(" <b>"+elem.getTitle()+" <br />");
out.println(elem.getBody()+"<br /> ");
}
out.println("<a href='PostMessage'>Add new message</a>");</b>
out.println("</body>");
- Нажмите комбинацию клавиш Ctrl-Shift-I для создания всех необходимых операторов импорта для класса. При автоматическом создании операторов импорта должен быть предусмотрен импорт библиотек java.util.
- Сохраните измененный файл.
Создание сервлета PostMessage
Это упражнение посвящено созданию сервлета PostMessage, предназначенного для отправки сообщений. Для добавления созданных ресурсов JMS непосредственно в сервлет используются аннотации с указанием имени переменной и имени, к которому она привязана. Затем создается код, выполняющий отправку сообщения JMS, и код для формы HTML, предназначенной для добавления сообщения.
- Щелкните правой кнопкой мыши проект веб-модуля и выберите "New > Servlet".
- Введите имя класса PostMessage.
- Введите имя пакета web и нажмите кнопку "Finish".
После нажатия кнопки "Finish" класс PostMessage.java открывается в редакторе исходного кода. Выполните следующие действия в редакторе исходного кода:
- Добавьте ресурсы ConnectionFactory и Queue с помощью аннотаций путем добавления следующих объявлений полей (выделены полужирным шрифтом):
public class PostMessage extends HttpServlet {
@Resource(mappedName="jms/NewMessageFactory")
private ConnectionFactory connectionFactory;
@Resource(mappedName="jms/NewMessage")
private Queue queue;
- Теперь создадим код, передающий сообщения JMS, путем добавления в метод processRequest следующих строк кода, выделенных полужирным шрифтом:
response.setContentType("text/html;charset=UTF-8");
// Добавьте следующий код для передачи сообщения JMS.
String title=request.getParameter("title");
String body=request.getParameter("body");
if ((title!=null) && (body!=null)) {
try {
Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer messageProducer = session.createProducer(queue);
ObjectMessage message = session.createObjectMessage();
// Здесь создается NewsEntity, который передается в сообщении JMS
NewsEntity e = new NewsEntity();
e.setTitle(title);
e.setBody(body);
message.setObject(e);
messageProducer.send(message);
messageProducer.close();
connection.close();
response.sendRedirect("ListNews");
} catch (JMSException ex) {
ex.printStackTrace();
}
}
PrintWriter out = response.getWriter();
- Теперь раскомментируем код для вывода HTML и создадим веб-форму для добавления сообщения. Добавьте следующие строки, выделенные полужирным шрифтом, в метод processRequest.
out.println("Servlet PostMessage at " + request.getContextPath() + "</h1>");
// Следующий код служит для размещения формы на веб-странице
out.println("<form>");
out.println("Title: <input type='text' name='title'><br/>");
out.println("Message: <textarea name='body'></textarea><br/>");
out.println("<input type='submit'><br/>");
out.println("</form>");
out.println("</body>");
- Нажмите комбинацию клавиш Ctrl-Shift-I для создания всех необходимых операторов импорта для класса.
Примечание: При выборе импортируемых библиотек для Connection, ConnectionFactory, Session и Queue следует предусмотреть импорт библиотек java.jms.
- Сохраните измененный файл.
Выполнение проекта
Теперь проект можно запустить. При запуске проекта страница с сервлетом ListNews должна открыться в обозревателе. Для этого в диалоговом окне "Properties" для приложения уровня предприятия указывается URL-адрес. Этот URL-адрес указывается относительно контекстного пути приложения. После ввода относительного URL-адреса приложение можно собрать, развернуть и запустить из окна "Projects".
Для указания относительного URL-адреса и запуска приложения необходимо выполнить следующие действия:
- В окне "Projects" щелкните правой кнопкой мыши узел приложения уровня предприятия "NewsApp" и выберите пункт "Properties" в появившемся меню.
- Выберите "Run" в области "Categories".
- Введите "/ListNews" в текстовое поле "Relative URL".
- Нажмите кнопку "OK".
- В окне "Projects" щелкните правой кнопкой мыши узел приложения уровня предприятия "NewsApp" и выберите "Run Project".
При запуске проекта в обозревателе открывается сервлет ListNews, и в нем выводится список сообщений в базе данных. При первом запуске проекта база данных пуста, но сообщение можно добавить путем щелчка ссылки "Add Message".
При добавлении сообщения с помощью сервлета PostMessage оно передается на постоянное хранение в управляемый сообщениями компонент, и для просмотра сообщений в базе данных вызывается сервлет ListNews. Список сообщений в базе данных, извлеченных сервлетом ListNews, часто выводится без нового сообщения, поскольку служба передачи сообщений работает асинхронно.
Устранение проблем
Ниже приводится ряд проблем, которые могут возникнуть при создании проекта.
Проблема с ресурсами JMS
При создании ресурсов JMS с помощью мастера в окне "Output" появится следующее сообщение об ошибке сервера:
[com.sun.enterprise.connectors.ConnectorRuntimeException:
JMS resource not created : jms/Queue]
Это сообщение может указывать на то, что ресурс JMS не создан или не зарегистрирован на сервере приложений. Для проверки, создания и изменения ресурсов JMS можно воспользоваться консолью администратора сервера приложений.
Для открытия консоли администратора необходимо выполнить следующие действия:
- Убедитесь в том, что сервер приложений запущен, путем раскрытия узла "Servers" в "Runtime" в среде IDE. Работающий сервер обозначается зеленой стрелкой рядом с узлом сервера приложений.
- Щелкните правой кнопкой мыши узел сервера приложений и выберите "View Admin Console" для открытия в обозревателе окна входа в систему.
- Войдите в систему сервера. Имя пользователя по умолчанию и пароль – admin и adminadmin.
- Разверните узлы "Resources" и "JMS Resources" на левой панели консоли администратора в обозревателе.
- Щелкните ссылки "Connection Factories" и "Destination Resources" на левой панели и проверьте, зарегистрированы ли ресурсы на сервере; при необходимости внесите требуемые изменения. Если ресурсы не существуют, их можно создать при помощи консоли администратора.
Необходимо убедиться в том, что ресурс фабрики подключений JMS в сервлете PostMessage привязан к правильному имени JNDI ресурса фабрики подключений JMS, зарегистрированному на сервере приложений Sun Java System Application Server.
На сервере Sun Java System Application Server должны быть зарегистрированы следующие ресурсы:
- ресурс адресата с именем JNDI jms/NewMessage и типом javax.jms.Queue;
- ресурс фабрики подключений с именем JNDI jms/NewMessageFactory и типом javax.jms.QueueConnectionFactory.
Дополнительная информация
Для получения дополнительных сведений об использовании среды IDE NetBeans 6.0 для разработки приложений для Java EE см. следующие ресурсы:
Дополнительная информация по использованию компонентов уровня предприятия EJB 3.0 содержится в Руководстве по Java EE 5.
Оставить комментарии и предложения, обратиться за поддержкой и получить информацию о последних достижениях в области функциональных возможностей разработки для Java EE с помощью среды IDE NetBeans можно в списке рассылки nbj2ee.