11. Версія 6 — Інтеграція веб-шару в тришарову архітектуру JSF / EJB
11.1. Архітектура додатка
Архітектура попереднього веб-додатку була такою:
![]() |
Ми замінюємо імітований рівень [métier] на рівні [métier, DAO, jpa], реалізовані за допомогою EJB у розділі 7.1:
![]() |
11.2. Проєкт NetBeans для веб-шару
Проєкт NetBeans для веб-версії № 2 створюється шляхом копіювання попереднього проєкту:
![]() |
- [1]: скопіюйте новий проєкт і вставте його у вкладку [Projects],
- [2]: присвоюємо йому ім’я та вказуємо папку,
- [3]: проект створено,
Новий проєкт має таку саму назву, як і попередній. Змінюємо її:
![]() |
- [4]: ми перейменовуємо проект,
- [5]: змінюємо його назву, а також назву artifactID.
Нам потрібно внести лише кілька змін, щоб адаптувати цей веб-шар до нового середовища: імітований шар [metier] слід замінити на шар [metier, DAO, jpa] із сервера, побудованого в розділі 7.1. Для цього ми робимо дві речі:
- видаляємо пакети [exception, metier, jpa], які були присутні в попередньому проєкті.
- щоб компенсувати це видалення, додаємо до залежностей веб-проєкту проєкт сервера EJB, створений у розділі 7.1.
![]() |
- у [1] додаємо залежність від проекту,
- у [2] вибираємо проект Maven шару [métier]. У [3] вказуємо його тип, а в [4] — його область дії. Останній має значення provided, що вказує на те, що цей модуль (provided) буде наданий веб-модулю його робочим середовищем. Незабаром ми побачимо, що він буде наданий йому корпоративним додатком,
- у [5] було додано залежність.
Отже, файл [pom.xml] має такий вигляд:
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>mv-pam-ejb-metier-dao-eclipselink</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
<type>ejb</type>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
Тепер ми можемо видалити пакети з рівня [métier], які більше не потрібні:
![]() |
Також потрібно змінити код біна [Form.java]:
public class Form {
public Form() {
}
// бізнес-шар
private IMetierLocal metier=new Metier();
// поля форми
...
У рядку 7 створювався екземпляр імітованого шару [métier]. Тепер він повинен посилатися на реальний шар [métier]. Попередній код виглядає так:
public class Form {
public Form() {
}
// бізнес-шар
@EJB
private IMetierLocal metier;
// поля форми
У рядку 7 анотація @EJB вказує контейнеру сервлетів, який буде виконувати веб-шар, ввести в поле metier шару 8 EJB, який реалізує локальний інтерфейс IMetierLocal.
Чому саме локальний інтерфейс IMetierLocal, а не інтерфейс IMetierRemote? Тому що веб-шар і шар EJB виконуються в одному й тому ж JVM:
![]() |
Класи контейнера сервлетів можуть безпосередньо посилатися на класи EJB контейнера EJB.
Ось і все. Наш веб-шар готовий. Перетворення пройшло просто, оскільки ми подбали про те, щоб імітувати шар [métier] за допомогою класу, який дотримувався інтерфейсу IMetierLocal, реалізованого реальним шаром [métier].
11.3. Проєкт NetBeans для корпоративного додатка
Корпоративний додаток дозволяє одночасно розгортати на сервері додатків шари [web] та EJB одного додатка, відповідно, у контейнері сервлетів та у контейнері EJB.
Ми діємо наступним чином:
![]() |
- у [1] створюємо новий проєкт
- у [2] вибираємо категорію [Maven]
- у [3] вибираємо тип [Enterprise Application]
- у [4] надаємо назву проєкту
![]() |
- у [5] ми обираємо Java EE 6
- в [6], корпоративний проект може містити до двох типів модулів:
- модуль EJB
- веб-модуль
Одночасно зі створенням корпоративного проєкту можна замовити створення цих двох модулів, які спочатку будуть порожніми. Корпоративний проєкт служить лише для розгортання модулів, що входять до його складу. Поза цим він є порожньою оболонкою. У даному випадку ми хочемо розгорнути:
- існуючий веб-модуль [mv-pam-jsf2-alone]. Тому немає сенсу створювати новий веб-модуль.
- існуючий модуль EJB, який є частиною [mv-pam-ejb-metier-dao-eclipselink]. У цьому випадку також немає потреби створювати новий.
У [6] ми створюємо корпоративний проєкт без модулів. Пізніше ми додамо до нього веб-модулі та EJB.
- У [7] створено два проекти Maven. Корпоративний проект — це той, що має суфікс ear. Інший проект є батьківським для попереднього. Ми ним займатися не будемо.
Додаємо веб-модуль та модуль EJB до корпоративного проєкту:
![]() |
- у [1] додаємо нову залежність,
- у [2] додаємо проект EJB [mv-pam-ejb-metier-dao-eclipselink]. Звернемо увагу на його тип ejb,
- у [3] — додано веб-проект [mv-pam-jsf2-ejb]. Зверніть увагу на його тип war.
Файл [pom.xml] має такий вигляд:
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>mv-pam-ejb-metier-dao-eclipselink</artifactId>
<version>${project.version}</version>
<type>ejb</type>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>mv-pam-jsf2-ejb</artifactId>
<version>${project.version}</version>
<type>war</type>
</dependency>
</dependencies>
Перед розгортанням корпоративного додатка [mv-pam-webapp-ear] слід переконатися, що база даних MySQL [dbpam_eclipselink] існує та заповнена. Після цього можна розгорнути корпоративний додаток [mv-pam-webapp-ear]:
![]() |
- у [1] корпоративний додаток розгорнуто
- у [2], корпоративний додаток [mv-pam-webapp-ear] успішно розгорнуто.
У браузері відкривається така сторінка:
![]() |
- у [1], замість запитуваного URL
- в [2], список співробітників було заповнено елементами з таблиці [Employes] бази даних dbpam.
Читачеві пропонується повторити тести веб-версії № 1. Ось приклад виконання:












