Погружение в EJB Web-приложения с Geronimo

Совместное применение Maven, Struts и XDoclet

Изучите детальнее внутреннюю работу мощного сервера приложений Apache Geronimo и научитесь использовать его для разработки приложений, работающих с базами данных. Java-разработчик Нил Санче начал этот вояж статьей "Три способа подключения базы данных к серверу приложений Geronimo" (developerWorks, июнь 2005), в которой рассматривается процесс создания простого приложения базы телефонных контактов. В этой статье вы увидите, как улучшить это приложение и подключить к нему функциональный пользовательский интерфейс с использованием Apache Struts и Enterprise JavaBeans (EJB). Вы также узнаете, как использовать систему компоновки Apache Maven для компоновки, пакетирования и развертывания приложения базы телефонных контактов. Узнайте, как можно упростить процесс разработки Web-приложений на вашем предприятии.

Нил Санче, Java-разработчик и автор, Независимый

Нил Санче (Neal Sanche) является Java-разработчиком, примкнувшим к Microsoft® .NET и пытающимся не терять связи со своими старыми предпочтениями. Он имеет опыт разработки нескольких коммерческих J2EE-приложений, а также нескольких автономных Java-приложений. В свободное время он сочиняет музыку, занимается фотографией и пишет технические статьи. Вы можете найти несколько примеров на его Web-сайте. С Нилом можно связаться по адресу neal@nsdev.org.



19.07.2005

Обзор технологии

Перед изучением примера приложения вы, возможно, захотите освежить ваши знания, более пристально рассмотрев три технологии, которые будут использоваться для создания и развертывания приложения. (Более подробно об этих технологиях можно узнать из источников, перечисленных в разделе "Ресурсы".)

Maven - это программа, предназначенная для создания Java-приложений, от исходного кода до пакетирования для развертывания на Web-сайтов. При помощи системы Maven был создан сервер приложений Geronimo. В своей основе гибкая среда Maven дает возможность создавать модули, выполняющие несколько действий, необходимых при создании программных компонентов. По отношению к Apache Ant (инструмента компоновки Java-программ) действия Maven можно сравнить с результатами, генерируемыми командой UNIX make. Механизм сценариев Maven также дает возможность автоматически развертывать ваше приложение на работающем сервере Geronimo. В этой статье рассмотрено, как можно использовать Maven для пакетирования вашего исходного кода в готовое корпоративное приложение Java 2 Platform, Enterprise Edition (J2EE).

Struts - это рабочая среда Web-приложений, основанная на архитектуре Model 2 (смотрите раздел "Ресурсы", где приведена ссылка на хорошее описание архитектуры JSP Model 2). Эта гибридная архитектура отделяет бизнес-логику и логику отображения настолько, насколько это возможно. Struts выполняет это путем выделения бизнес-логики в чистые Java-классы, которые манипулируют вашими данными, а также путем предоставления богатой библиотеки тегов, которая может быть использована для отображения ваших данных при создании JavaServer Pages (JSP). (Среди многочисленных доступных средств разработки Web-приложений, многие из которых очень приветствую, например Tapestry и JavaServer Faces, Struts продолжает оставаться одной из самых моих любимых технологий.)

XDoclet берет свое начало от старого средства документирования Javadoc. Разработчики XDoclet первоначально использовали Javadoc новым способом, применяя специализированные комментарии для генерирования модели, которую впоследствии можно было скомпилировать в исходный код. Затем они начали использовать вместо Javadoc свой собственный вариант, названный Xjavadoc. Однако использование тегов в Javadoc-комментариях в вашем исходном коде для создания автоматически генерируемого исходного кода до сих пор осталось неизменным со времен XDoclet. Написание исходного кода и файлов дескриптора развертывания для J2EE-приложений может быть трудоемким процессом. Приблизительно для каждой сотни строк исходного Java-кода придется сгенерировать по крайней мере в три раза больше поддерживающего кода J2EE-дескриптора, чтобы завершить работу. Для уменьшения значительной части головной боли при разработке многоуровневого корпоративного приложения на помощь приходит XDoclet, который обеспечивает создание тегов для кода и генерирование кода таким образом, что дескрипторы развертывания генерируются главным образом автоматически. При этом существенно скрывается сложность J2EE, но вы должны следить за генерируемым кодом, поскольку будет необходимо его читать в случаях, когда что-то идет не так, как ожидалось.


План развертывания

Как упоминалось в водной части статьи, группа разработчиков Geronimo для создания готового сервера приложений использовала Maven. Вы можете использовать мощь программы компоновки Maven для компилирования исходного кода вашего приложения, генерирования кода (при помощи XDoclet), объединения модулей приложения и развертывания приложения на работающем сервере Geronimo.

Процесс начинается с трех файлов. Первый, project.xml, определяет так называемую Project Object Model (POM) (объектная модель проекта). В нем приведена относящаяся к вашему приложению информация (включая название приложения) о том, кто участвует в его создании, номер версии, необходимые для построения приложения зависимости и общие положения о том, как компоновать приложение. В данной статье вы в основном будете иметь дело с разделом зависимостей POM. (Смотрите в разделе "Ресурсы" ссылку на полное описание POM-файла.)

Maven использует раздел зависимостей файла project.xml для загрузки компонентов, требуемых для компоновки приложения, из назначенных репозиториев по сети Интернет. Один из таких репозиториев, iBiblio (ссылка приведена в разделе "Ресурсы"), содержит сотни Java-библиотек с отрытым исходным кодом и вспомогательных файлов, а также POM-информацию для этих библиотек. В нем содержится изобилие информации для общего упрощения жизни Java-разработчиков во время создания приложений. Раздел зависимостей файла project.xml для приложения телефонной книги состоит из 23 зависимостей, половина из которых являются .jar-файлами, поддерживающими Struts и библиотеку тегов DisplayTag. Остальные зависимости в основном нужны для XDoclet. Без Maven каждую из этих зависимостей нужно было бы связать с приложением.

Maven просто загружает все зависимые компоненты при первом компилировании приложения. Последующие процессы компилирования работают с локальным репозиторием Maven (локальный кеш загруженных компонентов обычно находится в каталоге .maven вашего каталога $HOME).

Установка Maven 1.0.2

Наш пример приложения требует некоторой начальной настройки Maven для того, чтобы все работало корректно. Прежде всего вам необходимо установить Maven 1.0.2 (Ссылка на Web-сайт Maven приведена в разделе "Ресурсы"). После завершения установки введите maven в вашей командной строке. Вы увидите примерно следующую информацию:

E:\Documents and Settings\Neal\My Documents\eclipse\workspace\Phonebook> maven
 __  __
|  \/  |__ _Apache__ ___
| |\/| / _` \ V / -_) ' \  ~ intelligent projects ~
|_|  |_\__,_|\_/\___|_||_|  v. 1.0.2

Компилирование Geronimo

Затем скомпилируйте Geronimo из исходного кода, следуя инструкциям, находящимся в Wiki (ссылка приведена в разделе "Ресурсы"). После успешной компоновки компоненты Geronimo будут находиться в вашем локальном репозитории. Они необходимы для создания примера приложения. После компилирования Geronimo найдите и установите файл geronimo-deployment-plugin-1.0-SNAPSHOT.jar в ваш каталог $MAVEN_HOME/plugins; в противном случае вы увидите сообщение, аналогичное следующему:

Tag library requested that is not present: 'geronimo:deploy' in plugin: 'null'

Установка XDoclet 1.2.3

Наконец, установите XDoclet 1.2.3 в ваш репозиторий Maven. Если при компоновке примера приложения отображается сообщение Maven о том, что невозможно найти некоторые из компонентов XDoclet 1.2.3, вы должны загрузить XDoclet 1.2.3 (пакет lib) и разархивировать .jar-файлы в вашем локальном репозитории Maven - .maven/repository/xdoclet/jars (Ссылка на Web-сайт XDoclet приведена в разделе "Ресурсы"). Если вы являетесь пользователем Windows, то должны найти этот каталог Maven в вашем каталоге C:\Documents and Settings\username. Если вы используете UNIX, то должны найти этот каталог в вашем "домашнем" каталоге. Необходимо также установить подключаемый модуль XDoclet Maven, поместив файл maven-xdoclet-plugin-1.2.3.jar в ваш каталог $MAVEN_HOME/plugins.

Успешная компоновка

После завершения всех этих предварительных действий процесс компоновки должен проходить гладко. Конечно же, вы можете сделать пробную компоновку перед выполнением описанных выше действий и определить, какие файлы Maven не может найти, и установить только эти файлы. Вы можете попробовать запустить Maven в самом верхнем каталоге примера приложения. В первый раз будет загружено много компонентов, а в конце процесса вы увидите сообщение BUILD SUCCESSFUL.

Для лучшего понимания работы Maven взгляните на файлы maven.xml и project.properties. Maven ориентирован на цели. Он читает файл maven.xml и пытается удовлетворить все цели, указанные в атрибуте default элемента project самого верхнего уровня. В данном случае он пытается удовлетворить все, что указано в цели deploy в качестве предварительных требований; а именно, он попытается скомпоновать .ear-файл, а затем остановить и запустить приложение. Развертывание приложения осуществляет упоминавшийся выше подключаемый модуль Geronimo Deployment Maven. Естественно, должен быть запущен ваш сервер Geronimо, т.к. в противном случае ваша компоновка закончится неудачно, и отобразится примерно такое сообщение:

Failed to retrieve RMIServer stub: javax.naming.ServiceUnavailableException 
[Root exception is java.rmi.ConnectException: Connection refused to 
host: 10.0.0.7; nested exception is:
        java.net.ConnectException: Connection refused: connect]

Если вы получите это сообщение, запустите ваш сервер Geronimo, используя следующую команду:

E:\geronimo-snapshot>java -jar bin\server.jar org/apache/geronimo/
DebugConsole org/apache/geronimo/RuntimeDeployer

Эта команда указывает Geronimo запустить сервер, конфигурацию приложения DebugConsole и конфигурацию RuntimeDeployer.

Отладочная консоль

DebugConsole (показана на рисунке 1) представляет собой необязательный компонент, предоставляющий вам возможность наблюдать за тем, какие задачи выполняются на сервере Geronimo, используя небольшое Web-приложение (смотрите инструментальную программу на http://localhost:8080/debug-tool).

Рисунок 1. Geronimo DebugConsole
Geronimo DebugConsole

Пример главной страницы

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

Рисунок 2. Пример приложения Geronimo Phonebook, скомпонованный с использованием Struts 1.2.7
Пример приложения Geronimo Phonebook, скомпонованный с использованием Struts 1.2.7

После компоновки приложения: заглянем вовнутрь

После того, как вы успешно скомпоновали приложение и увидели мощь и простоту использования Maven, пора взглянуть на схему файлов и некоторый код, которые были необходимы для всего этого процесса. Сначала будет рассмотрен уровень Web-приложения, затем EJB-уровень. Затем будут рассмотрены связующие компоненты - планы развертывания и файлы конфигурации, которые соединяются все вместе и делают возможной всю работу. Обратитесь к дереву каталогов файлов, показанному на рисунке 3, в качестве ссылки на место, где можно найти эти файлы.

Рисунок 3. Схема каталога файлов примера приложения
Схема каталога файлов примера приложения

Уровень Web-приложения

Web-приложение создается при помощи JSP и среды разработки Struts 1.2.7. В каталоге src/webapp вы найдете файлы, которые содержат Web-интерфейс примера приложения.

Данное приложение состоит из двух основных видов: список телефонных номеров и экрана редактирования телефонного номера. Присутствуют все необходимые для редактирования простых записей базы данных функции (добавление, удаление, редактирование, обновление и список). Каталог src/java/org/acme/phonebook/struts содержит несколько Struts-действий, выполняющих эти необходимые функции, например, создание новых записей, удаление записей, перечисление записей и редактирование существующих записей.

Для облегчения создания данного внешнего вида Web-приложения была использована система шаблонов Struts Tiles. Внешний вид приложения определяет файл site-template.jsp, расположенный в каталоге webapp/pages.

Будут рассмотрены две основных JSP-страницы - EditPhoneNumberPage.jsp и ListPhoneNumbersPage.jsp. Каждая из этих страниц и их функция описаны в листинге 1.

Листинг 1. EditPhoneNumberPage.jsp
<%@ page language="java"%>
<%@ taglib uri="/tags/struts-bean" prefix="bean"%>
<%@ taglib uri="/tags/struts-html" prefix="html"%>
<%@ taglib uri="/tags/struts-tiles" prefix="tiles"%>
<tiles:insert page="/pages/site-template.jsp" flush="true">
       <tiles:put name="content" type="string">

<hr>
<h1><bean:message key="h1.EditPhoneNumberPage" /></h1>
<hr>

<h2><bean:write name="phoneBookEntryForm" property="action"/>
</h2>

<html:form action="/pages/SaveEntry.do">
<table>
  <tr>
  <td>
<bean:message key="prompt.EditPhoneNumberPage.name" />
  </td>
  <td>
<html:text property="name" size="40" />
  </td>
  </tr>
  <tr>
  <td>
<bean:message key="prompt.EditPhoneNumberPage.phoneNumber" />
  </td>
  <td>
<html:text property="phoneNumber" size="40" /></td>
  </tr>
  <html:hidden property="action" />
  <html:hidden property="pk" />
  <tr>
  <td></td>
  <td>
<html:submit>
<bean:message key="button.submit" />
</html:submit> <html:reset>
<bean:message key="button.reset" />
</html:reset>
  </td>
  </tr>
  </table>
  </html:form>
  </tiles:put>
</tiles:insert>

В листинге 1 первые несколько строк настраивают библиотеки тегов, которые будут активны для всей страницы. Они также определяют область контента шаблона сайта в качестве места, в котором будет отображаться содержимое страницы. Данный пример отображает простую, основанную на Struts форму ввода с некоторыми тегами <bean:message> для показа строк из файла ресурсов (расположенного в webapp/WEB-INF/classes/resources/application.properties). Форма передает имя и номер телефона в Struts-действие SaveEntry.do.

Если вы посмотрите на тег класса Javadoc файла с исходным кодом SaveEntry.java, приведенный в листинге 2, то увидите первый пример тегов XDoclet в данном приложении. Эти теги определяют все свойства, необходимые для генерирования дескриптора развертывания Struts, который имеет название struts-config.xml.

Листинг 2. Тег класса SaveEntry.java JavaDoc.
/**
 * Save an Entry
 * 
 * @struts.action
 *    name = "phoneBookEntryForm"
 *    path = "/pages/SaveEntry"
 *    scope = "request"
 *    input = "/pages/EditPhoneNumberPage.jsp"
 *    unknown = "false"
 *    validate = "false"
 * @struts.action-forward
 *    name = "success"
 *    path = "/pages/ListNumbers.do"
 *    redirect = "true"
 */

В двух словах, этот пример кода демонстрирует, что это действие, называемое /pages/SaveEntry, берет исходные данные из EditPhoneNumberPage.jsp и использует phoneBookEntryForm для маршаллизации введенных пользователем данных в Java-код на странице. После завершения действия происходит перенаправление на действие /pages/ListNumbers для отображения списка номеров.

Действие ListNumbers, которое вы можете найти в файле ListNumbers.java, выполняет вызов сессионного EJB-компонента PhoneBookSession, используя код, приведенный в листинге 3.

Листинг 3. Фрагмент метода execute() действия ListNumbers.
PhoneBookSessionLocal session = 
      PhoneBookSessionUtil.getLocalHome().create();

// Вызов метода
Collection c = session.listEntries();

// Поместить полученную информацию в атрибуты запроса 
// для того, чтобы страница смогла ее отобразить.
request.setAttribute("numbers", c);

В листинге 3 вы можете увидеть использование класса PhoneBookSessionUtil. Это класс, сгенерированный XDoclet, который помогает получению "домашних" интерфейсов объекта PhoneBookSession. Создается сессия и вызывается его метод listEntries(), который возвращает набор записей телефонной книги. Затем в этом наборе устанавливается атрибут numbers. Это вызывает помещение телефонных номеров в поименованном месторасположении, которые используемая для отображения записей JSP-страница может извлечь и заполнить список, как показано в листинге 4.

Листинг 4. Display Tag в ListPhoneNumbersPage.jsp
<display:table name="numbers" requestURI="ListNumbers.do" 
    scope="request" pagesize="5" id="row_obj">

    <display:column property="name" title="Name"/>
    <display:column property="phoneNumber" title="Phone"/>

    <display:column title="Actions">
         <logic:present name="row_obj">
              <html:link action="/pages/EditEntry" 
                    paramId="id" paramName="row_obj" 
                    paramProperty="name">Edit</html:link>
              <html:link action="/pages/DeleteEntry" 
                    paramId="id" paramName="row_obj" 
                    paramProperty="name"  
                    onclick="return confirmDelete('Number')">
                    Delete
              </html:link>
         </logic:present>
    </display:column>
...
</display:table>

EJB-уровень

В этом приложении есть два EJB-класса. Первый класс, который использует Container-Managed Persistence (CMP) для обеспечения объектного доступа к таблице базы данных, называется PhoneBookEntryBean. Вторым классом является не сохраняющий состояния сессионный компонент, обеспечивающий бизнес-логику. Часто является желательным управление CMP-компонентами через не сохраняющий состояния сессионный компонент, поскольку сессионные компоненты могут быть настроены на поддержку транзакций для возможности отмены изменений базы данных в случае ошибки. Кроме того, выполнение всех CMP-операций в сессионном компоненте защищает Web-приложение от необходимости знать детали реализации уровня доступа к базе данных. Поэтому, если произойдет замена этого уровня другой технологией (например, использование персистентного уровня Hibernate), код Web-приложения изменять не придется.

XDoclet интенсивно используется на EJB-уровне для генерирования дескриптора развертывания. Важно уменьшить усилия при создании приложения такого типа. Загрузите исходный код и посмотрите на комментарии Javadoc для обоих классов PhoneBookEntryBean.java и PhoneBookSessionBean.java, чтобы увидеть множество XDoclet-тегов, используемых для определения EJB-классов.

Для генерирования метода в не сохраняющем состояния сессионном компоненте достаточно добавить XDoclet-тег, называемый @ejb.interface-method, со свойством view-type, устанавливаемым в local, remote или both. Это указывает XDoclet генерировать соответствующие методы в локальном интерфейсе, удаленном интерфейсе или обоих интерфейсах для сессионного компонента. Вы можете также управлять типом транзакции. Просмотрите листинг 5, являющийся примером одного из интерфейсных методов для вывода списка записей телефонной книги и возврата их значений в объектном представлении.

Листинг 5. Метод listEntries() класса PhoneBookSessionBean.java
/**
 * Вывод списка всех записей телефонной книги.
 * @return - набор объектов PhoneBookEntryValue.
 * 
 * @ejb.interface-method view-type="both"
 * @ejb.transaction      type="Required"
 */
public java.util.Collection listEntries() {
  ArrayList values = new ArrayList();
  try {
      Collection entries = PhoneBookEntryUtil.getLocalHome().findAll();
      Iterator i = entries.iterator();
      while(i.hasNext()) {
            PhoneBookEntryLocal entry = (PhoneBookEntryLocal)i.next();
            values.add(entry.getPhoneBookEntryValue());
      }
  } catch (Throwable ex) {
      ex.printStackTrace();
  }
  return values;
}

Связующий компонент

В моей первой статье "Три способа подключения базы данных к серверу приложений Geronimo" (developerWorks, июнь 2005) детально объясняется важность различных типов планов развертывания в Geronimo. Приведение этого маленького приложения в функциональное состояние было очень непростым и требовало присутствия множества маленьких настроек в плане развертывания, а также взаимодействия между тегами XDoclet, генерируемым тегами кода и планами развертывания. Рассмотрение всех деталей выходит за рамки данной статьи. Пример программы имеет много файлов конфигурации и планов развертывания, почти все из которых находятся в подкаталоге src/resources проекта. В следующих разделах кратко описываются важные детали этих файлов и показывается, где вы должны будете делать изменения для обеспечения работы следующих приложений.

Подкаталог ear содержит дескрипторы развертывания корпоративного приложения, файл application.xml и файл geronimo-application.xml. В данном приложении эти файлы настроены на работу с коннектором Java Database Connectivity (JDBC). Прочитайте статью "Три способа подключения базы данных к серверу приложений Geronimo" (developerWorks, июнь 2005) для получения детальной информации. Файлы mysql-plan.xml и tranql-connector-1.0-SNAPSHOT.rar являются частью этой конфигурации, также как и определения модулей в обоих файлах application.xml и geronimo-application.xml, указывающие корректную настройку JDBC-коннектора при развертывании во время исполнения.

Файл geronimo-application.xml содержит элемент <application>, который имеет атрибут под названием configId. Этот элемент важен для соответствующей работы функции автоматического развертывания сценария компоновки Maven. Это значение может быть использовано в атрибуте id любого тега <deploy:*> в файле maven.xml, как показано в листинге 6.

Листинг 6. Цель start maven.xml.
<goal name="start">
 <deploy:distribute
   uri="deployer:geronimo:jmx:rmi://localhost/jndi/rmi:/JMXConnector"
   username="system"
   password="manager"
   home="${basedir}"
   module="target/${pom.artifactId}.ear"
 />
 <deploy:start
   uri="deployer:geronimo:jmx:rmi://localhost/jndi/rmi:/JMXConnector"
   username="system"
   password="manager"
   id="org/acme/PhoneBook"/>
 </goal>

В листинге 6, поскольку атрибут configId в файле geronimo-application.xml установлен в org/acme/PhoneBook, он должен быть также значением атрибутов id в операторах автоматического развертывания. Команда разработчиков Geronimo спроектировала для этого удобную функцию автоматического развертывания. Однако, если вы часто выполняете автоматическое развертывание, проверьте ваши каталоги temp, поскольку они могут быть заполнены старыми файлами развертывания.

В нашем списке подкаталогов каталога resources присутствует каталог ejb. Внутри подкаталога META-INF размещается дескриптор развертывания openejb-jar.xml. Этот файл важен для установки всех взаимосвязей между вашей базой данных и вашими компонентами управления данными. Важно также сделать небольшие изменения в этом файле для гарантии корректности имен Java Naming и Directory Interface (JNDI) для ваших корпоративных компонентов. Этот файл приведен в листинге 7.

Листинг 7. openejb-jar.xml
<?xml version="1.0"?>
<openejb-jar
    xmlns="http://www.openejb.org/xml/ns/openejb-jar"
    configId="org/acme/PhonebookEJB"
    parentId="MysqlDatabase">
    <cmp-connection-factory>
      <resource-link>MysqlDataSource</resource-link>
    </cmp-connection-factory>
    <enterprise-beans>
        <entity>
            <ejb-name>PhoneBookEntry</ejb-name>
            <local-jndi-name>
java:comp/env/ejb/PhoneBookEntryLocal
</local-jndi-name>
            <table-name>phone</table-name>
            <cmp-field-mapping>
                <cmp-field-name>name</cmp-field-name>
                <table-column>name</table-column>
            </cmp-field-mapping>
            <cmp-field-mapping>
                <cmp-field-name>phoneNumber</cmp-field-name>
                <table-column>phone</table-column>
            </cmp-field-mapping>
        </entity>

        <session>
            <ejb-name>PhoneBookSession</ejb-name>
            <local-jndi-name>
                  java:comp/env/ejb/PhoneBookSessionLocal
            </local-jndi-name>
        </session>
    </enterprise-beans>
</openejb-jar>

Наиболее важным элементом в листинге 7 является <cmp-connection-factory> и его субэлемент <resource-link>. Имя внутри элемента <resource-link> должно соответствовать имени конфигурации JDBC-коннектора, как показано в следующем фрагменте:

...
<connectiondefinition-instance>
       <name>MysqlDataSource</name>
...

Элементы <local-jndi-name> файла openejb-jar.xml тоже важны для обеспечения правильной работы приложения. Если высвечивается ошибка, что не найдены JNDI-имена, вы, возможно, неправильно установили один из этих элементов.

Также в листинге 7 стоит упомянуть элементы <table-name> и <table-column> для ваших компонентов управления данными, в которых вы должны указать отображение столбцов таблиц базы данных на поля компонента управления данными. Взгляните на элементы <cmp-field-mapping> в качестве двух примеров в листинге 7.

Последним подкаталогом каталога src/resources является merge. Содержание этого каталога непосредственно связано со способом, каким выполняется генерирование кода в XDoclet. XDoclet получает информацию из тегов Javadoc, но он также присоединяет информацию из специально названных файлов, находящихся внутри каталога merge. Эти файлы содержат некоторую конфигурационную информацию для уровня Web-приложения. В каталоге src/resources/merge проекта файл taglibs.xml разрешает определение всех библиотек тегов, используемых в приложении. Существует также много файлов, объединяемых в web.xml и struts-config.xml во время их генерирования XDoclet.

Еще один план развертывания, находящийся в файле src/webapp/WEB-INF/geronimo-jetty.xml, приведен в листинге 8.

Листинг 8. geronimo-jetty.xml
<?xml version="1.0"?>
<web-app
      xmlns="http://geronimo.apache.org/xml/ns/web/jetty"
      xmlns:naming="http://geronimo.apache.org/xml/ns/naming"
      configId="org/acme/PhoneBookWeb"
      >

    <context-priority-classloader>true</context-priority-classloader>

</web-app>

В версии M4 Geronimo план развертывания geronimo-jetty.xml был переименован в geronimo-web.xml. Поэтому вам нужно удалить /jetty в листинге 8, если вы используете версию M4. Весь остальной код будет работать так, как описано в статье о Geronimo M4.

В плане развертывания, показанном в листинге 8, присутствует одна важная строка. Если элемент <context-priority-classloader> не установлен в значение true, Struts-приложение не сможет функционировать, поскольку существует конфликт в доступных классах в библиотеке Geronimo. Установка этого значения в true указывает Geronimo использовать стандартную область видимости Web-приложения при поиске классов. Это означает, что приложение изолировано от любых других приложений, выполняющихся на сервере. Но это также означает, что все необходимые приложению классы должны быть подключены к приложению.

Все подключаемые компоненты, от которых зависит приложение, указываются в разделе зависимостей файла project.xml и подключаются автоматически программой Maven.

Последний конфигурационный файл, называемый project.properties, управляет процессом компоновки и расположен в корневом каталоге проекта. В этом фале размещается информация, относящаяся к XDoclet, и информация о том, что включается в war-файлы, и даже свойства, которые управляют выходным форматом компилятора Java.

Объединение вместе всех этих элементов требует длительного времени, но, надеюсь, вы сможете использовать этот пример приложения как указатель на вашем пути.


Резюме

Эта статья предоставляет базовый начальный шаблон для более значительных приложений. Добавляя большее количество CMP-компонентов и сессионных компонентов для бизнес-логики, вы можете создать более интересное Web-приложение. Я продемонстрировал определенные преимущества системы компоновки Maven, уменьшающей сложность компилирования и создания вложенной файловой структуры окончательного .ear-файла. Система генерирования кода XDoclet тоже используется для упрощения процесса генерирования EJB-компонентов, Struts-компонентов и компонентов Web-приложения, необходимых для компилирования окончательного приложения телефонной книги. Используя этот пример приложения, вы должны научиться использовать выгоды Maven и XDoclet для упрощения процесса разработки ваших корпоративных приложений.

Разработчики Geronimo тщательно создавали сам сервер, следуя спецификациям J2EE, и выпустили продукт, который четко разграничивает вопросы развертывания и конфигурирования от деталей, необходимых для размещения приложения в контейнере.


Загрузка

ОписаниеИмяРазмер
Source code for the example phonebook applicationGeronimoPhonebook2.zip128 KB

Ресурсы

Научиться

Получить продукты и технологии

  • Geronimo использует Apache Maven для управления компоновкой проекта. Для большинства проектов используется система контроля версий Subversion, а несколько проектов все еще находятся под CVS.
  • Загрузите Gluecode Standard Edition - свободно распространяемый сервер приложений, основанный на Apache Geronimo.
  • Примените в вашем следующем проекте с открытым исходным кодом пробное программное обеспечение IBM, доступное для загрузки или на DVD.

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source, Технология Java
ArticleID=99788
ArticleTitle=Погружение в EJB Web-приложения с Geronimo
publish-date=07192005