JNDI - это API-интерфейс или библиотека, которая обеспечивает приложения методами для связывания имен с объектами и поиска этих объектов в каталоге. Данная статья, первая в цикле, дает понимание того, как взаимосвязаны Apache Geronimo, JNDI и пулы соединений источников данных, как создать соединение с источником данных, а затем обратиться к нему в простом приложении Geronimo - которое называется утилита Customer Service - с использованием JNDI.
Понятие Источник данных относится к объекту, или фабрике, которые создают соединение с фактическим источником данных (обычно базой данных) внутри приложения. На платформе Java Enterprise Edition (Java EE) это понятие относится к пулу соединений с базой данных - группе легко доступных соединений с базой данных. Причиной для создания пула подключений к источникам данных или базам данных является то, что он увеличивает производительность приложения, так как открытие даже единственного соединения сильно загружает центральный процессор.
Утилита Customer Service (доступная в разделе Загрузка данной статьи) является простым Web-приложением, которое позволяет сохранять основную информацию о клиентах в базу данных. Вы можете собрать ее, используя Apache Ant 1.6.5 и Java 1.4.2_10, развернуть в Geronimo 1.1 с помощью Tomcat, используя базу данных Apache Derby, которая поставляется в комплекте с Geronimo (см. ссылку для загрузки Geronimo в разделе Ресурсы в конце статьи). Следующий раздел освещает, как создать эту базу данных и источник данных, используя консоль Geronimo.
Консоль Geronimo обеспечивает удобный для пользователя способ управления компонентами Java EE. После запуска Geronimo вы получите к нему доступ по адресу http://localhost:8080/console. system и manager - это установленные по умолчанию имя пользователя и пароль соответственно.
Чтобы взяться за дело:
- Нажмите ссылку DB Manager в нижней левой части Навигационной панели консоли. Появится администратор баз данных Derby.
- Создайте базу данных Customer Service, введя
CustomerServiceDatabaseв поле Create DB, затем нажмите кнопку Create. - Создайте таблицу базы данных, выбрав CustomerServiceDatabase из ниспадающего меню Use DB.
- Вставьте содержимое SQL кода, из листинга 1, в таблицу и нажмите кнопку Run SQL. SQL-код в листинге 1 включен в файл с исходным кодом программы.
Листинг 1. SQL код
CustomerService-Part1.sql
create table customers (
customerid varchar(10) primary key,
fullname varchar(30),
emailaddress varchar(30),
interests varchar(100)
);
insert into customers values ('A100','John Doe10','Doe10@work.com','Java,Open Source,
Computer Graphics');
insert into customers values ('b100','Jane Doe20','Doe20@home.net','Budget Travel, New
Zealand, Martial Arts');
|
Теперь база данных Customer Service должна быть создана в Derby. Здесь только одна таблица, Customers, состоящая из двух записей. Рисунок 1 показывает, как выглядит правильно созданная таблица после нажатия сначала ссылки Application, а затем ссылки View Contents.
Рисунок 1. База данных Customer Service после инициализации
Далее вы создаете пул соединений для недавно созданной базы данных:
- Нажмите ссылку Database Pools в навигационной панели Консоли слева.
- Затем нажмите ссылку Using the Geronimo database pool wizard и выполните следующие действия:
- На странице под названием Шаг 1: Выбор имени и базы данных введите
CustomerServicePoolв поле Name of Database Pool. Выберите Derby embedded из ниспадающего меню Database Type и нажмите Next. - На странице под названием Шаг 2: Выбор Driver, JAR, Parameters, выберите org.apache.derby/derby/10.1.1.0/jar из ниспадающего меню Driver JAR. В поле DB User Name введите
app. Поле DB Password оставьте пустым. ВведитеCustomerServiceDatabaseв поле Database и нажмите Next. - На странице под названием Шаг 3: Завершающая конфигурация пула убедитесь, что поле Driver Status показывает
Loaded Successfully. Поле Connection Pool Parameters может оставаться пустым. Нажмите кнопку Test Connection, чтобы перейти к следующей странице. - На странице под названием Шаг 4: Тестирование соединения поле Test Result должно показывать
Connected to Apache Derby 10.1.1.0. Нажмите Deploy. Рисунок 2 показывает недавно созданный пул соединений.
Рисунок 2. Недавно созданный источник данных
CustomerServicePool
К этому времени база данных (CustomerServiceDatabase) и источник данных (CustomerServicePool) должны быть сконфигурированы и развернуты в Geronimo и готовы к использованию. Далее посмотрим, как объявить эти объекты в JNDI .
Создание дескрипторов развертывания Geronimo
Любой компонент, развернутый в Geronimo, нуждается в дескрипторах развертывания. Даже ранее созданный CustomerServicePool использует файл дескриптора, что подтверждается кнопкой Show Plan на странице под названием Шаг 4: Тестирование соединения. Наиболее распространенные компоненты, которые создает большинство разработчиков, это EJB (JAR-файлы), Web-архивы (WAR-файлы) и архивы приложений (EAR-файлы). Утилита Customer Service использует каждый из этих видов компонентов.
Конфигурирование файлов дескриптора важно, так как это механизм, позволяющий использовать эти компоненты в Geronimo. Он связывает имя JNDI с данным Java объектом. Компоненты, развернутые в Geronimo, обычно имеют два файла развертывания: стандартный дескриптор развертывания Java и специальный план развертывания Geronimo. Основным ресурсом является CustomerServiceDatabase. Источник данных, CustomerServicePool, предоставляет некоторое количество соединений для доступа к этой базе данных. Чтобы сохранить информацию о клиентах, пользователь обращается к Web-интерфейсу и вводит информацию в поля. Эти поля передаются в компонент Java (bean), который ссылается на сессионный компонент (session bean). Сессионный компонент создает ссылку на информацию о пользователе в entity-компонент (сущностный компонент), что позволяет ему выполнять основные операции базы данных. Entity-компонент - это Java-объект, представляющий одну строку в таблице клиентов, а также компонент, ссылающийся на CustomerServicePool для доступа к базе данных. Листинг 2 содержит стандартный Java-дескриптор развертывания для этого компонента.
Листинг 2. Частичный листинг CustomerEJB-ejb.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN"
"http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
<enterprise-beans>
<entity>
<ejb-name>CustomerEntityBean</ejb-name>
<home>com.service.customer.ejb.CustomerHome</home>
<remote>com.service.customer.ejb.Customer</remote>
<ejb-class>com.service.customer.ejb.CustomerEntityBean</ejb-class>
<persistence-type>Container</persistence-type>
<resource-ref>
<res-ref-name>jdbc/CustomerServiceDataSource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</entity>
</enterprise-beans>
</ejb-jar>
|
Здесь нас интересует четыре тега. Тег <ejb-name> задает имя entity-компонента. Тег <persistence-type> указывает, что этот компонент использует управляемую контейнером персистентность (CMP). Это означает, что все операции базы данных автоматически выполняются Geronimo. Тег <res-ref-name> задает JNDI-имя, которое будет использоваться при поиске. Реализация entity-компонента с использованием CMP минимальна, и никакого JNDI-поиска явно не запрограммировано. Однако объявление в теге <res-ref-name> все-таки требуется. Наконец, тег <res-type> указывает, какой тип объектов ассоциируется с именем JNDI. Листинг 3 показывает сопровождающий специальный файл Geronimo для entity-компонента.
Листинг 3. Частичный листинг CustomerEJB-openejb.xml
<?xml version="1.0" encoding="UTF-8"?>
<openejb-jar xmlns="http://www.openejb.org/xml/ns/openejb-jar-2.1"
xmlns:naming="http://geronimo.apache.org/xml/ns/naming-1.1">
<dep:environment xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.1">
<dep:moduleId>
<dep:groupId>default</dep:groupId>
<dep:artifactId>CustomerEJB</dep:artifactId>
<dep:version>1.0</dep:version>
<dep:type>jar</dep:type>
</dep:moduleId>
<dep:dependencies>
<dep:dependency>
<dep:groupId>console.dbpool</dep:groupId>
<dep:artifactId>CustomerServicePool</dep:artifactId>
<dep:version>1.0</dep:version>
<dep:type>rar</dep:type>
</dep:dependency>
</dep:dependencies>
<dep:hidden-classes/>
<dep:non-overridable-classes/>
</dep:environment>
<cmp-connection-factory>
<resource-link>CustomerServicePool</resource-link>
</cmp-connection-factory>
<enterprise-beans>
<entity>
<ejb-name>CustomerEntityBean</ejb-name>
<jndi-name>CustomerRemoteEntity</jndi-name>
<resource-ref>
<ref-name>jdbc/CustomerServiceDataSource</ref-name>
<resource-link>CustomerServicePool</resource-link>
</resource-ref>
</entity>
</enterprise-beans>
</openejb-jar>
|
Значение <ejb-name> должно соответствовать значению <ejb-name> в сопровождающем файле дескриптора. Тег <jndi-name> задает имя JNDI, которое будут использовать только клиенты приложения. Эти клиенты не прилагаются к файлу архива приложения (.ear). Тег <ref-name> соответствует имени JNDI в теге <res-ref-name>
листинга 2. Тег <resource-link> связывает CustomerServicePool, созданный в консоли Geronimo с именем в <ref-name>.
Следует отметить, что формат специальных дескрипторов развертывания Geronimo изменился с версией 1.1. В предыдущей версии использовались атрибуты configID и parentID в заголовке для задания идентификатора и зависимости объекта. Этот формат теперь заменен структурой moduleId, согласованной со стилем присвоения имен в Apache Maven. Он состоит из четырех элементов следующего образца: groupID/artifactID/version/type. Эта модель именования соответствует структуре развертывания в geronimo-1.1/repository.
Теги <dep:XXX> в приведенном выше файле дескриптора соответствуют этому соглашению. Например, зависимость, CustomerServicePool, расположена в репозитории Geronimo в console/dbpool/CustomerServicePool/1.0. Это новое соглашение означает, что приложения, развернутые в Geronimo 1.0 должны быть модернизированы. В руководстве пользователя 1.1 есть раздел о том, как это делается. Однако будущие выпуски Geronimo будут поддерживать это соглашение, поэтому приложения, развернутые в версии 1.1, должны разворачиваться в будущих версиях без модернизации дескрипторов.
Теперь продолжим конфигурировать сессионный компонент в листинге 4.
Листинг 4. Частичный листинг ProcessCustomerEJB-ejb.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans
2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
<enterprise-beans>
<session>
<ejb-name>ProcessCustomerSessionBean</ejb-name>
<home>com.service.customer.ejb.ProcessCustomerHome</home>
<remote>com.service.customer.ejb.ProcessCustomer</remote>
<ejb-class>com.service.customer.ejb.ProcessCustomerSessionBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<ejb-ref>
<ejb-ref-name>ejb/CustomerEntityBean</ejb-ref-name>
<ejb-ref-type>Entity</ejb-ref-type>
<home>com.service.customer.ejb.CustomerHome</home>
<remote>com.service.customer.ejb.Customer</remote>
</ejb-ref>
</session>
</enterprise-beans>
</ejb-jar>
|
Тег <ejb-name> задает имя сессионного компонента - ProcessCustomerSessionBean. Тег <ejb-ref-name> задает имя JNDI, которое будут использовать компоненты приложения. В данном случае, сессионный компонент будет выполнять поиск по entity-компоненту. Соответствующий специальный план Geronimo показан в листинге 5.
Листинг 5. Листинг ProcessCustomerEJB-openejb.xml
<?xml version="1.0" encoding="UTF-8"?>
<openejb-jar xmlns="http://www.openejb.org/xml/ns/openejb-jar-2.1"
xmlns:naming="http://geronimo.apache.org/xml/ns/naming-1.1"
xmlns:security="http://geronimo.apache.org/xml/ns/security-1.1"
xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.1">
<dep:environment>
<dep:moduleId>
<dep:groupId>default</dep:groupId>
<dep:artifactId>ProcessCustomerSessionBean</dep:artifactId>
<dep:version>1.0</dep:version>
<dep:type>jar</dep:type>
</dep:moduleId>
<dep:dependencies/>
<dep:hidden-classes/>
<dep:non-overridable-classes/>
</dep:environment>
<enterprise-beans>
<session>
<ejb-name>ProcessCustomerSessionBean</ejb-name>
<jndi-name>ProcessCustomerRemoteSessionBean</jndi-name>
<ejb-ref>
<ref-name>ejb/CustomerEntityBean</ref-name>
<ejb-link>CustomerEntityBean</ejb-link>
</ejb-ref>
</session>
</enterprise-beans>
</openejb-jar>
|
Тег <dep:moduleId> задает полное имя этого компонента. Подобно entity-компоненту, тег <ejb-name> должен соответствовать тегу <ejb-name> в стандартном дескрипторе из предыдущего листинга. А тег <jndi-name> содержит имя JNDI, используемое только клиентами приложения. Наконец, тег <ejb-ref> связывает имя JNDI с именем EJB. Далее следует Web-архив, и он ссылается на сессионный компонент из Java-компонента. Его стандартный дескриптор развертывания показан в листинге 6.
Листинг 6. Частичный листинг web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
version="2.4">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<ejb-ref>
<ejb-ref-name>ejb/ProcessCustomerSessionBean</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>com.service.customer.ejb.ProcessCustomerHome</home>
<remote>com.service.customer.ejb.ProcessCustomer</remote>
</ejb-ref>
</web-app>
|
Обратить внимание следует прежде всего на тег <ejb-ref>. Он показывает как объявлять имя JNDI, которое будет использоваться для поиска сессионного компонента.
Специальный план Geronimo для Web-архива совершенно простой. Он определяет полное имя Web-архива и задает контекстный корень, в котором может быть найдено приложение при доступе из Web-браузера (см. листинг 7).
Листинг 7. Листинг geronimo-web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-1.1"
xmlns:naming="http://geronimo.apache.org/xml/ns/naming-1.1">
<dep:environment xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.1">
<dep:moduleId>
<dep:groupId>default</dep:groupId>
<dep:artifactId>CustomerService-web</dep:artifactId>
<dep:version>1.0</dep:version>
<dep:type>war</dep:type>
</dep:moduleId>
<dep:dependencies/>
<dep:hidden-classes/>
<dep:non-overridable-classes/>
</dep:environment>
<context-root>/service</context-root>
</web-app>
|
Утилита Customer Service развернута как .ear файл. Поэтому она имеет два файла дескриптора, application.xml и geronimo-application.xml. Однако ни один из этих файлов не содержит объявлений JNDI, поэтому здесь они не рассматриваются. Вот и все, что нужно, чтобы объявить JNDI-имена и привязать их к EJB-компонентам! Следующий раздел освещает, как находить эти объекты в коде.
Утилита Customer Service почти готова. Следующим шагом будет вызвать эти EJB, используя JNDI для доступа к базе данных. Полные строки JNDI отвечают соглашению присвоения имен, как показано в листинге 8.
Листинг 8. Листинг JNDI-имен в customer.properties
# Specify!!!!! JNDI names here
jndi.customer.ejb=java:/comp/env/ejb/CustomerEntityBean
jndi.process.ejb=java:/comp/env/ejb/ProcessCustomerSessionBean
|
Имена, объявленные ранее в теге <ejb-ref-name> EJB-дескрипторов, теперь показаны в полном контексте JNDI-имени. В соответствии с соглашением именования объекты должны следовать за соответствующими доменами. Отсюда, сессионные и entity-компоненты сопровождаются приставкой ejb/. CustomerServiceDataSource, объявленный в файле дескриптора entity-компонента, использует jdbc/, так как он относится к базе данных. Код в листинге 9 показывает, как производить JNDI-поиск CustomerEntityBean из сессионного компонента, используя полное имя.
Листинг 9. Частичный листинг ProcessCustomerSessionBean.java
package com.service.customer.ejb;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
public class ProcessCustomerSessionBean implements SessionBean
{
private ResourceBundle bundle = null;
private SessionContext context = null;
private CustomerHome customerHome = null;
private String JNDI_CUSTOMER_EJB = null;
// Create method(s)
public void ejbCreate()
throws CreateException
{
try
{
doJNDILookups();
} // end try
catch (Exception e)
{
throw new CreateException("ejbCreate: " + e.getMessage());
} // end catch
} // end ejbCreate
// Support methods
private void doJNDILookups()
throws NamingException, ClassCastException
{
Object objref = null;
InitialContext initial = null;
bundle = ResourceBundle.getBundle("customer", Locale.getDefault(),
ProcessCustomerSessionBean.class.getClassLoader());
JNDI_CUSTOMER_EJB = bundle.getString("jndi.customer.ejb");
initial = new InitialContext();
objref = initial.lookup(JNDI_CUSTOMER_EJB);
customerHome = (CustomerHome)PortableRemoteObject.narrow(objref,
CustomerHome.class);
System.out.println("looking up: " + JNDI_CUSTOMER_EJB);
} // end doJNDILookups
} // end ProcessCustomerSessionBean
|
Основным элементом, интересующим нас в листинге 9, является метод doJNDILookups. Во-первых, полное имя JNDI получается из файла customer.properties. Далее, создается InitialContext и производится поиск по JNDI-имени. Наконец, узкий метод проверяет, может ли полученный объект из JNDI быть отнесен к намеченному типу объектов, CustomerHome. Листинг 10 показывает, как выполняется поиск из компонента Java.
Листинг10. Частичный листинг CustomerServiceJavaBean.java
public class CustomerServiceJavaBean
{
private ProcessCustomerHome processHome = null;
private ResourceBundle bundle = null;
private String JNDI_PROCESS_EJB = null;
public CustomerServiceJavaBean()
{
InitialContext initial = null;
Object objref = null;
bundle = ResourceBundle.getBundle("customer", Locale.getDefault(),
CustomerServiceJavaBean.class.getClassLoader());
JNDI_PROCESS_EJB = bundle.getString("jndi.process.ejb");
try
{
initial = new InitialContext();
objref = initial.lookup(JNDI_PROCESS_EJB);
processHome = (ProcessCustomerHome)PortableRemoteObject.narrow(objref,
ProcessCustomerHome.class);
System.out.println("looking up: " + JNDI_PROCESS_EJB);
} // end try
catch (Exception e)
{
e.printStackTrace();
} // end catch
} // end CustomerServiceJavaBean
} // end CustomerServiceJavaBean
|
Шаги для поиска ProcessCustomerSessionBean похожи на поиск entity-компонента. Только теперь JNDI-имя другое, а для подтверждения найденного объекта из JNDI используется класс ProcessCustomerHome.
Теперь утилита Customer Service готова для развертывания в Geronimo:
- Измените файл CustomerService/resources/build.properties, и убедитесь, что местонахождение директорий определено правильно.
- Далее откройте консоль и измените директории на местонахождение CustomerService/build.xml. Затем введите
ant. Это создаст и развернет приложение, к которому можно обратиться по адресу http://localhost:8080/service.
Рисунок 3 показывает, как выглядит страница ввода данных.
Рисунок 3. Страница ввода данных для утилиты Customer Service
На этой стадии в базе данных сохраняется только самая важная информация о клиентах.
Есть один последний вопрос, на который следует обратить внимание. Разработчики могут столкнуться с ошибкой SQL Exception, пытаясь обратиться к утилите Customer Service после получения доступа к базе данных Derby из консоли Geronimo, или наоборот. Перезагрузка Geronimo исправит ошибку один раз, но затем снова выдаст exception при другой попытке обратиться к базе данных. Это проблема относится к условию, описанному в Учебном пособии пользователя по Geronimo 1.1 в конце раздела (см. ссылку в Ресурсах).
Это условие вызывается, когда пул соединений базы данных имеет зависимость от драйверов Derby (org.apache.derby/derby/10.1.1.0/jar) или Derbynet (org.apache.derby/derbynet/10.1.1.0/jar). Сохранение зависимости как таковой загрузит вторую копию Derby во втором загрузчике класса, что вызовет SQL Exception. Мастер пулов базы данных Geronimo создаст план, имеющий эту зависимость, когда используется Derby embedded. В качестве альтернативы можно вырезать и вставить сгенерированный план и развернуть его как часть архива приложения. Таким образом, пул базы данных становится индивидуальным только для утилиты Customer Service. Существующие планы дескриптора потребуют модификации, и в последующих листингах, начиная с листинга 11, выделяются эти изменения.
Листинг 11. Модифицированный CustomerServicePool-alt.xml
<dep:moduleId>
<dep:groupId>default</dep:groupId>
<dep:artifactId>CustomerServicePool</dep:artifactId>
<dep:version>1.0</dep:version>
<dep:type>rar</dep:type>
</dep:moduleId>
|
Сгенерированный план получен из мастера пулов базы данных. На странице под названием Шаг 4: Тестирование соединения нажмите кнопку Show Plan вместо Deploy. После того, как сгенерированный план будет вырезан, вставлен и сохранен в другом файле, например, CustomerServicePool-alt.xml, тег <groupId> должен быть изменен, чтобы соответствовать содержимому листинга 11, так как теперь CustomerServicePool будет развертываться как часть приложения. Теперь этот тег <groupId> будет соответствовать тегу <groupId> в geronimo-application.xml, который частично отображен в листинге 12.
Листинг 12. Альтернативный geronimo-application.xml
<module>
<connector>tranql-connector-1.2.rar</connector>
<alt-dd>CustomerServicePool-alt.xml</alt-dd>
</module>
|
Дескриптору geronimo-application.xml понадобится дополнительный тег из листинга 12. Это также касается стандартного application.xml, показанного в листинге 13.
Листинг 13. Альтернативный application.xml
<module>
<connector>tranql-connector-1.2.rar</connector>
</module>
|
Этот дополнительный тег также необходим в application.xml для альтернативного развертывания. Листинг 14 показывает измененный код, требуемый в дескрипторе, CustomerEJB-openejb.xml.
Листинг 14. Модифицированный CustomerEJB-openejb.xml
<dep:dependencies/>
|
Существующий тег <dependencies> на CustomerServicePool может быть заменен кодом, показанным в листинге 14.
Наконец, драйвер tranql и измененный план пула базы данных должны быть привязаны на одном уровне как JAR и WAR-файлы внутри архива приложения (.ear файл). Драйвер tranql поставляется в комплекте с Geronimo и расположен в папке репозитория C.
Надеемся, что первая статья этой серии помогла вам понять одно из наиболее распространенных JNDI-соединений - доступ к пулу базы данных из EJB. Вы узнали, как использовать консоль Geronimo, чтобы инициализировать базу данных и конфигурировать пул соединений базы данных. Наконец, утилита Customer Service показала вам, как можно получить доступ к этому пулу соединений из кода. В следующей статье данного цикла речь пойдет о JNDI-соединениях с JMS-ресурсом и об их использовании для совершенствования нашего учебного приложения.
| Описание | Имя | Размер | Метод загрузки |
|---|---|---|---|
| Исходный текст программы, Часть 1 | CustomerService-part1.zip | 57KB | HTTP |
Научиться
- Оригинал статьи Apache Geronimo JNDI naming and Java resource connection pools, Part 1: Data source connections.
- Прочитайте Apache Geronimo v1.1 - руководство пользователя, собранную Apache всю документацию для Apache Geronimo v1.1.
- Прочитайте онлайновую книгу Аарона Малдера (Aaron Mulder)
Apache Geronimo: разработка и развертывание
, чтобы узнать, как устанавливать и настраивать сервер приложений Apache Geronimo.
- Прочитайте Учебное пособие по J2EE 1.4, выпуск 7 для руководства по разработке корпоративных приложений для J2EE версии 1.4.
- Прочитайте "Развертывание приложений J2EE на Apache Geronimo" (developerWorks, январь 2006).
- Возьмите учебник для начинающих "Использование регулярных выражений" (developerWorks, сентябрь 2000).
- Просмотрите статьи, учебные пособия и другие ресурсы в разделе проекта Apache Geronimo developerWorks, что поможет вам начать разработку с Geronimo сегодня.
- Найдите полезные ресурсы для начинающих и опытных пользователей в разделе developerWorks Начните сейчас вместе с Apache Geronimo.
- Взгляните на предложение Поддержка IBM® для Apache Geronimo, которое позволяет вам разрабатывать Geronimo приложения, имеющие поддержку IBM мирового класса.
- Посетите раздел Open source developerWorks для всесторонней информации по методам разработки, инструментам, и обновленным проектам, которые помогут вам в разработке при помощи технологий открытых исходных кодов и их использовании вместе с продуктами IBM.
- Найдите все статьи по Apache и бесплатные учебные пособия по Apache, доступные на зоне открытых ресурсов developerWorks.
- Найдите книги на эти и другие технические темы на Safari bookstore.
Получить продукты и технологии
- Загрузите Apache Geronimo 1.1.
- Загрузите Apache Ant 1.6.5.
- Загрузите Java 2 Platform, Standard Edition (J2SE) 1.4.2 от Sun.
- Введите новшество в ваш следующий проект разработки открытого кода при помощи пробного программного обеспечения IBM, доступного для загрузки или на DVD.
- Загузите бесплатную копию IBM WebSphere® Application Server Community Edition V1.0 -- облегченный сервер приложения J2EE, построенный на технологии открытых исходных кодов Apache Geronimo, которая предназначена, чтобы помочь вам ускорить разработку и развертывание.
Обсудить
- Примите участие в обсуждении материала на форуме.
- Будьте в курсе разработок с Geronimo на Apache Geronimo blog.
- Включайтесь в сообщество developerWorks, участвуя в блогах developerWorks.
Дэйл де лос Рейес (Dale de los Reyes) закончил в 1996 году Калифорнийский Политехнический Государственный Университет с дипломом специалиста по вычислительной технике. Его опыт работы включает разработку приложений на J2EE, C++ для Microsoft® Windows® и COBOL для центральных ЭВМ. В свободное время он фотографирует, упражняется в боевых искусствах и занимается независимыми проектами.