Книга 1 - Начальные сведения
Книга 2 - Более профессиональный подход |
Студенческий отдел кадров Пособие по 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-приложения |