Skip to content

1. Wprowadzenie

Plik PDF dokumentu jest dostępny pod nazwą |TUTAJ|.

Przykłady z dokumentu są dostępne pod numerem |TUTAJ|.

W niniejszym dokumencie zamierzamy przedstawić, na podstawie przykładów, najważniejsze pojęcia związane ze Struts 2. Struts 2 to framework internetowy, który udostępnia:

  • szereg bibliotek w postaci plików JAR
  • środowisko programistyczne: Struts 2 wpływa na sposób tworzenia aplikacji internetowych.

Do zrozumienia przykładów niezbędne są następujące wymagania:

  • podstawową znajomość języka Java
  • podstawową wiedzę z zakresu tworzenia aplikacji internetowych, w szczególności języka HTML.

Na stronie [http://developpez.com] można znaleźć wszystkie materiały niezbędne do spełnienia tych wymagań. Niektóre z nich sam napisałem i są one dostępne na stronie [http://tahe.developpez.com].

Przykłady zawarte w niniejszym dokumencie są dostępne na stronach URL i [TUTAJ].

Aby pogłębić wiedzę na temat Struts 2, można skorzystać z następujących materiałów:

  • [ref1]: dokumentacja Struts 2 dostępna na stronie internetowej Struts
  • [ref2]: książka „Struts 2 in Action” autorstwa Donalda Browna, Chada Michaela Davisa i Scotta Stanlicka, wydana przez wydawnictwo Manning. Książka ta ma szczególnie edukacyjny charakter.

Czasami będziemy odwoływać się do [ref2], aby wskazać czytelnikowi, że może pogłębić swoją wiedzę w danym obszarze dzięki tej książce.

Dokument został napisany w taki sposób, aby można go było czytać bez konieczności korzystania z komputera. Dlatego zamieszczono w nim wiele zrzutów ekranu.

1.1. Rola Struts 2 w aplikacji internetowej

Na początek spróbujmy umiejscowić Struts 2 w procesie tworzenia aplikacji internetowej. Najczęściej aplikacja ta będzie oparta na architekturze wielowarstwowej, takiej jak poniższa:

  • warstwa [web] stanowi warstwę kontaktową z użytkownikiem aplikacji internetowej. Użytkownik ten wchodzi w interakcję z aplikacją internetową za pośrednictwem stron internetowych wyświetlanych w przeglądarce. To właśnie w tej warstwie znajduje się Struts 2 i wyłącznie w tej warstwie.
  • Warstwa [metier] realizuje reguły biznesowe aplikacji, takie jak obliczanie wynagrodzenia lub faktury. Warstwa ta wykorzystuje dane pochodzące od użytkownika za pośrednictwem warstwy [web] oraz z systemu zarządzania danymi (SGBD) za pośrednictwem warstwy [dao].
  • Warstwa [dao] (Data Access Objects), warstwa [jpa] (Java Persistence API) oraz sterownik JDBC zarządzają dostępem do danych z systemu zarządzania bazami danych (SGBD). Warstwa [jpa] pełni rolę ORM (Object Relational Mapper). Stanowi pomost między obiektami obsługiwanymi przez warstwę [dao] a wierszami i kolumnami danych w relacyjnej bazie danych.
  • Integrację warstw można zrealizować za pomocą kontenera Spring lub EJB3 (Enterprise Java Bean).

Większość przykładów podanych poniżej będzie wykorzystywać tylko jedną warstwę, a mianowicie warstwę [web]:

Niniejszy dokument zakończy się jednak stworzeniem wielowarstwowej aplikacji internetowej:

Zestaw warstw [metier], [dao], [jpa/hibernate] zostanie nam dostarczony w postaci archiwum jar, dzięki czemu ponownie będziemy musieli zbudować jedynie warstwę [web].

1.2. Model rozwoju MVC w Struts 2

Struts 2 implementuje model architektury znany jako MVC (Model – Widok – Kontroler) w następujący sposób:

Przetwarzanie żądania klienta przebiega w następujący sposób:

Żądane URL mają postać http://machine:port/contexte/rep1/rep2/.../Action. Ścieżka [/rep1/rep2/.../Action] musi odpowiadać akcji zdefiniowanej w pliku konfiguracyjnym Struts 2, w przeciwnym razie zostanie odrzucona. Akcja jest definiowana w pliku XML w następującej postaci:

1
2
3
4
5
6
<package name="actions" namespace="/actions" extends="struts-default">
    <action name="Action1" class="actions.Action1">
      <result name="page1">/vues/Page1.JSP</result>
      <result name="page2">/vues/Page2.JSP</result>
    </action>
</package>

W oparciu o poprzedni przykład załóżmy, że wysłano żądanie do kontrolera URL [ http://machine:port/contexte/actions/Action1]. Wówczas wykonywane są następujące kroki:

  1. żądanie – przeglądarka klienta wysyła żądanie do kontrolera [FilterDispatcher]. Kontroler ten obsługuje wszystkie żądania klientów. Stanowi on punkt wejścia do aplikacji. Jest to litera „C” w skrócie MVC.

  2. Przetwarzanie

    • kontroler C sprawdza swój plik konfiguracyjny i stwierdza, że akcja actions/Action1 istnieje. namespace (wiersz 1) połączony z nazwą akcji (atrybut name z wiersza 2) definiuje akcję actions/Action1.
    • Kontroler C instancjonuje [2a] jako klasę typu [actions.Action1] (atrybut class z wiersza 2). Nazwa i pakiet tej klasy mogą być dowolne.
    • jeśli do wywołania URL dołączone są parametry typu [param1=val1&param2=val2&...], wówczas kontroler C przypisuje te parametry do klasy [actions.Action1] w następujący sposób:
[actions.Action1].setParami(valeuri) ;

Konieczne jest zatem, aby klasa [actions.Action1] posiadała metody setParami dla każdego z oczekiwanych parametrów parami.

  • (ciąg dalszy)
    • kontroler C żąda wykonania metody podpisywania [String execute()] klasy [actions.Action1]. Metoda ta może wówczas wykorzystać parametry parami, które klasa pobrała. Podczas przetwarzania żądania użytkownika może ona potrzebować warstw [metier] i [2b]. Po przetworzeniu żądania klienta może ona wywołać różne odpowiedzi. Klasycznym przykładem jest:
      • strona błędów, jeśli żądanie nie mogło zostać poprawnie przetworzone
      • w przeciwnym razie strona potwierdzenia

Metoda execute zwraca do kontrolera C wynik typu ciąg znaków zwany kluczem nawigacyjnym. W powyższym przykładzie jest to [actions.Action1].execute może wygenerować dwa klucze nawigacyjne: „page1” (wiersz 3) oraz „page2” (wiersz 4). Metoda [actions.Action1].execute zaktualizuje również szablon M [2c], który zostanie wykorzystany przez stronę JSP, która zostanie wysłana w odpowiedzi do użytkownika. Szablon ten może zawierać elementy:

  • (ciąg dalszy)
    • klasy [actions.Action1], której instancja
    • sesji użytkownika
    • danych o zasięgu aplikacji
  1. odpowiedź – kontroler C żąda wyświetlenia strony JSP odpowiadającej kluczowi nawigacyjnemu [3]. Jest to widok, czyli V, strony MVC. Strona JSP wykorzystuje szablon M do zainicjowania dynamicznych części odpowiedzi, którą ma wysłać do klienta.

Teraz wyjaśnijmy związek między architekturą internetową MVC a architekturą warstwową. W rzeczywistości są to dwie różne koncepcje, które czasami są mylone. Weźmy jako przykład jednowarstwową aplikację internetową Struts 2:

Jeśli zaimplementujemy warstwę [web] przy użyciu Struts 2, otrzymamy wprawdzie architekturę internetową MVC, ale nie będzie to architektura wielowarstwowa. W tym przypadku warstwa [web] zajmie się wszystkim: prezentacją, logiką biznesową i dostępem do danych. W przypadku Struts 2 zadanie to będą realizować klasy typu [Action].

Rozważmy teraz architekturę internetową wielowarstwową:

Warstwa [web] może zostać zaimplementowana bez wykorzystania frameworka i bez stosowania się do modelu MVC. Mamy wówczas architekturę wielowarstwową, ale warstwa internetowa nie implementuje modelu MVC.

W MVC stwierdziliśmy, że model M odpowiada widokowi V, c.a.d, czyli zbiorowi danych wyświetlanych przez widok V. Czasami (często) podaje się inną definicję modelu M z MVC:

Wielu autorów uważa, że to, co znajduje się po prawej stronie warstwy [web], stanowi model M warstwy MVC. Aby uniknąć niejasności, można mówić o:

  • o modelu domeny, gdy mamy na myśli wszystko, co znajduje się po prawej stronie warstwy [présentation]
  • o modelu widoku, gdy mamy na myśli dane wyświetlane przez widok V

W dalszej części termin „model M” będzie odnosił się wyłącznie do modelu widoku V.

1.3. Wykorzystane narzędzia

W dalszej części korzystamy (grudzień 2011 r.) z

  • IDE NetBeans 7.01 dostępny pod adresem URL [http://www.netbeans.org]
  • wtyczka Struts 2 dla NetBeans 7.01 dostępna pod adresem URL [http://plugins.netbeans.org/plugin/39218]
  • wersja 2.2.3 Struts 2 dostępna pod adresem URL [http://struts.apache.org/]

Należy zauważyć, że do opracowania poniższych przykładów niezbędne są wyłącznie biblioteki Struts 2 dostępne pod adresami URL i [http://struts.apache.org/]. NetBeans można zastąpić innym środowiskiem (Eclipse, JDeveloper, IntelliJ itp.), a wtyczka Struts 2 służy jedynie ułatwieniu pracy programisty. Nie jest ona również niezbędna.

1.3.1. IDE NetBeans

Na stronie pobierania NetBeans wybieramy wersję Java EE:

Image

1.3.2. Wtyczka Struts 2

W zależności od wersji NetBeans wtyczka ta nie zawsze była dostępna. W grudniu 2011 r. można ją znaleźć pod numerem URL [http://plugins.netbeans.org]. Ten plik URL pozwala sprawdzić różne wtyczki dostępne dla NetBeans. Można filtrować wyniki wyszukiwania. W [1] można wyszukać wtyczki, których nazwa zawiera słowo „struts”.

  • klikalibyśmy link [2]

Pobieramy wtyczkę i rozpakowujemy ją [2]. Aby zintegrować ją z NetBeans, możemy postępować w następujący sposób:

  • uruchom NetBeans
  • w [1] wybierz menu Tools/Plugins
  • w zakładce [2] należy użyć przycisku [3]
  • w [4], wybierz pliki .nbm pobranych wtyczek. W tym przypadku wybieramy biblioteki Struts w wersji 2.2.3 zamiast tych z Struts 2.0.14
  • Po powrocie do zakładki [2] instalujemy wybrane wtyczki za pomocą przycisku [5].

Instalacja wtyczek często wymaga ponownego uruchomienia programu NetBeans.

1.3.3. Biblioteki Struts 2

Jeśli pobrano wtyczkę Struts 2 dla NetBeans, dostępne są główne biblioteki Struts, ale nie wszystkie. W dalszej części będziemy potrzebować niektórych bibliotek dostępnych na stronie Struts 2 [http://struts.apache.org/].

Klikamy link [1], a następnie link [2], aby pobrać plik ZIP z dystrybucją 2.2.3.1. Po rozpakowaniu dystrybucji biblioteki niezbędne dla Strutsa znajdują się w folderze [lib] [3] tej dystrybucji. Jest ich kilkadziesiąt, więc pojawia się pytanie, które z nich są niezbędne. W tym pomoże nam wtyczka Strutsa.