11. Wersja 6 – Integracja warstwy internetowej z architekturą trójwarstwową JSF / EJB
11.1. Architektura aplikacji
Architektura poprzedniej aplikacji internetowej wyglądała następująco:
![]() |
Zastępujemy symulowaną warstwę [métier] warstwami [métier, DAO, jpa] zaimplementowanymi przez EJB w punkcie 7.1:
![]() |
11.2. Projekt NetBeans warstwy internetowej
Projekt NetBeans wersji internetowej nr 2 uzyskuje się poprzez skopiowanie poprzedniego projektu:
![]() |
- [1]: kopiujemy nowy projekt i wklejamy go w zakładce [Projects],
- [2]: nadajemy mu nazwę i określamy lokalizację folderu,
- [3]: projekt został utworzony,
Nowy projekt ma taką samą nazwę jak poprzedni. Zmieniamy to:
![]() |
- [4]: zmieniamy nazwę projektu na
- [5]: zmieniamy jego nazwę, a także nazwę projektu artifactID.
Musimy wprowadzić tylko kilka zmian, aby dostosować tę warstwę internetową do nowego środowiska: symulowaną warstwę [metier] należy zastąpić warstwą [metier, DAO, jpa] z serwera zbudowanego w punkcie 7.1. W tym celu wykonujemy dwie czynności:
- usuwamy pakiety [exception, metier, jpa], które znajdowały się w poprzednim projekcie.
- aby zrekompensować to usunięcie, dodajemy do zależności projektu internetowego projekt serwera EJB zbudowany w punkcie 7.1.
![]() |
- w projekcie [1] dodajemy zależność do projektu,
- w [2] wybieramy projekt Maven warstwy [métier]. W [3] określamy jego typ, a w [4] jego zakres. Jest to provided, co oznacza, że zostanie on dostarczony (provided) do modułu internetowego przez jego środowisko robocze. Wkrótce zobaczymy, że zostanie on dostarczony przez aplikację korporacyjną,
- w [5] dodano zależność.
Plik [pom.xml] ma zatem następującą postać:
<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>
Możemy teraz usunąć pakiety z warstwy [métier], które nie są już potrzebne:
![]() |
Musimy również zmodyfikować kod bean’a [Form.java]:
public class Form {
public Form() {
}
// warstwa biznesowa
private IMetierLocal metier=new Metier();
// pola formularza
...
W wierszu 7 instancjonowano symulowaną warstwę [métier]. Teraz musi ona odwoływać się do rzeczywistej warstwy [métier]. Poprzedni kod zmienia się na następujący:
public class Form {
public Form() {
}
// warstwa biznesowa
@EJB
private IMetierLocal metier;
// pola formularza
W wierszu 7 adnotacja @EJB wskazuje kontenerowi serwletów, który będzie wykonywał warstwę internetową, aby wstawił do pola metier warstwy 8 EJB, który implementuje interfejs lokalny IMetierLocal.
Dlaczego lokalny interfejs IMetierLocal, a nie interfejs IMetierRemote? Ponieważ warstwa internetowa i warstwa EJB działają w tym samym JVM:
![]() |
Klasy kontenera serwletów mogą bezpośrednio odwoływać się do klas EJB z kontenera EJB.
To wszystko. Nasza warstwa internetowa jest gotowa. Przekształcenie było proste, ponieważ zadbaliśmy o to, aby warstwę [métier] symulować za pomocą klasy zgodnej z interfejsem IMetierLocal, zaimplementowanym przez rzeczywistą warstwę [métier].
11.3. Projekt NetBeans aplikacji korporacyjnej
Aplikacja korporacyjna umożliwia jednoczesne wdrożenie na serwerze aplikacji warstwy [web] oraz warstwy EJB danej aplikacji, odpowiednio w kontenerze serwletów oraz w kontenerze EJB.
Postępujemy w następujący sposób:
![]() |
- w [1] tworzymy nowy projekt
- w [2] wybieramy kategorię [Maven]
- w [3] wybieramy typ [Enterprise Application]
- w [4] nadajemy nazwę projektowi
![]() |
- w [5] wybieramy Java EE 6
- na [6]; projekt firmowy może obejmować maksymalnie dwa typy modułów:
- moduł EJB
- moduł internetowy
Wraz z utworzeniem projektu przedsiębiorstwa można zlecić utworzenie tych dwóch modułów, które początkowo będą puste. Projekt przedsiębiorstwa służy wyłącznie do wdrażania modułów, które wchodzą w jego skład. Poza tym jest to pusta skorupa. W tym przypadku chcemy wdrożyć:
- istniejący moduł internetowy [mv-pam-jsf2-alone]. Nie ma więc potrzeby tworzenia nowego modułu internetowego.
- istniejący moduł EJB o nazwie [mv-pam-ejb-metier-dao-eclipselink]. Również w tym przypadku nie ma potrzeby tworzenia nowego modułu.
W [6] tworzymy projekt korporacyjny bez modułów. Moduły internetowe i EJB dodamy do niego później.
- W projekcie [7] utworzono dwa projekty Maven. Projekt korporacyjny to ten z rozszerzeniem „ear”. Drugi projekt jest projektem nadrzędnym względem poprzedniego. Nie będziemy się nim zajmować.
Dodajemy moduł internetowy oraz moduł EJB do projektu korporacyjnego:
![]() |
- w [1] dodajemy nową zależność,
- w [2] dodajemy projekt EJB oraz [mv-pam-ejb-metier-dao-eclipselink]. Zwróćmy uwagę na jego typ ejb,
- w [3] dodano projekt internetowy [mv-pam-jsf2-ejb]. Należy zwrócić uwagę na jego typ war.
Plik [pom.xml] ma zatem następującą postać:
<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>
Przed wdrożeniem aplikacji korporacyjnej [mv-pam-webapp-ear] należy upewnić się, że baza danych MySQL [dbpam_eclipselink] istnieje i jest wypełniona. Po wykonaniu tej czynności możemy wdrożyć aplikację korporacyjną [mv-pam-webapp-ear]:
![]() |
- w [1] aplikacja korporacyjna została wdrożona
- w [2], aplikacja korporacyjna [mv-pam-webapp-ear] została pomyślnie wdrożona.
W przeglądarce wyświetla się następująca strona:
![]() |
- w pliku [1], zamiast żądanego pliku URL
- w [2], lista pracowników została uzupełniona o elementy z tabeli [Employes] z bazy dbpam.
Zachęcamy czytelnika do ponownego przeprowadzenia testów wersji internetowej nr 1. Oto przykładowe wyniki:












