Jakarta Struts Framework

Wzorzec Model-View-Controller

Istotą szeroko stosowanego wzorca projektowego Model-View-Controller jest podział aplikacji(bądź pewnej warstwy aplikacji, w przypadku bardzo rozbudowanych systemów) na 3 elementy:

Model

Zadaniem modelu jest generalnie przechowywanie informacji o stanie aplikacji. Rola modelu jest określona dosyć luźno, np. mogą ją odgrywać zarówno session beany realizujące skomplikowaną logikę biznesową jak i rzeczywiste klasy modelu(np. mapowane bezpośrdenio na bazę danych obiekty hibernatowe). Modelem może byc także wiele innych rzeczy które stanowią ujednolicenie, abstrakcję danych, z których korzysta aplikacja. Z jednego modelu może zazwyczaj korzystać wiele różnych widoków toteż nie powinien on w żaden sposób od nich zależeć.

Widok

Widok odpowiada za wyświetlanie informacji użytkownikowi i umożliwienie mu wprowadzania nowych danych. Widok sam w sobie nie przechowuje żadnego stanu, jedynie przekształca na określony, przyjazny dla użytkownika format informacje pochodzące z modelu. Z reguły sytuacja jest oczywiście bardziej skomplikowana, widoki mają różne podwidoki, odpowiadające za wyświetlanie różnych części modelu, ale mające pewne cześci wspólne.

Kontroler

Kontroler zarządza interakcją pomiędzy widokiem a modelem, to do niego są najpierw kierowane żądania i to on decyduje co z nimi zrobić, w szczególności: Większe systemy posiadają najczęściej wiele wyspecjalizowanych kontrolerów, które całościowo decydują o przepływie sterowania w aplikacji

MVC a J2EE

Wzorzec MVC, pomimo, że ma swoją genezę w projektach klasycznych aplikacji desktopowych z graficznymi interfejsami, z czasem zadomowił się w systemach realizowanych w technologii J2EE(która w pewnym sensie wymusza jego stosowanie). W klasycznej aplikacji J2EE widokiem najczęściej są strony jsp lub po prostu zwykłe strony html, rolę modelu mogą pełnić np. entity beany zaś kontrolerami są najczęsciej serwlety. Z powyższego widać, że to zaszycie wzorca MVC a architekturze J2EE nie jest do końca przejrzyste, w szczególności granica pomiędzy widokiem(jsp) a kontrolerem(serwlety) może się zacierać. Teoretycznie nic nie stoi na przeszkodzie, żeby za tworzenie widoków(choćby explicite generowanie kodu html) odpowiadały serlwety...co oczywiście jest dosyć brzydkim rozwiązaniem. Tutaj własnie okazuje się pomocny framework Struts, wymuszający na nas porządne MVC.

Dlaczego warto stosować MVC, dlaczego czasem może to być nieprzyjemne

Zalety Co może zniechęcić

Struts

Struts to szkieletowa implementacja warstwy interfejsu aplikacji J2EE, wymuszająca zastosowanie architektury MVC. Pierwszym autorem i pomysłodawcą Struts jest Craig McClanahan, który w 2000 roku udostępnił swój projekt Apache Software Foundation.

Idea

Jądrem Struts jest serwlet Action, który na podstawie deskryptora xml(zawierającego specyfikację akcji dla poszczególnych zdarzeń) kieruje żądania do odpowiednich klas je obsługujących(Klasy te są definiowane przez programistę i dziedziczą z klasy Action dostarczanej przez biblioteke Struts). W pliku web.xml definiujemy na jakie żądania ma reagować serwlet Action, zwyczajowo reaguje na wszystkie żądania HTTP, których adres URL posiada rozszerzenie .do

Gdy serwlet ActionServlet odbiera żądanie użytkownika, tworzy obiekt klasy obsługi żądań i wywołuje jego metodę execute() lub perform(). Zadaniem programisty jest implementacja jednej z tych metod w taki sposób, aby zwracały one obiekt klasy ActionForward, wskazujący stronę jsp, do której powinno zostać przekazane sterowanie. Implementując klasę obsługi żądań, programista posiada dostęp do: nagłówka żądania HTTP, parametrów wywołania, obiektów JavaBeans o zasięgu application/session/request, obiektu ActionForm(O ActionForm jest więcej w następnym paragrafie) opcjonalnie przekazanego przez serwlet ActionServlet, obiektu HttpResponse.

W celu propagacji parametrów wywołania aplikacji, programista tworzy klasy parametrów, dziedziczące z klasy ActionForm. Obiekty klas parametrów są automatycznie wypełniane parametrami wywołania pochodzącymi od użytkownika. Każdy parametr jest zapisywany w obiekcie ActionForm za pomocą metody setXXX(), gdzie XXX to nazwa parametru. Implementacja takich metod jest zadaniem dla programisty. Obiekt ActionForm jest tworzony przez ActionServlet, a po wypełnieniu danymi jest przekazywany do obiektu obsługi żądań (metoda execute()). Klasa parametrów nie zawiera kodu przetwarzania danych, a jedynie wspomniane akcesory, służące do odczytu odebranych parametrów wywołania. Klasy parametrów umożliwiają także łatwą przeprowadzania walidacji, czy prostych przekształceń na wprowadzonych danych.

Walidacja

W Struts istnieje możliwość zdefiniowania automatycznej walidacji wprowadzanych, poprzez formularze, danych. Aby tego dokonać należy

Tiles

Biblioteka tagów, umożliwiająca budowanie stron jsp z niezależnych fragmentów(za pomocą tagów insert umieszczających podstrony w wybranych miejscach ekranu). Zaletami tiles są przede wszystkim łatwość wprowadzania zmian(wystarczy zrobić to w dołączanych kawałkach) oraz wielokrotne wykorzystanie kodu stron.

Aplikacje tworzone z użyciem tiles moga być całkowicie pozbawione kodu html a skład poszczególnych wyświetlanych(przez Struts) widoków można wyspecyfikować w jednym pliku konfiguracyjnym tilesDefinition.xml W struts-config.xml, w przekierowaniach efektów akcji Struts podajemy wtedy nie rzeczywiste nazwy stron jsp, tylko nazwy definicji z pliku tilesDefinition.xml, informacje o położeniu tego pliku należy umieścić w web.xml

Jedną z ciekawych cech tiles jest mozliwość dziedziczenia pomiędzy definicjami, zmniejszająca ilość redundantnego kodu

Zalety i wady

Najpierw kilka w miarę oczywistych zalet technologii Struts Z wadami będzie trochę gorzej, Struts nie ma ich wielu ;-)

Alternatywy

Spring MVC

Spring MVC jest 'intefejsową' częścią coraz bardziej ostatnio popularnego frameworku Spring.

Java Server Faces

Tapestry

WebWork

Linki

Główna strona projektu Struts

Całkiem niezły tutorial

Inny tutorial

Do pracy ze struts warto zaopatrzyć się w jakieś narzędzie, np. coś w stylu Bea Workshop(które akurat jest komercyjne).

Tu można znaleźć trochę(w szczególności strutsowych) pluginów do eclipse

Przykładowe zastosowanie Struts

Teraz zaprezentujemy przykładową aplikację korzystającą ze Struts.