О сайте Начало Java Студенческий отдел кадров Статьи Курсы по Java Вопросы/Ответы
Часть 12 - Application Server & Enterprise Java Beans - копаем вглубь

Студенческий отдел кадров

Пособие по JAVA-технологиям

(с) AntonSaburov

 

Копаем вглубь

 

Когда я закончил первую часть, посвященную EJB, то понял, что чудо, которое Вы наблюдали, могло завести в тупик. Я и сам такое не очень люблю. Чтобы там всякого не генерилось – надо понимать, что это и где. Потому что искать ошибки придется все равно. И искать их надо осознанно. А для сознательного поиска надо понимать что и где искать. И исправлять что-то надо будет.

 

Поэтому здесь мы постараемся более глубоко покопаться в недрах GlassFish и EJB – чтобы просто чудесные первращения стали более понятны и прозрачны для Вашего понимания.

 

 

Application Server, Connection Pool и DataSource

 

Давайте начнем с того, что покопаемся в том, как наши усилия по созданию коннекта к базе данных отразились на состоянии сервера GlassFish.

Откройте среду NetBeans и выберите пунтк меню – Windows->Services. Перед Вам откроется окошко, где перечислены ресурсы, которые зарегестрированы в NetBeans. Я специально вырезал нужную часть и открыл все нужные нам ветки в дереве. Посмотрите на него внимательно.

 

 

Во-первых под узлом Databases Вы можете наблюдать коннект к базе, который мы с Вами создавали – а именно jdbc:mysql://localhost:3306/students.

Этот пункт конечно занимательный. Но еще более занимательным выглядит ветка – GlassFish V2->Resources.

Здесь мы наблюдаем две части:

1.    JDBC->Connection Pools.

   Посмотрите внимательно и Вы увидите, что у нас есть пул коннектов mysqlPool. Он создался автоматически тогда, когда мы создавали коннект к базе. Application Server использует пулы коннектов – т.е. некоторый массив (коллекцию) уже готовых к употребелению коннектов к базе данных. Как Вы скорее всего уже знаете, подсоединение к базе достаточно долгий процесс и поэтому используется технология пулов – т.е. заранее создаются несколько коннектов к базе, которые по мере надобности используются. Как только потребовался коннект к базе пул мгновенно выдает требуемое.

2.    JDBC->JDBC Resources

   Здесь мы видим тот DataSource, имя которому мы давали сами – jdbc/Students. Кликните на нем правой кнокпой мыши и выберите пункт Properties. Перед Вами откроется окно, в котором Вы сможете увидеть, что данный DataSource использует пул коннектов mysqlPool.

 

Надеюсь, что Вам стало несколко веселее и более понятно. Еще более приятно то, что на самом деле все эти пулы коннектов и сами коннекты Вы можете создавать сами с помощью административной консоли для сервера. Запустите наше приложение (или используйте правую кнопку мыши на GlassFish – там вы увидите пункт Start – если сервер не запущен). А чуть ниже в выпавшем меню Вы увидите пункт “View Admin Console”. Если сервер запущен и мы выбираем этот пункт, то перед Вами откроется броузер, в котором надо будет ввести логин и пароль, которые в моем случае я предалагал оставить по умолчанию – admin/adminadmin.

 

 

И вот перед нами пульт управления нашим Application Server’ом.

 

 

Побродите по этоим экранам – там можно найти много интересного. На рисунке я специально открыл и наше приложение – StudetnsApp. И список коннектов и пулов.

Если Вы любите копать еще глубже, то зайдите в директорию с установленным GkassFish. По умолчанию он уставнолен в директории

C:\Program Files\glassfish-v2\

 

Зайдите еще ниже – вот сюда – domains\domain1\. Здесь лежит интеерсный файл config\domain.xml

Поищите там строку Studetns.

Вы найдете приложение "StudentsApp" в очень любопытном месте

      <applications>

            <j2ee-application ... name="StudentsApp">

 

Посмотрите в этой  строке куда указывает полный путь до приложения. У меня например сюда:

C:\Documents and Settings\ASaburov\My Documents\NetBeansProjects\StudentsApp\dist\gfdeploy

 

Зайдем ? Мне было очень любопытно – что там знакомого можно найти.

А там мы найдем два каталога с прилоежниями для EJB и для WEB. Не знаю как на счет EJB, но WEB по своей структуре Вам должен быть очень знаком.

 

Вернемся к файлу domain.xml

Чуть ниже предыдущей строки найдем такое

    <jdbc-resource enabled="true" jndi-name="jdbc/Students" object-type="user" pool-name="mysqlPool"/>

 

Да вот же он родимый DataSource.

 

А еще ниже

 

    <jdbc-connection-pool …>

      <property name="databaseName" value="students"/>

      <property name="serverName" value="localhost"/>

      <property name="User" value="root"/>

      <property name="Password" value="root"/>

      <property name="URL" value="jdbc:mysql://localhost:3306/students"/>

      <property name="portNumber" value="3306"/>

      <property name="driverClass" value="com.mysql.jdbc.Driver"/>

    </jdbc-connection-pool>

 

Вот они где все спрятались. Это те самые конфигурационные файлы, в которых все хранится – наш пулы, коннекты, приложения.

 

Также я Вам советую посмотреть в директорию generated\xml\j2ee-apps\StudentsApp

 

И там, о чудо, найдется файл web.xml (чуть глубже по директориям). И ejx-jar.xml – это файл описания нашего бина.

 

Давайте посмотрим на него чуть ближе

 

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" metadata-complete="true" version="3.0" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd">

  <enterprise-beans>

    <session>

      <display-name>ManagementSystemBean</display-name>

      <ejb-name>ManagementSystemBean</ejb-name>

      <business-local>students.logic.ManagementSystemLocal</business-local>

      <ejb-class>students.logic.ManagementSystemBean</ejb-class>

      <session-type>Stateless</session-type>

      <transaction-type>Container</transaction-type>

      <persistence-context-ref>

        <persistence-context-ref-name>students.logic.ManagementSystemBean/em</persistence-context-ref-name>

        <persistence-context-type>Transaction</persistence-context-type>

        <injection-target>

          <injection-target-class>students.logic.ManagementSystemBean</injection-target-class>

          <injection-target-name>em</injection-target-name>

        </injection-target>

      </persistence-context-ref>

      <security-identity>

        <use-caller-identity/>

      </security-identity>

    </session>

  </enterprise-beans>

</ejb-jar>

 

Посмотрите, как интересно – здесь сгенерилось именно та информация, которая раньше набиралась вручную. Разве что часть <persistence-context-ref> в новинку. А все остальное – это тот самый ejb-jar.xml, о котором я упоминал в предыдущей части.

Давайте немного подробнее рассмотрим некоторые параметры.

 

<ejb-name> - это имя нашего бина, но не имя класса, а имя, по которому клиент будет искать его на AppServer’е.

По умолчанию имя совпадает с именем класса интерфейса. Но Вы можете сделать сове имя. Для этого достаточно рядом с аннотацией @Stateless написать параметр name. Вот так:

 

@Stateless (name="ManagementSystem")

public class ManagementSystemBean implements ManagementSystemLocal

{

....

}

 

И теперь нам надо будет указать в сервлете, что ищем мы бин по такому вот имени. А значит в классе MyServlet.java будет вот такая строка

 

public class MyServlet extends HttpServlet

{

    @EJB(name="ManagementSystem")

    private ManagementSystemLocal ms;

...

}

 

Если Вы остановите свое приложение, пересоберете и перезапустите с такими параметрами, то новый ejb-jar.xml будет содержать новое имя бина – ManagementSystem.

 

Посмотрите на таги <business-local> и <ejb-class>. Надо ли тут много объяснять ? Это же наш интерфейс, по которому будет обращаться клиент. А второй тэг указывает на реальный класс.

 

Я не знаю, как Вы относитесь к таким «похождениям» - но я лично люблю покопаться.

 

Это дает ощущение понимая того, как построена система изнутри. Что от нее можно ожидать. И как можно влиять на нее.

 

И теперь мы перейдем к заключительной части нашего знакомства с технологией EJB - Часть 13 - «Студенческий отдел кадров» в виде Enterprise-приложения