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:
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:
-
żą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.
-
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¶m2=val2&...], wówczas kontroler C przypisuje te parametry do klasy [actions.Action1] w następujący sposób:
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
- 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:
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
- …
- 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:

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.










