FeaturesPluginsDocs & SupportCommunityPartners

Начало работы с приложениями для 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 6.0 и 6.1

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

Программное обеспечение или ресурс Требуемая версия
Среда IDE NetBeans Web & Java EE, версия 6.1 или
версия 6.0
Комплект для разработчика на языке Java (JDK) версия 6 или
версия 5
Сервер приложений GlassFish V2

Предварительные условия

Предполагается, что читатель обладает базовыми знаниями по следующим технологиям или опытом программирования с их использованием:

  • Программирование на Java
  • Среда IDE NetBeans

Создание проекта приложения уровня предприятия

Цель этого упражнения состоит в создании проекта приложения уровня предприятия NewsApp, имеющего в своем составе модуль EJB и веб-модуль. В приложении NewsApp используется управляемый сообщениями компонент, предназначенный для получения и обработки сообщений, передаваемых в очередь сервлетом. Сервлеты используются в приложении для передачи сообщений в управляемый сообщениями компонент, и для вывода сообщений на экран.

Создание приложения уровня предприятия

  1. Выберите в главном меню "File > New Project" (Ctrl-Shift-N).
  2. Выберите "Enterprise Application" в категории "Enterprise" и нажмите кнопку "Next".
  3. Назовите проект NewsApp и определите местоположение проекта.
  4. Снимите флажок "Use Dedicated Folder", если он выбран.
    (Этот параметр доступен в среде IDE NetBeans 6.1. В рамках этого руководства копирование библиотек проекта в выделенную папку лишено смысла, поскольку совместное использование библиотек с другими пользователями или проектами не потребуется.)
    Нажмите кнопку "Next".
  5. Выберите сервер "GlassFish" и установите в поле "Java EE Version" версию "Java EE 5".
  6. Установите флажки "Create EJB Module" и "Create Web Application Module", если они не установлены.
  7. Нажмите кнопку "Finish".

Заключение

В этом упражнении было создано приложение уровня предприятия Java EE 5, содержащее модуль EJB и веб-модуль.

Написание кода модуля EJB

Это упражнение посвящено созданию объектов в модуле EJB. Будет создан класс объектов, управляемый сообщениями компонент и фасад сеанса. Также будет создана единица сохранения состояния, обеспечивающая контейнер информацией, необходимой для управления объектами, а также ресурсы службы передачи сообщений Java (Java Message Service, JMS), предназначенные для использования новым компонентом.

Создание единицы сохранения состояния

Сначала создадим единицу сохранения состояния, которая определяет источник данных и диспетчер объектов, используемые в приложении.

  1. Щелкните правой кнопкой мыши модуль EJB и выберите "New > Other".
  2. Выберите "Persistence Unit" в категории "Persistence" и нажмите кнопку "Next".
  3. Оставьте имя единицы (Persistence Unit Name) по умолчанию.
  4. В качестве источника сохранения (Persistence Provider) выберите значение TopLink (default).
  5. В поле "Data Source" необходимо выбрать источник данных (например, jdbc/sample, если предполагается использовать базу данных Java).
  6. Убедитесь в том, что для единицы сохранения состояния используется интерфейс API транзакций Java, и что для стратегии создания таблиц (Table Generation Strategy) установлено значение "Create", т.е. на основании классов объектов при развертывании приложения создаются таблицы.
  7. Нажмите кнопку "Finish".
Мастер создания единицы сохранения состояния "New Persistence Unit"

После нажатия кнопки "Finish" в среде IDE создается файл persistence.xml, который открывается в редакторе исходного кода в режиме проектирования. Закройте persistence.xml.

Создание класса объектов NewsEntity

Это упражнение посвящено созданию класса объектов NewsEntity. Класс объектов – это простой класс Java, как правило, соответствующий таблице в базе данных. При создании класса объектов в среде IDE добавляется аннотация @Entity, определяющая класс как класс объектов. После создания класса создаются поля класса, представляющие данные, которые должны содержаться в таблице.

Каждый класс объектов должен обладать первичным ключом. При создании класса объектов в среде IDE добавляется аннотация @Id, указывающая поле, используемое в качестве первичного ключа. Также добавляется аннотация @GeneratedValue и указывается стратегия создания ключей для первичного идентификатора.

Для создания класса NewsEntity необходимо выполнить следующие действия:

  1. Щелкните правой кнопкой мыши модуль EJB в окне "Project" и выберите "New > Other". Откроется мастер создания файла "New File".
  2. Выберите "Entity Class" в категории "Persistence" и нажмите кнопку "Next".
  3. Введите NewsEntity в качестве имени класса, ejb в качестве пакета и оставьте тип первичного ключа (Primary Key Type) Long. Нажмите кнопку "Finish".

После нажатия кнопки "Finish" класс объектов NewsEntity.java открывается в редакторе исходного кода. Выполните следующие действия в редакторе исходного кода:

  1. Добавьте к классу следующие объявления полей:
    private String title;
    private String body;
  2. Щелкните правой кнопкой мыши в редакторе исходного кода и выберите "Insert Code"; затем выберите "Getter and Setter" для создания методов получения и установки для каждого из полей.
  3. В диалоговом окне "Generate Getters and Setters" выберите поля body и title и нажмите кнопку "Generate".
  4. Сохраните изменения.
Диалоговое окно "Generate Getters and Setters"

В следующем действии создается управляемый сообщениями компонент – NewMessage.

Создание управляемого сообщениями компонента NewMessage

Теперь создадим в модуле EJB управляемый сообщениями компонент NewMessage. Для создания компонента и требуемых ресурсов JMS используется мастер "New Message-Driven Bean".

Для создания управляемого сообщениями компонента NewMessage необходимо выполнить следующие действия:

  1. Откройте мастер создания файла. Для этого щелкните правой кнопкой мыши модуль EJB в окне "Projects" и выберите "New > Other".
  2. Выберите "Message-Driven Beans" в категории "Enterprise" и нажмите кнопку "Next".
  3. Введите имя класса NewMessage.
  4. Выберите ejb из раскрывающегося списка "Package".
  5. Нажмите кнопку "Add" рядом с полем "Project Destination" для открытия диалогового окна "Add Message Destination".
  6. В диалоговом окне "Add Message Destination" введите jms/NewMessage и выберите очередь ("Queue") в качестве типа назначения. Нажмите кнопку "OK".
  7. Убедитесь в том, что адресат проекта настроен правильно, и нажмите кнопку "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 для управления устойчивыми экземплярами объектов. Аннотации добавляются к классу в редакторе исходного кода.

  1. Введите ресурс MessageDrivenContext в класс путем добавления к классу следующего аннотированного поля (выделяется полужирным шрифтом):
    public class NewMessage implements MessageListener {
    
    @Resource
    private MessageDrivenContext mdc;
  2. Введите диспетчер объекта в класс, для чего щелкните код правой кнопкой мыши и выберите "Persistence > Use Entity Manager" в появившемся меню.
    При этом в исходный код добавляется следующая аннотация:
    @PersistenceContext
    private EntityManager em;
    В коде создается следующий метод:
    public void persist(Object object) {
        em.persist(object);
    }
  3. Замените имя метода persist на save. Метод должен выглядеть следующим образом:
    public void save(Object object) {
        em.persist(object);
    }
  4. Добавьте к телу метода 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();
        }
  5. Нажмите комбинацию клавиш Ctrl-Shift-I для автоматического создания всех необходимых операторов импорта.
    Примечание: При автоматическом создании операторов импорта должен быть предусмотрен импорт библиотек jms и javax.annotation.Resource.
  6. Сохраните файл.

Создание сеансного компонента

Ниже будет продемонстрировано создание фасада сеанса для класса объектов NewsEntity. Для создания фасада сеанса необходимо выполнить следующие действия:

  1. Щелкните правой кнопкой мыши модуль EJB и выберите "New > Other".
  2. Выберите "Session Beans for Entity Classes" в категории "Persistence" и нажмите кнопку "Next".
  3. Выберите "ejb.NewsEntity" из списка доступных классов объектов и нажмите кнопку "Add", а затем кнопку "Next".
  4. Убедитесь в том, что для параметра "Package" установлено значение ejb, а также в том, что создается локальный интерфейс.
  5. Нажмите кнопку "Finish".

После нажатия кнопки "Finish" создается класс фасада сеанса NewsEntityFacade.java, который затем открывается в редакторе исходного кода. Также в среде IDE создается локальный интерфейс NewsEntityFacadeLocal.java.

Технология EJB 3.0 позволяет упростить создание сеансных компонентов путем уменьшения количества требуемого кода. Обратите внимание, что аннотация @Stateless используется для объявления класса в качестве элемента сеансного компонента без состояния, причем оператор, реализующий javax.ejb.SessionBean, для этого класса более не требуется. Код становится аккуратнее, поскольку бизнес-методы в технологии EJB 3.0 не должны содержать код, определяющий выдачу проверенных исключений.

Заметим, что ресурс PersistenceContext при создании фасада сеанса вводится непосредственно в элемент сеансного компонента.

Заключение

В этом упражнении в модуле EJB был создан код класса объектов и управляемый сообщениями компонент. Затем для класса объектов был создан фасад сеанса. Также созданы ресурсы JMS, используемые в приложении.

Написание кода веб-модуля

Теперь необходимо создать сервлеты ListNews и PostMessage в веб-модуле. Эти сервлеты используются для чтения и добавления сообщений.

Создание сервлета ListNews

В этом упражнении создается несложный сервлет для вывода данных на экран. Для вызова компонента объекта из сервлета используются аннотации.

  1. Щелкните правой кнопкой мыши проект веб-модуля и выберите "New > Servlet".
  2. Введите имя класса ListNews.
  3. Введите имя пакета web и нажмите кнопку "Finish".

После нажатия кнопки "Finish" класс ListNews.java открывается в редакторе исходного кода. Выполните следующие действия в редакторе исходного кода:

  1. Щелкните правой кнопкой мыши исходный код и выберите "Enterprise Resources > Call Enterprise Bean".
  2. Выберите "NewsEntityFacade" в диалоговом окне "Call Enterprise Bean" и нажмите кнопку "OK". После этого в сервлет с помощью аннотации @EJB вводится ресурс компонента объекта.
  3. Раскомментируйте код в методе 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>");
                        
  4. Нажмите комбинацию клавиш Ctrl-Shift-I для создания всех необходимых операторов импорта для класса. При автоматическом создании операторов импорта должен быть предусмотрен импорт библиотек java.util.
  5. Сохраните измененный файл.

Создание сервлета PostMessage

Это упражнение посвящено созданию сервлета PostMessage, предназначенного для отправки сообщений. Для добавления созданных ресурсов JMS непосредственно в сервлет используются аннотации с указанием имени переменной и имени, к которому она привязана. Затем создается код, выполняющий отправку сообщения JMS, и код для формы HTML, предназначенной для добавления сообщения.

  1. Щелкните правой кнопкой мыши проект веб-модуля и выберите "New > Servlet".
  2. Введите имя класса PostMessage.
  3. Введите имя пакета web и нажмите кнопку "Finish".

После нажатия кнопки "Finish" класс PostMessage.java открывается в редакторе исходного кода. Выполните следующие действия в редакторе исходного кода:

  1. Добавьте ресурсы ConnectionFactory и Queue с помощью аннотаций путем добавления следующих объявлений полей (выделены полужирным шрифтом):
    public class PostMessage extends HttpServlet {
        @Resource(mappedName="jms/NewMessageFactory")
        private  ConnectionFactory connectionFactory;
    
        @Resource(mappedName="jms/NewMessage")
        private  Queue queue;
  2. Теперь создадим код, передающий сообщения 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();
                        
  3. Теперь раскомментируем код для вывода 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>");
                    
  4. Нажмите комбинацию клавиш Ctrl-Shift-I для создания всех необходимых операторов импорта для класса.
    Примечание: При выборе импортируемых библиотек для Connection, ConnectionFactory, Session и Queue следует предусмотреть импорт библиотек java.jms.
  5. Сохраните измененный файл.

Выполнение проекта

Теперь проект можно запустить. При запуске проекта страница с сервлетом ListNews должна открыться в обозревателе. Для этого в диалоговом окне "Properties" для приложения уровня предприятия указывается URL-адрес. Этот URL-адрес указывается относительно контекстного пути приложения. После ввода относительного URL-адреса приложение можно собрать, развернуть и запустить из окна "Projects".

Для указания относительного URL-адреса и запуска приложения необходимо выполнить следующие действия:

  1. В окне "Projects" щелкните правой кнопкой мыши узел приложения уровня предприятия "NewsApp" и выберите пункт "Properties" в появившемся меню.
  2. Выберите "Run" в области "Categories".
  3. Введите "/ListNews" в текстовое поле "Relative URL".
  4. Нажмите кнопку "OK".
  5. В окне "Projects" щелкните правой кнопкой мыши узел приложения уровня предприятия "NewsApp" и выберите "Run Project".

При запуске проекта в обозревателе открывается сервлет ListNews, и в нем выводится список сообщений в базе данных. При первом запуске проекта база данных пуста, но сообщение можно добавить путем щелчка ссылки "Add Message".

Страница сервлета ListNews

При добавлении сообщения с помощью сервлета PostMessage оно передается на постоянное хранение в управляемый сообщениями компонент, и для просмотра сообщений в базе данных вызывается сервлет ListNews. Список сообщений в базе данных, извлеченных сервлетом ListNews, часто выводится без нового сообщения, поскольку служба передачи сообщений работает асинхронно.

Устранение проблем

Ниже приводится ряд проблем, которые могут возникнуть при создании проекта.

Проблема с ресурсами JMS

При создании ресурсов JMS с помощью мастера в окне "Output" появится следующее сообщение об ошибке сервера:

[com.sun.enterprise.connectors.ConnectorRuntimeException:
                    JMS resource not created : jms/Queue]
                

Это сообщение может указывать на то, что ресурс JMS не создан или не зарегистрирован на сервере приложений. Для проверки, создания и изменения ресурсов JMS можно воспользоваться консолью администратора сервера приложений.

Для открытия консоли администратора необходимо выполнить следующие действия:

  1. Убедитесь в том, что сервер приложений запущен, путем раскрытия узла "Servers" в "Runtime" в среде IDE. Работающий сервер обозначается зеленой стрелкой рядом с узлом сервера приложений.
  2. Щелкните правой кнопкой мыши узел сервера приложений и выберите "View Admin Console" для открытия в обозревателе окна входа в систему.
  3. Войдите в систему сервера. Имя пользователя по умолчанию и пароль – admin и adminadmin.
  4. Разверните узлы "Resources" и "JMS Resources" на левой панели консоли администратора в обозревателе.
  5. Щелкните ссылки "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.

Bookmark this page

del.icio.us furl simpy slashdot technorati digg
Companion
Projects:
MySQL Database Server   Open JDK: an Open SourceJDK   GlassFish Community: an Open Source Application Server    Mobile & Embedded Community    Open Solaris   java.net - The Source for Java Technology Collaboration   Virtual Box - full virtualizer  Open ESB - The Open Enterprise Service Bus Powered by