Framework Struts 2
Transkrypt
Framework Struts 2
Framework Struts 2
Framework Struts 2
Autor: inż. WioletaŚWIRSKA
Promotor: dr inż. Marek MIŁOSZ
Wstęp
Elastycznym i łatwo rozszerzalnym frameworkiem do tworzenia aplikacji internetowych
w Javie na licencji open-source jest Struts 2. Powstał na bazie swojego poprzednika Struts 1
oraz WebWork (oryginalnie nazywał się WebWork2) [1]. Nowa wersja frameworka
wprowadza kilka nowych elementów architektury, w tym m.in.: interceptory, ograniczenie
lub eliminację XML przez konfigurację opartą na adnotacjach oraz wydajny język wyrażeń
OGNL (ang. Object-Graph Navigation Language). Opiera się o model MVC (ang. ModelView-Controller), jego celem jest oddzielenie modelu danych, interfejsu użytkownika i logiki
sterowania w aplikacji – rys. 1.
Rys. 1. Architektura szkieletu programistycznego [3]
2012-03-23
Strona 1
Framework Struts 2
Model, widok i kontroler w Struts 2 są realizowane odpowiednio przez action,
result i FilterDispatcher. Do tworzenia widoku, głównie wykorzystuje się JSP, rolę
kontrolera pełnią Servlety, a model tworzony jest przez komponenty EJB lub JavaBeans.
W Struts 2 rolę kontrolera pełni FilterDispatcher, jeden servlet sprawdzający
każde przychodzące żądanie i określający akcję, która powinna je obsłużyć. Definicja filtra
i mapowanie URL na akcję podawane są w pliku web.xml. Przykładową zawartość pliku
podano na listingu 1.
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Listing 1. Konfiguracja FilterDispatcher w pliku web.xml
2012-03-23
Strona 2
Framework Struts 2
Rys. 2. Struts 2 - architektura MVC
1. Pliki konfiguracyjne frameworka Struts 2
Głównymi plikami konfiguracyjnymi szkieletu są pliki XML, tj. web.xml oraz struts.xml. Plik
web.xml (ang. Web Deployment Descriptor) jest głównym plikiem konfiguracyjnym aplikacji
internetowych napisanych w Javie. W tym pliku, Struts definiuje FilterDispatcher, servlet
inicjujący framework i obsługujący wszystkie żądania. W nim określana jest również strona
startowa, która jest uruchamiana po starcie programu. Plik ten musi być zapisany w folderze
WEB-INF.
Struts.xml zawiera podstawową konfigurację szkieletu. W pliku opisane są:
Interceptory, które mogą przeprowadzać pre-processing i post-processing żądania
Klasy akcji, które mogą wywołać logikę biznesową i kod dostępu do danych
Rezultaty, które mogą przygotować widok za pomocą JavaServer Pages, Velocity
i szablonu FreeMarker
Głównym znacznikiem w pliku struts.xml jest znacznik <struts>, który może zawierać
następujące znaczniki:
<package> - grupuje akcje, ich wyniki, interceptory; posiada atrybuty:
name – stanowi klucz do referencji do tego pakietu,
extends – pozwala na odziedziczenie konfiguracji z innych pakietów,
namescpace – zapewnia mapowanie z URL do pakietu,
2012-03-23
Strona 3
Framework Struts 2
abstract – deklaruje pakiet abstrakcyjny (nie wymaga konfiguracji akcji
w pakiecie);
<action> - deklaracja akcji, może zawierać następujące atrybuty:
name – nazwa akcji, obowiązkowa,
class – klasa, w której znajduje się metoda wykonywana podczas wywołania
akcji,
method – określenie metody z klasy akcji, która ma zostać wykonana podczas
wywołania akcji;
<results> - opisuje typ wyniku oraz miejsce, do którego ma zostać zwrócony, posiada
następujące atrybuty:
name - nazwa wyniku,
type – typ wyniku;
<interceptors> - przechwytywacze wykonania akcji, w których opisane są pojedyncze
interceptory, z atrybutami name oraz class, a także znaczniki do opisu stosu
interceptorów.
Plik podzielony na mniejsze pliki, można załączyć do pliku głównego korzystając ze
znacznika <include>. Istnieją jeszcze inne znaczniki, pominięte w tym opisie, z powodu
mniejszej ich używalności.
2. Cykl życia żądania w Struts 2
Żądanie przychodzące od użytkownika w szkielecie Struts 2 na początku przechodzi przez
FilterDispatcher - filtr, który mapuje URL na odpowiednią akcję będącą obiektem
Javy. Następnie Interceptory przeprowadzają pre-processing, który jest związany z mapowaną
akcją. Po przeprowadzeniu działań poprzedzających, akcja zostaje wykonana. Wówczas
Interceptory ponownie wykonują działania związane z daną akcją – tzw. post-processing,
działania po wykonaniu akcji. Na zakończenie zostaje wygenerowany odpowiedni wynik,
w zależności od rezultatu wykonanej akcji. Najczęściej widok tworzony jest przez
wykorzystanie JSP.
2012-03-23
Strona 4
Framework Struts 2
Rys. 3. Przepływ żądania w Struts 2 [4]
3. Akcje
Akcje są kluczowym elementem (sercem) architektury szkieletu i mają za zadanie
hermetyzację logiki biznesowej, stanowią centrum dla transferu danych a także pomagają
szkieletowi w określeniu, jaki wynik będzie zwrócony w odpowiedzi na żądanie. Po
zakończeniu pracy, akcja przesyła wynik do komponentu widoku.
Struktura akcji znajduje się w pliku konfiguracyjnym struts.xml. Obowiązkowym
elementem składającym się na deklarację akcji jest jej nazwa. Dodatkowo podawana jest
lokalizacja, gdzie ma być przekierowany wynik działania akcji – znacznik result.
Konfigurację przykładowej akcji przedstawia listing 2.
<action name="Hello">
<result>hello.jsp</result>
</action>
Listing 2. Konfiguracja akcji w pliku struts.xml
2012-03-23
Strona 5
Framework Struts 2
Podczas uruchamiania akcji, w której zdefiniowano tylko jej nazwę oraz rezultat,
pominięto klasę akcji, nie podano również nazwy czy typ rezultatu, zostanie automatycznie
wywołana metoda execute() z klasy ActionSupport (przykład powyżej). Zostanie zwrócony
„success” – domyślny atrybut name dla rezultatu. Typ rezultatu będzie typem domyślnym –
Request – spowoduje bezpośrednie przekazanie żądania do strony hello.jsp.
Oprócz deklaracji architektury w pliku XML, Struts 2 wprowadza możliwość
zastosowania adnotacji. Każdą akcję można również zdefiniować przy użyciu równoważnego
zapisu wykorzystującego adnotacje (rys. 4).
Rys. 4. Deklaracja akcji przez użycie xml i adnotacji [2]
Ta sama akcja przedstawiona na listingu 2, zadeklarowana za pomocą adnotacji wygląda
jak na listingu 3.
@Result(name="success",location="hello.jsp")
publicclass HelloAction extends ActionSupport{}
Listing 3. Deklaracja akcji za pomocą adnotacji
2012-03-23
Strona 6
Framework Struts 2
Wywołanie innej metody zamiast execute() wiąże się z napisaniem własnej klasy i metody
oraz z podaniem nazwy tej metody oraz klasy, w której się znajduje, jako atrybuty w definicji
akcji. Dodatkowo metoda musi zwracać String, który odpowiada atrybutowi „name”
zdefiniowanemu w rezultacie (listing 4). Klasa akcji nie musi implementować interfejsu
Action(), ale musi zawierać metodę execute() by w niej umieścić logikę biznesową. Aby akcja
miała dostęp do danych musi dostarczać gettery i/lub setery do pola, do którego się odwołuje.
<action name="Hello" class="package.HelloAction"
method="doHello" >
<result name="sayHello">/sayHello.jsp</result>
</action>
class HelloAction {
public String doHello() {
return "sayHello";
}
}
Listing 4. Definicja własnej akcji
4. Interceptory
Interceptory stanowią bardzo ważną część architektury frameworka Struts 2. Wywoływane są
przed i po wykonaniu akcji, w celu przeprowadzenia dodatkowych operacji poprzedzających
lub następujących po danej akcji. Stos interceptorów – grupa kolejno wywoływanych
interceptorów – poprzedza akcję, która musi przejść przez ten stos. Każda akcja może mieć
stos z nią związany lub jeden ogólny stos zdefiniowany dla wszystkich akcji. Aby zwiększyć
wydajność aplikacji można definiować własne interceptory. Konfiguracja zapisywana jest
w pliku struts.xml. W przykładowym zapisie zdefiniowany zostaje stos interceptorów, który
następnie jest dodany do akcji (listing 5).
2012-03-23
Strona 7
Framework Struts 2
<interceptor-stack name="basicStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="servlet-config"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="params"/>
<interceptor-ref name="conversionError"/>
</interceptor-stack>
<action name="my" class="com.fdar.infoq.MyAction" >
<result>view.jsp</result>
<interceptor-ref name="basicStack"/>
</action>
Listing 5. Wpis konfiguracyjny stosu interceptorów w pliku struts.xml
Podsumowanie
Silną stroną frameworka Struts 2 jest to, że pozwala w łatwy sposób mapować adresy stron
aplikacji webowej, na metody klas obsługujących zadania, dzięki czemu rozwijanie aplikacji
staje się łatwiejsze dla programistów. Przez wsparcie dla internacjonalizacji można tworzyć
aplikacje uniwersalne i wielojęzyczne. Posiada szereg miejsc umożliwiających adaptację
frameworka do potrzeb aplikacji (ang. Extenstion Points). Dostarczana przez framework
warstwa kontrolera pozwala programistom na połączenie jej z innymi standardowymi
technologiami do obsługi m.in. logiki biznesowej, dostępu do danych oraz warstwy
prezentacji. Przykładowymi technologiami dla logiki biznesowej są POJO oraz XWork, dla
dostępu do danych DAO, EJB czy Hibernate, a dla warstwy prezentacji JSP, Velocity
i Freemarker. Struts 2 także posiada wiele własnych zestawów znaczników JSP. Dodatkowym
atutem jest to, że wykorzystując tą technologię, wiele zmian można przeprowadzać bez
konieczności ponownego uruchamiania kontenera webowego.
Wśród wad korzystania z frameworka można wymienić braki w dokumentacji.
Niekompletność danych jest uzupełniana dzięki wsparciu grupy dyskusyjnej użytkowników
frameworka, wymieniających swoje doświadczenie i wiedzę na forum internetowym.
2012-03-23
Strona 8
Framework Struts 2
Struts2 nie nadaje się do wszystkich rodzajów aplikacji internetowych. Decydując się na
tworzenie w tym frameworku, należy rozważyć istotne kwestie, czy aplikacja będzie
dostatecznie rozbudowana oraz czy będzie spora interakcja z użytkownikiem.
Literatura
1. Strona projektu Struts: http://struts.apache.org/index.html
2. Donald Brown, Chad Michael Davis, Scott Stanlick, Struts 2 in action, Manning, 2008
3. Jarosław Lis, Wprowadzenie do platformy J2EE oraz przegląd najważniejszych
technologii tworzących standard, Instytut Informatyki Politechniki Warszawskiej
4. Ian Roughley, Starting Struts2, C4Media, 2007
2012-03-23
Strona 9