Skip to content

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:

Image