Ну, поехали :).

Именно это подумал я, когда начал писать данный материал. Автору и читателям пришлось немало потрудится прежде чем мы добрались до одного из очень интересных разделов в множестве технологий Java. А именно до Application Server и Enterprise Java Beans.

 

Я очень надеялся, что смогу обойтись без установки какого-либо IDE, но увы, время не стоит на месте и не пользоваться такого рода системами уже не получается. Для такого рода приложений приходится делать очень много ручной работы, которая может быть охарактеризована таким выражением «за деревьями леса не видно».

Я постараюсь не оставлять вас в неведении по некоторым вопросам – даже полностью сгенерированный код требует понимания. Но это уж как получится.

 

Я предлагаю закачать достаточно мощный пакет – (хорошо, что он бесплатный) – IDE NetBeans 6.0. Закачать пакет можно по ссылкеNetBeans 6.0

Очень советую (и настойчиво прошу) закачивать полную версию. Да, она не маленькая – 169 Мб – но Вы не пожалеете. К тому же я все примеры буду проводить именно под такой версией.

В принципе можно закачать вариант «Web & Java EE», но все-таки цикл статей будет постоянно расти. И возможно мы дойдем до SOA(Service Oriented Architecture). Это совсем молодая технология, которая будет развиваться в ближайшие годы. И если Вы успеете понять основные принципы и ознакомитесь с основными моментами, то Ваш профессиональный рост совершит резкий скачок.

 

Установка NetBeans не должна вызвать у вас проблем, поэтому на этом моменте я не буду останавливаться. Единственное замечание по установке – БУДЬТЕ ВНИМАТЕЛЬНЫ ПРИ ЗАДАНИ ПАРАМЕТРОВ для GlassFish – я имею в виду логин/пароль. В принципе может взять парметры по умолчанию:

login – admin

password – adminadmin

GlassFish — это Application Server, который идет вместе с NetBeans и является разработкой Sun. GlassFish – вполне современныйApplication Server, который поддерживает новейшие технологии исамые последние спецификации от Sun. Так что пользуйтесь и получайте удовольствие.

 

И еще одно – мой вам совет – создайте пароль для пользователя root в MySQL – это не сложно. Надо будет запустить нижеприведенныйSQL и больше никаких забот.

 

GRANT ALL ON students.* TO ‘root’@’%’ IDENTIFIED BY ‘root’;

 

Пароль стал = root

 

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

 

А теперь мы поговорим о том, что же такое Application Server.

 

Application Server (AppServer)

 

Идея AppServer родилась уже не так уж мало лет назад. Уже более 12-15 лет назад разработчики высказывали идею, что надо иметь некий сервис, который возьмет на себя некоторые задачи – например распределение нагрузки, соединения с базами данных, причем сразу с несколькими, систему сообщений, систему аутентификации и авторизации, управление различными ресурсами. И самое главное (на мой взгляд) – возможность удобно размещать бизнес-логику. Бизнес-логика на клиенте – это очень мощные рабочие станции, которые будут требовать огромные ресурсы. С другой стороны помещать всю бизнес-логику в базу данных – не получается. Т.к. может быть использована не одна, а десятки баз данных на разных хостах. Значит нужен некий программный продукт, который позволит удобно управлять написанными приложениями.

Именно такую задачу берет на себя Appication Server. На сегодня Java является наверно самой развитой системой, под которую создажются такого рода Application Server’а.

Компания Sun создала спецификацию, которая описывает те сервисы и те правила, по которым AppServer должен работать.

 

На первое время я Вам советую воспринимать AppServer как некое хранилище классов, которые просто зарегестрированы на нем специальным образом под именами (да-да, это тот самый JNDI с которым мы сталкивались некоторое время назад). Раньше для регистрации требовалось создавать специальный XML-файл – ejb-jar.xml. Уже тогда существовали специальные средства для автоматизации этого процесса. Для новой спецификации все стало еще проще. В чем Вы скоро убедитесь.

Клиентское приложение спрашивает у AppServer’а класс по имени, получает его (если он конечно есть) и использует.

И выполняется этот класс под управлением AppServer’а. Именно AppServer берет на себя задачу запуска класса в отдельном треде, берет на себя задачу поставки всевозможных ресурсов – коннекты к базе данных, вызовы Web-Services и многое другое. Клиент получает ссылку на интерфейс, за которым прячется настоящий класс. И эту ссылку клиент получает у ApplicationServer’а.

 

Возможно мы еще вернемся к обсуждениею возможностей AppServer’ов, но здесь слов пока достаточно.

 

Настало время поговорить немного о приложениях, которые выполняются под управлением AppServer’а. А именно об Enterprise JavaBeans – EJB.

 

 

Enterprise Java Beans (EJB)

 

Мы будем работать с EJB 3.0. Спецификация для EJB 3.0 стала более зрелой и более удобной для работы. Если Вам захочется ознакомиться с более старыми спецификациями, то заходите на сайты в Интернете и ищите информацию. Но это уже выходит за рамки данного цикла статей.

Сам по себе бин не представляет из себя каких-либо сложностей – это просто класс, который зарегестрирован на AppServer’е и обладает определенным набором характеристик.

Существует три вида бинов:

  1. Entity Bean – раньше именно они отвечали за сохранение данных в базе данных. Но сегодня они не смогли доказать свою необходимость. Их заменили на более удобные варианты. Название в общем-то еще осталось, но оно показывает уже на классы. которые являются «отображением» данных из таблицы в поля класса. Это очень напоминает Hibernate по своей идеологии (для тех, кто знаком с Hibernate)
  2. Session Bean – это классы, которые выполняют логику. Они очень важны и нужны.
  3. Message-Driven Bean – эти бины вызываются тогда, когда приходит какое-либо сообщение. О них мы пока говорит не будем. Может быть в будущем.

 

Application Server также включает в себя интерфейс, который реализует бин. И именно интерфейс будет представлен клиенту. А сам бин будет спрятан в недрах сервера.

Что еще важно понять, так это способы вызова бинов. Ведь по сути они все тихо и мирно лежат в границах AppServer’а, который их и вызывает по заданию от клиентов. В самой первой спецификации было принято решение, что каждый клиент является отдельной Java-машиной. Но такой вызов очень «дорогой». Он требует некоего механизма, который позволит передавать данные из одной JAVA-машины в другую. Очень ресурсоемкое решение. Поэтому было принято решение, что надо создать два типа вызовов – локальный и удаленный (Local и Remote).

Локальный вызов происходит тогда, когда клиент тоже является по сути бином на том же AppServer’е. Удаленный – как и раньше, это другая Java-машина.

 

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

 

 

Разработка Enterprise приложения

 

Мы с вами начнем фактически с нуля. Да-да. Вы можете забыть про свой замечательный код и оставить только базу данных MySQL, которая нам понадобится.

Возможно у нас получится использовать JSP и кое-какую логику из наших сервлетов. Все остальное изменится достаточно сильно.

 

На сегодня в какой-то степени некоторое понятие Enterprise-приложения сложилось. Конечно, содержимое таблиц да и сами таблицы, бизнес-логика – дело сугубо личное. Но есть несколько моментов, которые являются общими. Их мы и рассмотрим. А чуть позже и увидми в нашем «Отделе кадров».

 

Основными составляющими Enterprise-приложения являются:

  1. База данных – БД. Обычно это какой-нибудь SQL сервер типа Oracle, MS SQL, Sybsae DB2. Она содержит таблицы, индексы к ним, какие-то параметры ссылочной целостности. Попадаются триггеры. Также возможно присутствуют некоторые представления (view) и даже сохраненные процедуры (stored procedure). Но бизнес-логики в базах данных уже практически нет. Я до сих пор сталкиваюсь с приложениями, в которых бизнес-логика упрятана в stored procedure. Но все таки это не задача базы данных – ее задача хранить данные и следить за их целостностью. А всякие процессы, которые требуют каких-либо долгих и сложных изменений данных выносятся из БД. Особенно это актуально тогда, когда база данных уже не одна – их много.
  2. Сервер приложений – Application Server (AppServer). Вот где прячется бизнес-логика. Как я уже упоминал, AppServerпредоставляет большое число всяких сервисов, с помощью которых приложения, выполняемые под его управлением (а проще EJB), могут забыть о всяких дополнительных проблемах типа транзакций, отправки сообщений и прочая. Мало того, сейчас уже есть SOAи BPEL (Business Process Execution Language), которые берут на себя реализацию логики работы и программисту уже не надо думать в каком порядке и что вызывать. Об этом должен думать бизнес-аналитик, которому предполагается дать инструментарий для удобного рисования бизнесс-процессов. Потом этот «рисунок» транслируется в BPEL. Потом абстрактные задачи заменяются реальными вызовами Web-сервисов (или тех же EJB –например IBM реализовала такой вариант). Вот на реализации этих Web-сервисов и будет теперь работать программист. Во всяком случае так предполагается в будущем. Кажется, что все классно, но как обычно теория с практикой расходятся. Во всяком случае пока реализация не очень хорошо выглядит, но это дело времени.
  3. Web Server. В подавляющем большинстве случаев он обычно совмещен с AppServer’ом. Про него в общем-то говорить особо нечего –Web Server он и в Африке Web Server. Т.к. Web Server и AppServer выполняются под управлением одной JVM, то все сервлеты, которые управляются Web Server обращаются к EJB на AppServer’е через локальные интерфейсы.
  4. Клиентское приложение. Все чаще и чаще это обычный броузер – Firefox, IE или Opera. Но все-таки клиентские приложения все еще встречаются. Обычно по причине того, что возможности интерфейса в них более богатые. Они-то как раз вынуждены обращаться к EJB удаленно, т.е. через удаленные (Remote) интерфейсы. Но как я уже только что говорил это встречается все реже и реже. В связи с тем, что существует уже немало библиотек под JavaScript, которые позволяют использовать технологию AJAX, то уровеньGUI приложений «под броузер» растет просто с катастрофической скоростью.

 

В данной части мы не будем создавать приложение целиком. Во-первых – слишком много материала. А во-вторых – у меня есть тайное желание, чтобы Вы сами попробовали что-то сделать. Возможно, что к тому времени как будет написана часть где мы сделаем наше приложение более-менее рабочим, Вы сами уже его напишете. Мне будет очень приятно об этом услышать.

 

EJB-часть

 

Ну, давайте запустим NetBeans.

Если Вы сделали это первый раз, то перед Вами появится замечательная картинка.

Не будем долго обсуждать достоинства и недостатки NetBeans. Возьмем быка за рога.

 

1. Выбираем пункт меню File->New Project…

В появившемся диалоговом окне в дереве Categories выбираем Enterprise. В появившемся списке Projects Выбираем первый пункт –Enterprise Application. Жмем кнопку Next

2. Вводим имя проекта StudentsApp и жмем кнопку Finish.

Обратите внимание на путь до проекта и отмеченные пункты “Create EJB Module” и “Create Web Application Module”.

Как Вы возможно уже догадались это те самые части, о которых я упоминал выше – Application Server и Web Server.

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

Уже хорошо видно, что наше Enterprise-приложение включает в себя два модуля – EJB и WEB. Я очень советую привыкать думать о них постоянно
Поехали дальше. Теперь мы создадим два класса (Entity) которые будут являться «отражением» наших таблиц – groups и students. Для этого щелкните правой кнопкой мыши на проекту StudentsApp-ejb, выбирайте New->Entity Classes from Database. У вас откроется диалоговое окно в котором надо будет выбрать DataSource. Нужного нам DataSource конечно же пока нет, поэтому выбираем пункт NewData Source (см. на рисунок)

В этом случае нам опять предложат диалоговое окно, где нужных нам параметров опять же нет и опять же нам надо выбрать NewDatabase Connection.

И снова NetBeans помогает нам показывая очередное окошко. Здесь мы установим уже нужные нам параметры для соединения.

ВНИМАНИЕ !!! Установите флаг на чекбоксе “Remember password” – иначе подсоединение не получится.

Если Вы не ошиблись с набором, то должно быть выдано вот такое окно (вернее это тоже самое окно, просто следующая закладка)

Нажмем OK, попадем в окошко создания Data Source, где будут указаны параметры для нашего источника данных. Снова жмем OK.

Если Вы не допустили ошибок, то перед Вами дожно появиться вот такое вот окошко

Переносим обе таблицы направо и жмем Next.

Теперь перед Вами вот такая вот информация. Обратите внимание – я не снял галочку в чекбоксе “Generate Named Query Annotation for Persistent Fields”.

Нам такого рода запросы не потребуются (во всяком случае пока), но от нас не убудет J

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

Не советую также менять название классов – проблема в том, что слово Group имеет важное значение и использовать его не рекомендуется. Поэтому оставляем во множественном числе. Кстати это напоминание нам (уже в который раз) не использовать «подозрительные» слова для имен. «Подозрительные» — это значит. что они могут быть использованы как keywords в каком-нибудь языке. В общем, используйте префиксы господа

Жмем кнопку Finish и видим, что у нас появилось два класса – Groups и Students. Я не буду приводить их код. Во-первых не хочется загромождать текст статьи, а во-вторых – да в общем-то нам он пока мало интересен. Он сгенерировался и пока этого достаточно.

Также я обратил бы Ваше внимание на файл sun-resources.xml (поищите его в дереве) – там вы увидите наши замечательные параметры. Если внимательно посмотреть, то мы увидим и URL для соединения, и логин и пароль.

Но это еще не все, что нам необходимо для работы с базой данных. В EJB 3.0 появилось такое понятие как Persistence Unit. По сути это XML файл, который описывает параметры для подсоединения к базе данных. После того, как мы его создадим поговорим и о нем.

Итак, опять нажимаем правую кнопку мыши на StudentsApp-ejb, выбираем New->Other (скорее всего у Вас не будет пункта PersistenceUnit, но если он есть – выбирайте его сразу). В появившемся окошке выбираем Persistence и Persistence Unit. Жмем Next.

В следующем окне визарда мы увидим картинку, которая представлена ниже. Обратите внимание на установленные параметры. Во-первых это Data Source. Он выбирается из списка и равен тому, который мы создали ранее. Во-вторых группа “Table Generation Strategy” установлена в None. Таблицы у нас уже есть, так что нам не требуется их создавать заново.

Для тех, кто уже знает, что такое Hibernate – он тоже есть в списке Persistence Provider. Но о нем в другой раз. Пока возьмем вариант по умолчанию – TopLink.

Сразу после создания Вы можете посмотреть на файл, который создался – посмотрите, поищите знакомые черты.

 

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

  1. Создали файлы, в которых хранится информация для подключения к базе данных. Что очень важно. Теперь эта информация будет использоваться AppServer’ом для работы с базой. И нам об этом больше волноваться не надо.
  2. Создали два класса, задача которых – хранить данные из таблицы. Т.е. каждая строка из таблицы groups будет пердставлена объектом класса Groups к которому мы можем обращаться по полям. Помните нашу работу по созданию set/get методов ? Теперь это все сдалалось автоматически. И хотя это заслуга NetBeans, а не EJB, все равно приятно.

 

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

Правда теперь это будет не просто класс, а класс SessionBean, который будет работать под управлением AppServer’а. И пользоваться всеми благами этого.

 

Опять первая кнопка на StudentsApp-ejb, выбираем New->Session Bean…

Снова перед нами диалоговое окно, в котором мы наберем имя класса ManagementSystem. По умолчанию нам будет предложено выбрать только Local-интерфейс. Предлагаю пока оставить как есть – может у нас хватит пороху добраться до создания отдельного удаленногоJava-клиента, но тогда нам никто не помешает его создать.

Мы получим сразу два файла:

  1. Непосредственно Session Bean – ManagementSystemBean.java, который реализует (будет реализовывать нашу логику)
  2. Локальный интерфейс ManagementSystemLocal.java

 

Давайте теперь создадим один метод – getStudents. Он будет возвращать нам одного студента по его ID.

если у Вас не открыт в редакторе файл ManagementSystemBean.java – откройте.

Теперь щелкаем правой кнопкой где-нибудь на поле редактора и выбираем пункт EJB Methods->Add Business Method.

Появиться очередное диалоговое окно, в котором мы введем имя метода, тип возвращаемого значения и добавим входной параметр (Используйте кнопку Add справа). Введите имя и тип нашего параметра.

Если Вы откроете в редакторе оба файла — ManagementSystemBean.java и ManagementSystemLocal.java, то увидите, что там есть ошибка. Нам укажут, что необходимо сделать импорт класса Students. Самым простым решением будет кликнуть левой кнопкой на символ ошибки в самом левом столбце редактора и выбрать пункт “add import for students.entity.Students”.

Но пока кода для обращения к базе данных у нас нет. Так как же мы будем получать нашего хорошего студента ? Оказывается это тоже очень несложно.

Щелкаем правой кнопкой мыши в редакторе ManagementSystemBean.java и выбираем пункт Persistence->Use Entity Manager.

 

И вот теперь я представлю код нашего класса ManagementSystemBean.java

Я убрал комментарии, а все остальное оставил. Единственное, что я еще сделал – изменил метод getStudents.

Здесь Вы можете видеть в действии нововведение от Java .1.5 – аннотации. Аннотации предназначены для облегчения «чтения» кода. Я взял слово «чтения» в кавычки потому, что оно подразумевает, что не только человек будет читать код, но и компилятор читает, и даже JVM это делает в момент исполнения.

 

Аннотация @PersistenceContext по сути создает контекст в рамках которого может быть произведена работа с базой данных. Sunпостарался как можно дальше «отодвинуть» разработчиков от писанины кода и заменил всевозможные вызовы для подключения на такую вот простую форму.

Класс EntityManager – это интерфейс (если Вы посмотрите в JEE API). Как мы уже знаем интерфейс не может ничего делать. А значит за ним кроется настоящий класс. Который умеет работать с базой данных.

Значит наша аннотация делает достаточно много вещей: она создает и инициализирует объект определенного класса (причем этот объект создается путем обращения к AppServer’у), который реализует интерфейс EntityManager. Если вы внимательно посмотрите файлpersistence.xml (смотрите вариант не кода XML, а Design), то увидите пункт Persistence Provider – то реализация интерфейса. По умолчанию используется TopLink.

 

В общем-то основные шаги для того, чтобы запустить наше приложение на AppServer’у мы сделали. Осталось только добавить WEB-интерфейс в виде простого сервлета – так кто нам мешает ?

WEB-часть

 

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

 

Откройте проект StudentsApp-war и найдите там файл index.jsp. Мы внесем в него немного изменений.

Теперь он будет выглядеть вот так:

 

<%@page contentType=»text/html» pageEncoding=»UTF-8″%>

<!DOCTYPE HTML PUBLIC «-//W3C//DTD HTML 4.01 Transitional//EN»

«http://www.w3.org/TR/html4/loose.dtd»>

 

<html>

<head>

<meta http-equiv=»Content-Type» content=»text/html; charset=UTF-8″>

<title>JSP Page</title>

</head>

<body>

<h2>Hello World!</h2>

<form action=»MyServlet»>

<input name=»studentId» type=»text»/>

<input type=»submit» value=”Show”/>

</form>

</body>

</html>

 

Обратите внимание, что мы будем вызвать наш сервлет по URL /MyServlet

Теперь надо создать наш сервелт. Кликнем правой кнопкой на проекте StudentsApp-war и выберите New->Servlet

Заполните поля как показано на рисунке и нажмите Next

Убедитесь, что Ваш следующий экран похож на следующий рисунок и нажмите Finish

Теперь нам надо добавить в наш сервлет получение данных о студенте по данному параметру. Мы не будем делать какие-либо проверки – это конечно не хорошо, но мы же пока просто пробуем. В итоге наш сервлет будет таким

Вам необходимо обратить внимание всего на несколько строк:

  1. @EJB – мы опять столкнулись с аннотацией. Эта аннотация фактически говорит, что данный член класса является EJB и должен быть вызыван с использованием технологии EJB. И теперь не надо делать кучу вызовов, которые были раньше необходимы. Если Вас интересует все-таки такой способ – обратитесь к документации. Кроме всего прочего обратите внимание на то, что я не описывал реальный класс – я описал интерфейс. Таким образом аннотация взяла на себя процесс создания реального класса, т.е. был сделан запрос к AppServer’у, который создал у себя реальный класс ManagementSystemBean и по сути сервлет работает именно с реальным объектом реального класса, но воспринимает его как интерфейс, что в общем-то и хотелось сделать.
  2. Вызов метода getStudents – просто обратите внимание, что он есть

 

 

Чтобы Вам было немного интереснее, я приведу Вам пример кода вызова бина более старой спецификации

Ну как ощущения ?

Причем я Вам показал локальный вызов – при удаленном пришлось бы еще указывать для InitialContaxt дополнительные параметры. Вторая строка создает ссылку на так называемый Home-интерфейс – этот объект отвечал за создание реального объекта. И его тоже надо было делать. Третья строка приводила тип и только четвертая создавала нужный нам объект.

И такое надо было делать при каждом вызове объекта на стороне ApplicationServer’а. Занятие мало интересное. И как Вы прекрасно видите вполне автоматизируемое. Что и было сделано в новой спецификации.

 

 

Теперь мы должны собрать наш проект и запустить. Для этого выполняем пункты меню:

  1. build -> Build Main Project (F11)
  2. Run -> Run Main Project (F6)

 

По идее у вас должно получится вот такой экран в броузере

Теперь введите корректный ID для студента (это на Вашу ответственность) и … вуаля. Ну такой вот у меня не очень удачный студент с именем и фамилией [d,s]

Ну вот мы прошли самый простой путь создания настоящего Enterprise приложения. В следующей части мы с вами упрочим наши знания. Хотя как я уже говорил выше, Вы можете попробовать уже сами сделать все необходимое.

Но все-таки давайте немного углубимся в некоторые детали — Часть 12 — AppServer и EJB — копаем вглубь

11 comments to Application Server и Enterprise Java Beans

  • Sergey  says:

    После создания объекта Students в сервлете вывод не пишется. Не могу получить данные из этого объекта, а также не пишется вывод, следующий за созданием. В общем не работаетт эта часть:
    Students d = ms.getStudents(Integer.parseInt(request.getParameter(«studentId»)));
    out.println(«»);
    out.println(«»);
    out.println(«Servlet MyServlet»);
    out.println(«»);
    out.println(«»);
    out.println(«Student:[«+d.getFirstName()+»,»+d.getSurName()+»]»);
    out.println(«»);
    out.println(«»);

    Если же out.println() присутствует до создания, то он пишется, а после пусто.
    В чем может быть проблема? Прошу помочь, т.к. который день не могу ее решить.
    Заранее спасибо!

    • admin  says:

      Я постараюсь на выходных глянуть — статья писалась уже достаточно давно и кое-что уже не работает.

    • admin  says:

      Лучше прислать на почту course@java-course.ru код целиком (архив всей папки) — по одному куску вряд ли что конкретное можно сказать.

  • Anna  says:

    У меня тоже здесь проблема
    ——-
    Students d = ms.getStudents(Integer.parseInt(request.getParameter(“studentId”)));
    ——-
    в дебагере смотрю — пишет что ms=null;

    как решить проблему, не подскажете?

    • admin  says:

      Я писал эту статью очень давно и вероятность ее работы в нынешнее время под вопросом. Может смогу посмотреть и как-то подправить пример. Но сейчас что-то конкретное ответить вряд ли смогу. Тем более, что под дебагером никогда его не запускал. Если null, значит не создался. По каким причинам — надо смотреть.

      • Anna  says:

        А на каком этапе создается ms? В коде нет его явной инициализации, на каком этапе это происходит?
        В какую сторону мне копать, не подскажете?

    • alcert  says:

      у меня так же был ms=null.
      Опишу ситуацию:
      EE проект создавал в Netbeans 8.0.
      В проекте было два модуля: 1. ejb 2. war.
      При попытке запустить проект , получал ошибку. Потом (зачем-то) сделал главным проектом (можно выбрать опцию нажав прав.кнопкой по проекту) модуль WAR и запустил его.
      В этом случае как раз я и получил ms=null.
      Чтобы решить проблему (при запуске проекта), начал после каждого изменения пробовать запускать проект до появления ошибки. Выяснилось, что ошибка появилась при добавлении сессионного бина, где @PersistenceContext (и ниже). Судя по логам сервера , не был найден класс для подключения к MySQL. Проблема решилась добавив библиотеку JDBC MySQL в модуль WAR. Добавить можно нажав правой кнопкой по «Библиотеки» и выбрать «Добавить библиотеку».

  • AlexanderS  says:

    Здравствуйте. При запуске приложения возникла следующая ошибка:
    GlassFish Server, deploy, Connection refused: connect, false
    C:\Users\Алекс\Documents\NetBeansProjects\studentsApp\nbproject\build-impl.xml:307: The module has not been deployed.
    See the server log for details.
    BUILD FAILED (total time: 7 seconds)

    Строка 307 в файле build-impl.xml выгладит так:
    nbdeploy clientModuleUri=»${client.module.uri}» clientUrlPart=»${client.urlPart}» debugmode=»false» forceRedeploy=»${forceRedeploy}»
    В чём здесь может быть проблема?

    • admin  says:

      Написано, чтобы «See the server log for details.» — я писал статьи давно, еще под NetBEans 6. С тех пор многое поменялось и что именно случилось сразу сказать не могу. Возможно получится обновить статьи — тогда будет проще.

  • alcert  says:

    хотя потом была ещё одна проблема, устранить которую помог вышеописанный способ: “mysql-connector-java-*-bin.jar” скопировать в “glassfish-4.0\glassfish\lib\” и перезапустить GF.

    • alcert  says:

      Ответ был предназначен Anna. Ошибся при отправке

Leave a reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.