Учебное пособие по J2EE. Глава 2. Начало работы

В этом разделе описывается разработка, размещение и запуск простого клиент-серверного приложения, состоящего из корпоративного компонента конверсии валют и двух клиентов: клиентского J2EE-приложения и Web-клиента на основе JSP-страницы.

Dale Green

В этом разделе описывается разработка, размещение и запуск простого клиент-серверного приложения, состоящего из корпоративного компонента конверсии валют и двух клиентов: клиентского J2EE-приложения и Web-клиента на основе JSP-страницы.

Подготовка
Получение кода примера
Получение средств сборки (ant)
Проверка переменных окружения
Запуск J2EE-сервера
Запуск deploytool
Создание J2EE приложения
Создание корпоративного компонента (enterprise bean)
Кодирование корпоративного компонента
Компилирование файлов с исходными кодами
Пакетирование корпоративного компонента
Создание клиентского J2EE-приложения
Кодирование клиентского J2EE-приложения
Компиляция клиентского приложения
Пакетирование клиентского J2EE приложения
Установка ссылки корпоративного компонента клиентского приложения
Создание Web-клиента
Кодирование Web-клиента
Компиляция Web-клиента
Пакетирование Web-клиента
Установка ссылки корпоративного компонента Web-клиента
Установка имен JNDI
Размещение J2EE-приложения
Запуск клиента J2EE-приложения
Запуск Web-клиента
Модификация J2EE-приложения
Модификация файла класса
Добавление файла
Модификация Web-клиента
Модификация установок размещения
Общие проблемы и их решение
Неудачный старт J2EE-сервера
Ошибки компиляции
Ошибки размещения
Ошибки времени исполнения клиента J2EE-приложения
Ошибки времени исполнения Web-клиента
Обнаружение проблем при помощи проверочного средства (Verifier)
Сравнение вашего EAR-файла с нашим
Другие ошибки

Подготовка

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

Получение кода примера

Исходный код компонентов находится в j2eetutorial/examples/src/ejb/converter, в каталоге, создаваемом при разархивировании файла учебного пособия. Если вы просматриваете данное пособие в Internet, вы должны загрузить файл пособия:

http://java.sun.com/j2ee/download.html#tutorial

Получение средств сборки (ant)

Для компиляции кодов примера вам необходимы инсталляции J2EE SDK и ant - переносимого make-средства. Более детальную информацию Вы найдете в разделе "Как построить и запустить примеры".

Проверка переменных окружения

Инструкции по установке J2EE SDK и ant объясняют, как установить требуемые переменные окружения. Проверьте, что переменные окружения установлены в значения, указанные в таблице 1.

Таблица 1. Требуемые переменные окружения

Переменная окружения

Значение

JAVA_HOME

Месторасположение J2SE(tm) SDK

J2EE_HOME

Месторасположение J2EE(tm) SDK

ANT_HOME

Месторасположение ant

PATH

Должен включать bin директории инсталляций J2EE SDK, J2SE, и ant

Запуск J2EE-сервера

Для запуска J2EE-сервера откройте окно терминала и наберите следующую команду

j2ee -verbose

Хотя это и не требуется, опция verbose полезна для отладки.

Для остановки сервера наберите команду

j2ee -stop

Запуск deploytool

Утилита deploytool имеет два режима: командная строка и GUI. Инструкции в этом разделе относятся к GUI-версии. Для запуска deploytool GUI откройте окно терминала и наберите такую команду:

deploytool

Для просмотра контекстно-зависимой помощи утилиты нажмите клавишу F1.

Создание J2EE приложения

Приложение содержит три J2EE-компонента: корпоративный компонент, клиент J2EE-приложения и Web-компонент. Перед построением этих компонент вы должны создать J2EE-приложение, называемое ConverterApp и сохранить его в EAR-файле под именем ConverterApp.ear.

  1. В deploytool выберите File->New->Application.

  2. Нажмите Browse.

  3. В списке файлов выберите j2eetutorial/examples/src/ejb/converter.

  4. В поле File Name введите ConverterApp.ear.

  5. Нажмите New Application.

  6. Нажмите OK.

Создание корпоративного компонента (enterprise bean)

Корпоративный компонент - это компонент, расположенный на сервере и содержащий бизнес-логику приложения. Во время исполнения клиентские приложения выполняют бизнес-логику путем активизации методов корпоративного компонента. Корпоративный компонент в нашем примере представляет собой не изменяющий своего состояния (stateless) сессионный компонент, называемый ConverterEJB. Исходный код для ConverterEJB находится в каталоге j2eetutorial/examples/src/ejb/converter.

Кодирование корпоративного компонента

Корпоративный компонент в нашем примере состоит из следующих частей:

  • Удаленный интерфейс

  • "Домашний" интерфейс

  • Класс корпоративного компонента

Кодирование удаленного интерфейса

Удаленный интерфейс определяет бизнес методы, которые может вызывать клиент. Бизнес методы встроены в код корпоративного компонента. Исходный текст удаленного интерфейса Converter приведен ниже:

import javax.ejb.EJBObject;
import java.rmi.RemoteException;
import java.math.*;

public interface Converter extends EJBObject {
 
public BigDecimal dollarToYen(BigDecimal dollars) throws RemoteException;

 
public BigDecimal yenToEuro(BigDecimal yen) throws RemoteException;
}

Кодирование "домашнего" интерфейса

"Домашний" интерфейс определяет методы, позволяющие клиенту создавать, находить или удалять корпоративный компонент. Интерфейс ConverterHome содержит простой метод create, который возвращает объект, имеющий тип удаленного интерфейса. Ниже приведен исходный код интерфейса ConverterHome:

import java.io.Serializable;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;

public interface ConverterHome extends EJBHome {
 
Converter create() throws RemoteException, CreateException;
}

Кодирование класса корпоративного компонента

Класс корпоративного компонента для данного примера называется ConverterBean. Этот класс реализует два бизнес-метода: dollarToYen и yenToEuro, определенные удаленным интерфейсом Converter. Исходный код класса ConverterBean следующий:

import java.rmi.RemoteException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import java.math.*;

public class ConverterBean implements SessionBean {
 
BigDecimal yenRate = new BigDecimal("121.600");
  BigDecimal euroRate =
new BigDecimal("0.0077");

 
public BigDecimal dollarToYen(BigDecimal dollars) {
   
BigDecimal result = dollars.multiply(yenRate);
   
return result.setScale(2, BigDecimal.ROUND_UP);
 
}

 
public BigDecimal yenToEuro(BigDecimal yen) {
   
BigDecimal result = yen.multiply(euroRate);
   
return result.setScale(2, BigDecimal.ROUND_UP);
 
}

 
public ConverterBean() {
  }

 
public void ejbCreate() {
  }

 
public void ejbRemove() {
  }

 
public void ejbActivate() {
  }

 
public void ejbPassivate() {
  }

 
public void setSessionContext(SessionContext sc) {
  }
}

Компилирование файлов с исходными кодами

Теперь можно произвести компиляцию удаленного интерфейса (Converter.java), "домашнего" интерфейса (ConverterHome.java) и класса корпоративного компонента (ConverterBean.java):

  1. В окне терминала перейдите в каталог j2eetutorial/examples.

  2. Наберите следующую команду:

ant converter

По этой команде компилируются исходные файлы корпоративного компонента и клиентского J2EE-приложения. Созданные в результате файлы классов будут расположены в каталоге j2eetutorial/examples/build/ejb/converter (не в каталоге src). Информацию о программе ant можно найти в разделе "Как построить и запустить примеры".

Замечание: Во время компиляции кода вышеупомянутая программа ant включает j2ee.jar-файл в classpath. Этот файл находится в каталоге lib инсталляции J2EE SDK. Если планируется использование других средств для компиляции исходных кодов J2EE-компонентов, необходимо убедиться, что в classpath включен j2ee.jar-файл.

Пакетирование корпоративного компонента

Для пакетирования корпоративного компонента используется мастер New Enterprise Bean утилиты deploytool. Во время этого процесса мастер выполняет следующие задачи:

  • Создает дескриптор размещения корпоративного компонента
  • Пакетирует дескриптор размещения и классы компонента в EJB JAR-файл
  • Помещает EJB JAR-файл в файл ConverteApp.ear приложения

Во время процесса пакетирования можно просматривать дескриптор размещения, выбрав Tools->Descriptor Viewer.

Для запуска мастера New Enterprise Bean нужно выбрать File->New->Enterprise Bean. Мастер отобразит следующие диалоговые окна:

  1. Introduction (Введение)
    1. Прочитайте поясняющий текст о возможностях мастера.
    2. Нажмите кнопку Next (Дальше).
  2. EJB JAR
    1. Нажмите кнопку Create New JAR File In Application (Создать новый JAR-файл для приложения).
    2. В списке выберите ConverterApp.
    3. В поле JAR Display Name наберите ConverterJAR.
    4. Нажмите Edit (Редактирование).
    5. В древовидном списке Available Files (Доступные файлы) выберите каталог j2eetutorial/examples/build/ejb/converter. (Если каталог converter находится на слишком дальних уровнях дерева, можно упростить внешний вид дерева, введя весь или часть пути к каталогу converter в поле Starting Directory (Начальный каталог)).
    6. Выберите следующие классы в дереве Available Files и нажмите кнопку Add (Добавить): Converter.class, ConverterBean.class и ConverterHome.class. (Можно также перетянуть эти файлы классов в текстовую область Contents).
    7. Нажмите OK.
    8. Нажмите Next.
  3. General (Общие)
    1. Ниже поля Bean Type (Тип bean) выберите переключатель Session (Сессионный).
    2. Выберите переключатель Stateless (не сохраняющий состояния).
    3. В списке Enterprise Bean Class выберите ConverterBean.
    4. В поле Enterprise Bean Name введите ConverterEJB.
    5. В списке Home Interface выберите ConverterHome.
    6. В списке Remote Interface выберите Converter.
    7. Нажмите кнопку Next.
  4. Transaction Management (Менеджер транзакций)
    Так как вы можете пропустить оставшиеся диалоговые окна, нажмите кнопку Finish (Конец).

Создание клиентского J2EE-приложения

Клиентское J2EE-приложение – это программа, написанная на языке программирования Java(tm). Во время выполнения клиентская программа работает на другой виртуальной машине, нежели J2EE-сервер.

Клиентское J2EE-приложение в данном примере требует двух различных JAR-файлов. Первый JAR-файл предназначен для клиентского J2EE-компонента. Этот JAR-файл содержит дескриптор размещения клиента и его файлы классов. После запуска мастера New Application Client (Новое клиентское приложение) программа deploytool автоматически создает JAR-файл и сохраняет его в EAR-файле приложения. Как определено в спецификации J2EE, JAR-файл является переносимым для всех совместимых J2EE-серверов.

Второй JAR-файл содержит классы-заглушки (stub classes), требуемые клиентской программой во время выполнения. Эти классы разрешают клиенту доступ к корпоративным компонентам, работающим на J2EE-сервере. Так как этот второй JAR-файл не предусмотрен спецификацией J2EE, он является специфичным для данной реализации, предназначенным только для J2EE SDK.

Исходный код клиентского J2EE-приложения находится в j2eetutorial/examples/src/ejb/converter/ConverterClient.java. Вы уже скомпилировали этот код вместе с кодом корпоративного компонента в разделе "Компиляция исходных файлов".

Кодирование клиентского J2EE-приложения

Исходный код ConverterClient.java проясняет основные задачи, выполняемые клиентом корпоративного компонента.

  • Локализация "домашнего" интерфейса
  • Создание экземпляра корпоративного компонента
  • Активизация бизнес-метода

Локализация "домашнего" интерфейса

Интерфейс ConverterHome определяет методы жизненного цикла, например, create. Перед тем, как ConverterClient может вызвать метод create, он должен найти и инициализировать объект, тип которого ConverterHome. Этот процесс состоит из четырех этапов:

  1. Создание начального контекста имен.
    Context initial = new InitialContext();
    Интерфейс Context – это часть JNDI (Интерфейса Имен и Каталогов Java). Контекст имен - это набор связей типа имя-объект. Имя, указанное в контексте, является JNDI-именем объекта.
    Объект InitialContext, реализующий интерфейс Context, обеспечивает стартовую точку для разрешения имен. Все операции поименования связаны с контекстом.
  2. Получение контекста имен окружения клиентского приложения.
    Context myEnv = (Context) initial.lookup("java:comp/env");
    Имя java:comp/env связано с контекстом имен окружения компоненты ConverterClient.
  3. Извлечение объекта, связанного с именем ejb/SimpleConverter.
    Object objref = myEnv.lookup("ejb/SimpleConverter&quot);
    Имя ejb/SimpleConverter связано с enterprise bean reference, являющимся логическим именем для места расположения корпоративного компонента. В этом случае имя ejb/SimpleConverter относится к объекту ConverterHome. Имена корпоративных компонентов должны принадлежать подконтексту java:com/env/ejb.
  4. Конкретизировать ссылку на объект ConverterHome.
    ConverterHome home = (ConverterHome) PortableRemoteObject.narrow(objref, ConverterHome.class);

Создание экземпляра корпоративного компонента

Для создания экземпляра компонента, клиент вызывает метод create объекта ConverterHome. Метод create возвращает объект, имеющий тип Converter. Удаленный интерфейс Converter определяет бизнес методы компонента, которые клиент может вызывать. Когда клиент вызывает метод create, EJB-контейнер инициализирует корпоративный компонент и затем активизирует метод ConverterBean.ejbCreate. Клиент вызывает метод create следующим образом:

Converter currencyConverter = home.create();

Активизация бизнес-метода

Вызвать бизнес-метод легко - нужно просто активизировать метод объекта Converter. EJB-контейнер активизирует соответствующий метод экземпляра ConverterEJB, выполняющегося на сервере. Клиент вызывает бизнес-метод dollarToYen следующим образом:

BigDecimal param = new BigDecimal("100.00");
BigDecimal amount = currencyConverter.dollarToYen
(param);

Исходный код ConverterClient

Далее приводится полный исходный код программы ConverterClient.

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import java.math.BigDecimal;

import Converter;
import ConverterHome;

public class ConverterClient {
 
public static void main(String[] args) {
   
try {
     
Context initial = new InitialContext();
      Object objref = initial.lookup
("java:comp/env/ejb/SimpleConverter");
      ConverterHome home =
(ConverterHome) PortableRemoteObject.narrow(
         
objref, ConverterHome.class);
      Converter currencyConverter = home.create
();

      BigDecimal param =
new BigDecimal("100.00");
      BigDecimal amount = currencyConverter.dollarToYen
(param);
      System.out.println
(amount);
      amount = currencyConverter.yenToEuro
(param);
      System.out.println
(amount);

      System.exit
(0);
   
} catch (Exception ex) {
     
System.err.println("Caught an unexpectedexception!");
      ex.printStackTrace
();
   
}
  }
}

Компиляция клиентского приложения

Файлы клиентского приложения компилируются одновременно с файлами корпоративного компонента, как описано в разделе "Компиляция исходных файлов".

Пакетирование клиентского J2EE приложения

Для пакетирования компоненты клиентского приложения необходимо запустить мастер New Application Client (новое клиентское приложение) утилиты deploytool. Во время этого процесса мастер выполняет следующие задачи:

  • Создает дескриптор размещения клиентского приложения
  • Помещает дескриптор размещения и клиентские файлы в JAR-файл
  • Добавляет JAR-файл в файл ConverterApp.ear приложения

Во время процесса пакетирования можно просматривать дескриптор размещения, выбрав Tools->Descriptor Viewer.

Для запуска мастера New Application Client нужно выбрать File->New->Application Client. Мастер отобразит следующие диалоговые окна:

  1. Introduction (Введение)
    1. Прочитайте поясняющий текст о возможностях мастера.
    2. Нажмите кнопку Next (Дальше).
  2. JAR File Contents (Содержимое JAR-файла)
    1. В списке выберите ConverterApp.
    2. Нажмите Edit (Редактирование)
    3. В древовидном списке Available Files (Доступные файлы) выберите каталог j2eetutorial/examples/build/ejb/converter.
    4. Выберите файл ConverterClient.class и нажмите кнопку Add (Добавить).
    5. Нажмите OK.
    6. Нажмите Next.
  3. General (Общие)
    1. В списке Main Class выберите ConverterClient.
    2. Проверьте, что поле Display Name содержит ConverterClient.
    3. В списке CallBack Handler Class выберите аутентификацию, управляемую контейнером.
    4. Нажмите кнопку Next.
    5. Нажмите кнопку Finish.

Установка ссылки корпоративного компонента клиентского приложения

При вызове метода lookup ConverterClient обращается к месту расположения корпоративного компонента:

Object objref = myEnv.lookup("ejb/SimpleConverter");

Установите эту ссылку следующим образом:

  1. В списке выберите ConverterClient.
  2. Выберите закладку EJB Refs.
  3. Нажмите кнопку Add.
  4. В колонке Coded Name введите ejb/SimpleConverter.
  5. В колонке Type выберите Session.
  6. В колонке Interfaces выберите Remote.
  7. В колонке Home Interface выберите ConverterHome.
  8. В колонке Local/Remote Interface выберите Converter.

Создание Web-клиента

Web-клиент содержится на JSP-странице j2eetutorial/examples/src/ejb/converter/index.jsp. JSP-страница представляет собой текстовый документ, содержащий статические данные, которые могут быть представлены в любом текстовом формате, например, HTML, WML, XML; а также JSP-элементы, образующие динамическую часть.

Кодирование Web-клиента

Операторы (отмеченные жирным шрифтом в нижеприведенном коде) для локализации "домашнего" интерфейса, создания экземпляра корпоративного компонента и вызова бизнес-метода практически идентичны операторам в коде клиентского J2EE-приложения. Единственное отличие - в параметре в методе lookup; объяснение использования различных имен приводится в разделе "Спецификация JNDI-имен".

Необходимые для клиента классы объявляются в директиве JSP-страницы (заключенной внутри символов <%@ %>). Поскольку поиск "домашнего" интерфейса и создание корпоративного компонента выполняется только один раз, этот код появляется в секции объявлений JSP (заключенную между символами <%! %>), которая содержит метод инициализации jspInit. За объявлением следует стандартный код HTML для создания формы с полями ввода. Скриптлет (заключенный между символами <% %>) извлекает параметр из запроса и преобразует его в тип double. И, наконец, JSP-выражения (заключенные между символами <%= %>) вызывают бизнес методы корпоративного компонента и помещают результат в поток данных, возвращаемых клиенту.

<%@ page import="Converter,ConverterHome,javax.ejb.*,
javax.naming.*, javax.rmi.PortableRemoteObject,
java.rmi.RemoteException" %>
<%!
    private Converter converter = null;
    public void jspInit() {
        try {
            InitialContext ic = new InitialContext();
            Object objRef = ic.lookup("java:comp/env/ejb/TheConverter");
            ConverterHome home = (ConverterHome)PortableRemoteObject.narrow(objRef, ConverterHome.class);
            converter = home.create();
        } catch (RemoteException ex) {
        ...
        }
    }
    ...
%>
<html>
<head>
<title>Converter</title>
</head>

<body bgcolor="white">
    <h1><center>Converter</center></h1>
    <hr>
    <p>Enter an amount to convert:</p>
    <form method="get">
        <input type="text" name="amount" size="25">
        <br>
        <input type="submit" value="Submit">
        <input type="reset" value="Reset">
    </form>
    <%
    String amount = request.getParameter("amount");
    if (amount != null && amount.length() > 0) {
        BigDecimal d = new BigDecimal(amount);
    %>
    <p>
    <%= amount %> dollars are
    <%= converter.dollarToYen(d) %> Yen.
    <p>
    <%= amount %> Yen are
    <%= converter.yenToEuro(d) %> Euro.
    <%
    }
    %>
</body>
</html>

Компиляция Web-клиента

J2EE-сервер автоматически компилирует Web-клиенты, являющиеся JSP-страницами. Если Web-клиент является сервлетом, его необходимо компилировать.

Пакетирование Web-клиента

Для пакетирования Web-клиента необходимо запустить мастер New Web Component (новый компонент Web) утилиты deploytool. Во время этого процесса мастер выполняет следующие задачи:

  • Создает дескриптор размещения Web приложения
  • Помещает файлы компонентов в WAR-файл
  • Добавляет WAR-файл в файл ConverterApp.ear приложения

Во время процесса пакетирования можно просматривать дескриптор размещения, выбрав Tools->Descriptor Viewer.

Для запуска мастера New Web Component нужно выбрать File->New->Web Component. Мастер отобразит следующие диалоговые окна:

  1. Introduction (Введение)
    1. Прочитайте поясняющий текст о возможностях мастера.
    2. Нажмите кнопку Next (Дальше).
  2. WAR File
    1. Выберите Create New WAR File In Application (Создать новый WAR-файл в приложении).
    2. В списке выберите ConverterApp.
    3. В поле WAR Display Name введите ConverterWAR.
    4. Нажмите Edit (Редактирование).
    5. В древовидном списке Available Files (Доступные файлы) выберите каталог j2eetutorial/examples/build/ejb/converter.
    6. Выберите файл index.jsp и нажмите кнопку Add (Добавить).
    7. Нажмите OK.
    8. Нажмите Next.
  3. Выберите диалоговое окно Component Type (Тип компонента)
    1. Выберите переключатель JSP.
    2. Нажмите Next.
  4. Component General Properties (Общие свойства компонента)
    1. В списке JSP Filename выберите index.jsp.
    2. Нажмите кнопку Finish.

Установка ссылки корпоративного компонента Web-клиента

При вызове метода lookup Web-клиент обращается к месту расположения корпоративного компонента:

Object objref = ic.lookup("java:comp/env/ejb/TheConverter");

Установите эту ссылку следующим образом:

  1. В древовидном списке выберите ConverterWAR.
  2. Выберите закладку EJB Refs.
  3. Нажмите кнопку Add.
  4. В колонке Coded Name введите ejb/TheConverter.
  5. В колонке Type выберите Session.
  6. В колонке Interfaces выберите Remote.
  7. В колонке Home Interface выберите ConverterHome.
  8. В колонке Local/Remote Interface выберите Converter.

Установка имен JNDI

Хотя клиентское J2EE-приложение и Web-клиент обращаются к одному и тому же корпоративному компоненту, их коды ссылаются на месторасположение компонента, используя различные имена. Клиентское J2EE-приложение использует имя ejb/SimpleConverter, а Web-клиент - ejb/TheConverter. Эти ссылки находятся в параметрах вызова lookup. Для того чтобы метод lookup вызвал "домашний" объект, необходимо отобразить ссылки в коде на JNDI-имена корпоративного компонента. Хотя такое отображение добавляет некоторую двусмысленность, оно отделяет клиентов от компонент, облегчая сборку приложения из J2EE-компонент.

Для отображения ссылок на корпоративный компонент в клиенте на JNDI-имена, выполните следующие шаги:

  1. В древовидном списке выберите ConverterApp.
  2. Выберите закладку JNDI Names.
  3. Для указания JNDI-имени для компонента, в таблице Application найдите компонент ConverterEJB и введите MyConverter в колонке JNI Name.
  4. Для отображения ссылок, в таблице References введите MyConverter в колонке JNDI Name для каждой строки.

Рисунок 1 показывает, как должна выглядеть закладка JNDI Names после выполнения вышеописанных шагов.

Рисунок 1. JNDI-имена ConverterApp

Размещение J2EE-приложения

Поскольку наше J2EE-приложение уже содержит компоненты, оно готово для размещения.

  1. Выберите приложение ConverterApp.

  2. Выберите Tools?Deploy.

  3. В диалоговом окне Introduction проверьте, что в поле Object To Deploy отображен ConverterApp, и что в поле Target Server отображен localhost.

  4. Выберите переключатель Return Client Jar.

  5. В появившемся текстовом поле введите полный путь к файлу ConverterAppClient.jar, находящийся в каталоге j2eetutorial/examples/src/ejb/converter. Файл ConverterAppClient.jar содержит классы-заглушки, разрешающие удаленный доступ к ConverterEJB.

  6. Нажмите кнопку Next.

  7. В диалоговом окне JNDI Names проверьте имена, введенные в предыдущем разделе.

  8. Нажмите кнопку Next.

  9. В диалоговом окне WAR Context Root введите converter в поле Context Root (корневое имя контекста). После запуска Web-клиента это имя станет частью URL.

  10. Нажмите кнопку Next.

  11. В диалоговом окне Review нажмите Finish.

  12. В диалоговом окне Deployment Progress нажмите кнопку OK после завершения процесса размещения.

Запуск клиента J2EE-приложения

Для запуска клиента J2EE-приложения выполните следующие шаги:

  1. В терминальном окне перейдите в каталог j2eetutorial/examples/src/ejb/converter.

  2. Проверьте наличие в этом каталоге файлов ConverterApp.ear и ConverterAppClient.jar.

  3. Установите переменную окружения APPCPATH в значение ConverterAppClient.jar.

  4. Наберите следующую команду (в одну строку):


    runclient -client ConverterApp.ear -name ConverterClient -textauth

  5. Клиентский контейнер запросит логин. Введите guest для имени пользователя и guest123 для пароля.

  6. В терминальном окне клиент отобразит следующие строчки:

    Binding name: 'java:comp/env/ejb/SimpleConverter'
    12160.00
    0.77
    Unbinding name:'java:comp/env/ejb/SimpleConverter'

Запуск Web-клиента

Для запуска Web-клиента введите в броузере нижеуказанный URL. Поменяйте <host> на имя хоста, на котором выполняется J2EE-сервер. Если броузер запущен на том же самом хосте, что и J2EE-сервер, замените <host> на localhost.

http://<host>:8000/converter

Вы должны увидеть экран, показанный на рисунке 2, после набора цифры 100 в поле ввода и нажатия кнопки Submit.


Рисунок 2. Web-клиент приложения Converter

Модификация J2EE-приложения

Поскольку J2EE SDK предназначен для экспериментов, он поддерживает итеративную разработку. Когда бы вы ни сделали изменения в J2EE-приложении, вы должны переразместить приложение.

Модификация файла класса

Для модификации файла класса в корпоративном компоненте можно изменить исходный код, перекомпилировать его и переустановить приложение. Например, предположим, что нужно изменить курс в бизнес методе dollarToYen класса ConverterBean:

  1. Отредактируйте ConverterBean.java.

  2. Перекомпилируйте ConverteBean.java набрав ant converter.

  3. В программе deploytool выберите Tools->Update Files.

  4. В появившемся диалоговом окне отобразится измененный файл. Убедитесь, что был изменен ConverterBean.class, и закройте диалоговое окно.

  5. Выберите Tools->Deploy. Убедитесь, что поле Save Object Before Deploying отмечено.

Также возможно выполнить шаги 4 и 5 путем выбора Tools->Update and Redeploy. Программа deploytool замещает старый JSP-файл в ConverterApp.ear новым и повторно размещает приложение.

Добавление файла

Для добавления файла в EJB JAR или WAR-файлы приложения выполните следующие действия:

  1. Выберите JAR или WAR.

  2. Выберите закладку General.

  3. Нажмите Edit.

  4. В списке Available Files выберите файл и нажмите кнопку Add.

  5. Нажмите кнопку OK.

  6. Из главной панели инструментов выберите Tools->Update and Redeploy.

Модификация Web-клиента

Для модификации Web-клиента выполните следующие действия:

  1. Отредактируйте index.jsp.

  2. Выполните ant converter для копирования измененного файла в каталог построения.

  3. В программе deploytool выберите Tools->Update Files.

  4. В появившемся диалоговом окне отобразится измененный файл. Убедитесь, что был изменен index.jsp, и закройте диалоговое окно.

  5. Выберите Tools->Deploy. Убедитесь, что поле Save Object Before Deploying отмечено.

Также возможно выполнить шаги 4 и 5 путем выбора Tools->Update and Redeploy. Программа deploytool замещает старый JSP-файл в ConverterApp.ear новым и повторно размещает приложение.

Модификация установок размещения

Для модификации установок размещения приложения ConverterApp необходимо отредактировать соответствующие поля в закладке и повторно разместить приложение. Например, для изменения JNDI-имени ConverterBean с ATypo на MyConverter выполните следующие операции:

  1. В программе deploytool выберите ConverterApp в списке.

  2. Выберите закладку JNDI Names.

  3. В поле JNDI Name введите MyConverter.

  4. На основной панели инструментов выберите File->Save.

  5. Выберите Tools->Update and Redeploy.

Общие проблемы и их решение

Неудачный старт J2EE-сервера

Naming and Directory Service Port Conflict (конфликт порта службы имен и каталогов)

Симптом: При старте J2EE-сервера с ключом -verbose отображаются следующие строки:

"J2EE server listen port: 1050 RuntimeException: Could not initialize server...

Решение: Порт 1050 используется другим процессом. Если J2EE-сервер запущен, его необходимо остановить, набрав j2ee -stop. Если какая-то другая программа использует порт, можно изменить номер порта по умолчанию (1050), отредактировав файл config/orb.properties инсталляции J2EE SDK.

Для подробной информации о номерах портов по умолчанию смотрите "Руководство по конфигурации" в загруженном J2EE SDK.

Web Service Port Conflict (конфликт порта Web-сервиса)

Симптом: После запуска J2EE-сервера с ключом -verbose отображаются следующие строки:

LifecycleException: HttpConnector[8000].open:
java.net.BindException: Address in use...

Решение: Порт 8000 используется другим процессом. Можно изменить номер порта по умолчанию (8000), отредактировав файл config/web.properties инсталляции J2EE SDK.

Incorrect XML Parser (некорректный парсер XML)

Симптом: После запуска J2EE-сервера с ключом -verbose отображаются следующие строки:

Exception in thread "main"
javax.xml.parsers.FactoryConfigurationError:
org.apache.xerces.jaxp.SAXParserFactoryImpl at...

Решение: Удалите файл jre/lib/jaxp.properties из инсталляции J2EE.

Ошибки компиляции

ant Cannot Locate and Build File

Симптом: После набора ant converter появляются такие сообщения:


Buildfile: build.xml does not exist!
Build failed.

Решение: Перед запуском ant перейдите в каталог j2eetutorial/examples/src. Если вы хотите запустить ant из текущего каталога, необходимо указать файл построения в командной строке. Например, в Windows вы должны набрать такую команду в одной строке:

ant -buildfile C:\j2eetutorial\examples\src\build.xml converter

The Compiler Cannot Resolve Symbols

Симптом: После набора ant converter компилятор выдает много ошибок, включая такие:


cannot resolve symbol
...
BUILD FAILED
...
Compile failed, messages should have been provided

Решение: Проверьте корректность установки переменной окружения J2EE_HOME. Смотрите раздел "Проверка переменных окружения".

ant 1.4 Will Not Compile the Example after You Run the Client

Симптом: ant 1.4 выдает такую ошибку:

The filename, directory name, or volume label syntax is incorrect.

Решение: Используйте ant версии 1.3. Версия 1.4 скрипта ant и скрипты J2EE SDK используют переменную окружения JAVACMD. Например, скрипт runclient.bat из SDK устанавливает JAVACMD в значение, вызывающее проблемы для ant.bat.

Ошибки размещения

The Incorrect XML Parser Is in Your Classpath (некорректный парсер XML находится в вашем classpath)

Симптом: Появляющаяся ошибка содержит следующий текст:


...
[]java.rmi.RemoteException:Error saving/opening

Deployment Error:Bad mapping of key{0} class{1},
not found: com.sum.enterprise.deployment.xml.ApplicationNode

Решение: Удалите файл jaxp.jar из каталога jre/lib/ext инсталляции SDK. Этот файл содержит правила разборки XML, несовместимые с J2EE-сервером. Если файла jaxp.jar нет, то ваш путь к классам, возможно, указывает на правила XML инсталляции Tomcat. В этом случае надо удалить ссылку из classpath.

The Remote Home Interface Was Specified as a Local Home Interface (удаленный "домашний" интерфейс указан как локальный)

Симптом: Выдается ошибка следующего вида:


LocalHomeImpl must be declared abstract.
It does not define javax.ejb.HomeHandle getHomeHandle()
from interface javax.ejb.EJBHome.

Решение: Удалите корпоративный компонент из EAR-файла (Edit?Delete) и создайте новый компонент в мастере New Enterprise Bean. В диалоговом окне General мастера выберите значения в списках Remote Home Interface и Remote Interface.

Ошибки времени исполнения клиента J2EE-приложения

The Client Throws a NoClassDefFoundError (клиент вызвал исключительную ситуацию NoClassDefFoundError)

Симптом: Клиент выдает следующую исключительную ситуацию:


java.lang.NoClassDefFoundError:converter.ConverterHome

Решение: Эта ошибка возникает, если клиент не может найти классы в файле ConverterAppClient.jar. Удостоверьтесь, что вы корректно выполнили шаги, описанные в разделе "Запуск клиентского J2EE-приложения".

The Client Cannot Find the ConverterApp.ear (клиент не может найти файл ConverterApp.ear)

Симптом: Клиент выдает следующую исключительную ситуацию:


IOException: ConverterApp.ear does not exist

Решение: Проверьте наличие файла ConverterApp.ear и то, что вы указываете его с ключом -client:


runclient -client ConverterApp.ear -name ConverterClient

Файл ConverterApp.ear был создан в разделе "Создание J2EE-приложения". Смотрите также раздел "Запуск клиентского J2EE-приложения".

The Client Cannot Find the ConverterClient Component (клиент не может найти компонент ConverterClient)

Симптом: Клиент выдает следующую строку:


No application client descriptors defined for: . . .

Решение: Проверьте, что компонент ConverterClient был создан и то, что вы указываете его с ключом -name в команде runclient. Компонент ConverterClient был создан в разделе "Пакетирование клиентского J2EE-приложения".

The Login Failed (неудачная регистрация)

Симптом: После вашей регистрации клиент выдает следующую строку:


Incorrect login and/or password

Решение: Во время регистрации введите guest в качестве имени пользователя и guest123 в качестве пароля.

The J2EE Application Has Not Been Deployed (J2EE-приложение не было размещено)

Симптом: Клиент выводит следующую исключительную ситуацию:


NameNotFoundException. Root exception is org.omg.CosNaming...

Решение: Разместите приложение. Для инструкций смотрите раздел "Размещение J2EE-приложения".

The JNDI Name Is Incorrect (JNDI-имя неверно)

Симптом: Клиент выводит следующую исключительную ситуацию:

NameNotFoundException. Root exception is org.omg.CosNaming. . .

Решение: Убедитесь, что на закладке JNDI Names приложения ConverterApp JNDI-имена для ConverterBean и ejb/SimpleConverter совпадают. Отредактируйте соответствующее поле JNDI Name и повторно разместите приложение.

Ошибки времени исполнения Web-клиента

The Web Context in the URL Is Incorrect (Web-контекст в URL неверен)

Симптом: Броузер отображает, что страница не найдена (HTTP 404).

Решение: Убедитесь, что Web-контекст (converter) в URL соответствует тому, что вы указали в диалоговом окне Component General Properties (смотрите раздел "Пакетирование Web-клиента"). Регистр (верхний или нижний) Web-контекста имеет значение.

The J2EE Application Has Not Been Deployed (J2EE-приложение не размещено)

Симптом: Броузер отображает, что страница не найдена (HTTP 404).

Решение: Разместите приложение.

The JNDI Name Is Incorrect (JNDI-имя неверно)

Симптом: После нажатия кнопки Submit на Web-странице броузер выдает:

A Servlet Exception Has Occurred.

Решение: На закладке JNDI Names приложения ConverterApp проверьте совпадение JNDI-имен для ConverterBean и ConverterWAR. Отредактируйте соответствующее поле JNDI Name и повторно разместите приложение.

Обнаружение проблем при помощи проверочного средства (Verifier)

Инструмент проверки (verifier) может обнаружить несовместимость в дескрипторах размещения и спецификациях метода. Эта несовместимость часто вызывает ошибки размещения или времени выполнения. Из deploytool можно запустить GUI-версию verifier, выбрав Tools?Verifier. Возможен также запуск отдельной GUI-версии или версии командной строки verifier. За информацией обращайтесь в "Приложение B".

Сравнение вашего EAR-файла с нашим

Для большинства примеров загруженное "Руководство" включает EAR-файлы J2EE-приложения, расположенные в каталоге j2eetutorial/examples/ears.

Другие ошибки

Если ни одно из этих предложений не решает проблемы, вы можете деинсталлировать и очистить репозиторий сервера при помощи запуска скрипта cleanup. Необходимо также остановить и перезапустить сервер:


j2ee -stop
cleanup
j2ee -verbose
Теги: j2ee JNDI