STRUTS 2 Krystyna Bury Katarzyna Sadowska Joanna Pyc Politechnika Wrocławska Wydział Informatyki i Zarządzania Informatyka, III rok
Spis treści 1 2 SERWLET JSP Inne Frameworki 3 Architektura MVC (Model - View - Controller) Architektura MVC2 4 5 6 7 8 Dlaczego Struts2? Niezbędnik Pomocne linki
Struts 2 to elastyczny i łatwo rozszerzalny framework do tworzenia aplikacji webowych w Javie. cel - uczynić rozwijanie aplikacji webowej łatwiejszym dla dewelopera.
SERWLET SERWLET JSP Inne Frameworki SERWLET Pierwszy oparty na Javie sposób tworzenia aplikacji webowych, program wykonywany na serwerze URL jest mapowany na klasy, których metody będą wywoływane HTML w Javie na większą skalę jest koszmarem w utrzymywaniu przy każdej zmianie w aplikacji konieczna rekompilacja itd.
JSP SERWLET JSP Inne Frameworki JSP Technologia polegająca na umieszczaniu kodu Javy wewnątrz kodu HTML każdy JSP zapewnia zarówno logikę dla przetwarzania zapytania jak i sposób wyświetlania kod Javy nieuporządkowany w klasy i metody sprzyja copypaste dlatego do specyfikacji JSP dodano tagi
Inne Frameworki SERWLET JSP Inne Frameworki Action-Based Frameworks Kombinacja pomysłów serwletów i JSP oddzielenie logiki przetwarzania od logiki prezentacji MVC, w którym serwlet jest kontrolerem, modelem są akcje, a za widok odpowiadają strony JSP
Inne Frameworki SERWLET JSP Inne Frameworki Action-Based Frameworks Kombinacja pomysłów serwletów i JSP oddzielenie logiki przetwarzania od logiki prezentacji MVC, w którym serwlet jest kontrolerem, modelem są akcje, a za widok odpowiadają strony JSP Component-Based Frameworks Aplikacja webowa nie jest logicznie dzielona na strony, tylko na komponenty (widgety) każdemu widgetowi odpowiada jego własna logika przetwarzania re-use komponentów
Architektura MVC Architektura MVC (Model - View - Controller) Architektura MVC2 Model - logika biznesowa, baza danych Widok - wygląd strony Kontroler - kod nawigacyjny Rysunek: Architektura MVC
Architektura MVC2 Architektura MVC (Model - View - Controller) Architektura MVC2 standardowe MVC nie jest najlepszym rozwiązaniem dla aplikacji webowych Rysunek: Architektura MVC2
Architektura MVC2 Architektura MVC (Model - View - Controller) Architektura MVC2 standardowe MVC nie jest najlepszym rozwiązaniem dla aplikacji webowych Struts 2 (jak i wiele innych frameworków) używa jego modyfikacji MVC2 Rysunek: Architektura MVC2
Kontroler Struts2 dispatch sevlet filter interceptory Rysunek:
Kontroler Struts2 dispatch sevlet filter interceptory Model akcje Rysunek:
Kontroler Struts2 dispatch sevlet filter interceptory Model akcje Widok typy wynikowe wyniki / view technologies Rysunek:
cd. Struts2 jest bardzo elastyczny i rozszerzalny i dla danej aplikacji webowej właściwie wszystko jest konfigurowalne.
cd. Struts2 jest bardzo elastyczny i rozszerzalny i dla danej aplikacji webowej właściwie wszystko jest konfigurowalne. Framework Struts2 dostarcza warstwę kontrolera.
cd. Struts2 jest bardzo elastyczny i rozszerzalny i dla danej aplikacji webowej właściwie wszystko jest konfigurowalne. Framework Struts2 dostarcza warstwę kontrolera. Deweloperzy mogą użyć tej warstwy łącząc ją z innymi standardowymi technologiami do obsługi: logiki biznesowej np. POJOs, XWork dostępu do danych np. DAOs, Cayenne, EJB, Hibernate warstwy prezentacji np. JSP, Velocity, Freemarker
Każde żądanie od użytkownika przechodzi najpierw przez Dispatcher Filter, który odpowiednio mapuje URL na akcję, która jest obiektem javowym
Każde żądanie od użytkownika przechodzi najpierw przez Dispatcher Filter, który odpowiednio mapuje URL na akcję, która jest obiektem javowym wykonują pre-processing związany z daną akcją
Każde żądanie od użytkownika przechodzi najpierw przez Dispatcher Filter, który odpowiednio mapuje URL na akcję, która jest obiektem javowym wykonują pre-processing związany z daną akcją Akcja zostaje wykonana
Każde żądanie od użytkownika przechodzi najpierw przez Dispatcher Filter, który odpowiednio mapuje URL na akcję, która jest obiektem javowym wykonują pre-processing związany z daną akcją Akcja zostaje wykonana wykonują post-processing
Każde żądanie od użytkownika przechodzi najpierw przez Dispatcher Filter, który odpowiednio mapuje URL na akcję, która jest obiektem javowym wykonują pre-processing związany z daną akcją Akcja zostaje wykonana wykonują post-processing W zależności od wyniku akcji zostaje wygenerowany odpowiedni widok (domyślnie: JSP)
Cykl życia w Struts2 cd. Kluczowe we frameworku Struts2 są: akcje interceptory
akcje to podstawowy element we frameworkach typu action-based elementem obowiązkowym akcji jest name konfiguracje akcji dodajemy do pliku konfiguracyjnego struts.xml <action name= Hello > <result>hello.jsp</result> </action> domyślnie wywołana zostanie metoda execute() z klasy ActionSupport domyślny wynik rezultatu: success typu Request
cd. można napisać własną klasę z metodą,tórą chcemy wywołać metoda musi zwracać String zdefiniowany w rezultacie <action name= Hello class= package.helloaction method= dohello > <result name= sayhello >/sayhello.jsp</result> </action> klasa akcji nie musi implementować interfejsu Action() class HelloAction { public String dohello() { return sayhello ; } }
cd. Dobrą praktyką jest zwracanie sterowania do kontrolera. <action name= sendhellomail class= package.helloaction method= sendhellomail > <result name= sandhellomail type= redirect-action > sayhello</result> </action> <action name= Hello class= package.helloaction method= dohello > <result name= sayhello >/sayhello.jsp</result> </action>
cd. class HelloAction { public String sendhellomail() { sendmailto(user@post.com, Hello! ); return Hello ; } public String dohello() { return sayhello ; } }
cd. Stosowanie parametrów w konfiguracji: <action name= gatherreportinfo class=... > <result name= showreportresult type= redirect-action > <param name= actionname >generatereport</param> <param name= namespace >/genreport</param> <param name= reporttype >pie</param> <param name= width >100</param> <param name= height >100</param> </result> </action>
cd. <action name= defineaction class=... > <result name= next type= redirect-action > ${actionname}</result> </action> class HelloAction implements Action { private String actionname; public String execute() { actionname= nextaction ; return next ; } public String getactionname() { return actionname; } }
cd. jeśli akcja chce dostać się do danych, musi dostarczać gettery i/lub settery do danego pola np. jeśli JSP robi wywołanie: /home.action?framework=struts&version=2 akcja powinna dostarczać settery setframework(string frameworkname) oraz setversion(int version)
element opcjonalny w konfiguracji koncepcyjne interceptory odpowiadają używanym w serwletach filtrom pozwalają na wstępne oraz wyjściowe przetwarzanie akcji podobnie jak filtry mogą tworzyć uszeregowane warstwy
cd. Struts2 opiera większość swojej funkcjonalności na interceptorach, więc często do jednej akcji przypisanych jest po ok.8-10 interceptorów Dlatego wygodnie jest tworzyć stosy interceptorów <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>
- przykład public class DocumentMapperInterceptor impelements Interceptor{ DocumentService documentservice; public void destroy(){} public void init(){} @SuppressWarnings( unchecked ) public String intercept(actioninvocation invocation) throws Exception { if(invocation.getaction() instanceof DocumentAwareAction){ Document doc = documentservice.mapfromrequest(servletactioncontext.getrequest()); if(doc!= null) { ((DocumentAwareAction)invocation.getAction()).setDocument(doc); } } return invocation.invoke(); } }
- przykład cd. Interfejs do oznaczenia akcji: public interface DocumentAwareAction { public void setdocument(document document); }
- konfiguracja Wpis konfiguracyjny w struts.xml: <interceptors> <interceptor name= autowiring class= package.struts2.interceptors.documentmapperinterceptor /> </interceptors> dodajemy do akcji: <action name= index class= package.struts2.actions.indexaction > <interceptor-ref name= docaware /> <result>/index.jsp</result> </action>
Dlaczego Struts2? Niezbędnik Pomocne linki
Dlaczego Struts2? Dlaczego Struts2? Niezbędnik Pomocne linki uproszczony projekt frameworku - uniezależnienie akcji od frameworku; komponenty frameworku są luźno powiązane uproszczone akcje - POJOs, dependency injection ułatwione testowanie - akcje są niezależne od HTTP i od frameworku + depency injection nie używa ActionForms inteligentne defaulty - większość elementów konfiguracji ma wartości domyślne
Dlaczego Struts2? cd. Dlaczego Struts2? Niezbędnik Pomocne linki dostarcza biblioteki tagów i pozwala na wykorzystywanie innych bibliotek (np. JSP, FreeMarker) - mniej kodu QuickStart - wiele zmian może być przeprowadzonych w locie, bez konieczności restartu kontenera webowego łatwa integracja ze Springiem łatwa rozszerzalność poprzez dodawanie wtyczek - wystarczy dodać JARa wsparcie dla AJAXa - framework dostarcza zestaw tagów, które uczynią aplikację bardziej interaktywną
Niezbędnik Dlaczego Struts2? Niezbędnik Pomocne linki Eclipse IDE for Java EE Developers (lub Eclipse z zainstalowanym WTP Java 5.0 lub nowsza Apache Tomcat Server v6 Struts2 Framework
Pomocne linki Dlaczego Struts2? Niezbędnik Pomocne linki http://www.coreservlets.com/apache-tomcat- Tutorial/eclipse.html http://www.struts2.net/tutorial.htm http://www.roseindia.net/struts/struts2/struts-2-helloworld.shtml http://www.struts2.org/free-struts2-book/developing-yourfirst-struts2-application/ http://wiki.apache.org/struts/poweredby