Tworzenie aplikacji J2EE w technologii Struts



Podobne dokumenty
Projektowanie aplikacji J2EE w architekturze Model-View-Controller

1 Wprowadzenie do J2EE

Architektura Model-View-Controller

Zaawansowane aplikacje internetowe - laboratorium Architektura Spring.

Temat: Ułatwienia wynikające z zastosowania Frameworku CakePHP podczas budowania stron internetowych

Serwlety Java: zagadnienia zaawansowane. Data Sources. Data Sources. Przykład pliku data-sources.xml

Przykłady tworzenia aplikacji komponentowych w technologii JavaServer Faces 2.1 na podstawie

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

JavaServer Faces (JSF)

Zaawansowane Aplikacje Internetowe

Aplikacje internetowe i rozproszone - laboratorium

Wprowadzenie do J2EE. Maciej Zakrzewicz.

Zaawansowane aplikacje internetowe - laboratorium Web Services (część 1).

Serwery aplikacji. mgr Radosław Matusik. Wydział Matematyki i Informatyki Uniwersytetu Łódzkiego radmat radmat@math.uni.lodz.

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

Laboratorium 7 Blog: dodawanie i edycja wpisów

BEAN VALIDATION. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

Tworzenie witryn internetowych PHP/Java. (mgr inż. Marek Downar)

A Zasady współpracy. Ocena rozwiązań punktów punktów punktów punktów punktów

Budowa prostej aplikacji wielowarstwowej. Laboratorium 1 Programowanie komponentowe Zofia Kruczkiewicz

prepared by: Programowanie WWW Servlety

Java Server Faces narzędzie do implementacji w wy prezentacji

Serwery aplikacji. dr Radosław Matusik. radmat

Wzorce prezentacji internetowych

Modele danych walidacja widoki zorientowane na model

Java wybrane technologie spotkanie nr 4. Serwlety c.d.

Aplikacje WWW - laboratorium

Laboratorium 1. Wzorce oprogramowania lab1, Zofia Kruczkiewicz

Aplikacje WWW Wprowadzenie

Programowanie obiektowe

Wstęp Budowa Serwlety JSP Podsumowanie. Tomcat. Kotwasiński. 1 grudnia 2008

Programowanie w Sieci Internet JSP ciąg dalszy. Kraków, 9 stycznia 2015 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Wybrane działy Informatyki Stosowanej

Tworzenie aplikacji J2EE w technologii Struts. Architektura Model-View-Controller. Plan prezentacji. Architektura MVC

Zagadnienia projektowania aplikacji J2EE

Budowa aplikacji wielowarstwowych zastosowanie szablonów. Laboratorium 2 Programowanie komponentowe Zofia Kruczkiewicz

Wzorce projektowe warstwy aplikacji

Badania poziomu bezpieczeństwa portalu dostępowego do infrastruktury projektu PL-Grid

Web frameworks do budowy aplikacji zgodnych z J2EE

Automatyczne generowanie kodu. 4Developers, 26 marca 2010

Programowanie w Javie 2. Płock, 26 luty 2014 r.

Infrastruktura aplikacji WWW II

Budowa aplikacji w technologii. Enterprise JavaBeans. Maciej Zakrzewicz PLOUG

Web frameworks do budowy aplikacji zgodnych z J2EE. Jacek Panachida

Aplikacje internetowe i rozproszone - laboratorium

Wykład dla studentów Informatyki Stosowanej UJ 2012/2013

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Plan prezentacji. Budowa aplikacji w technologii Enterprise JavaBeans. Przegląd architektur: CORBA. Cele budowy aplikacji rozproszonych

Aplikacja webowa w Javie szybkie programowanie biznesowych aplikacji Spring Boot + Vaadin

Aplikacje WWW - laboratorium

prepared by: Programowanie WWW Model-View-Controller

Poznań Java User Group Java Server Faces. Wprowadzenie (Fakty i Mity)

Komunikacja między serwletami

Aplikacje WWW - laboratorium

Warstwa prezentacji. wg. D.Alur, J.Crupi, D. Malks, Core J2EE. Wzorce projektowe.

Programowanie komponentowe. Przykład 1 Bezpieczeństwo wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

Wybrane działy Informatyki Stosowanej

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

I.Wojnicki, Tech.Inter.

Ewolucja projektowania aplikacji w PHP na bazie frameworka Symfony 2

Testowanie aplikacji Java Servlets

Serwlety. Co to jest serwlet? Przykładowy kod serwletu. Po co są serwlety?

Języki programowania wysokiego poziomu. PHP cz.3. Formularze

Zagadnienia Programowania Obiektowego Agata Hejmej

Budowa aplikacji ASP.NET z wykorzystaniem wzorca MVC

Szkolenie wycofane z oferty

I.Wojnicki, PHP. Smarty. Igor Wojnicki. Katedra Informatyki Stosowanej Akademia Górniczo-Hutnicza w Krakowie. 28 marca 2014

Analiza i projektowanie aplikacji Java

Przegląd d innych rozwiąza. zań szkieletowych dla J2EE

Architektury Usług Internetowych. Laboratorium 1 Servlety

Wprowadzenie do technologii JavaServer Faces 2.2 na podstawie Wykład 2 Technologie internetowe

Infrastruktura aplikacji WWW I

Programowanie komponentowe 5

Opis zmian funkcjonalności platformy E-GIODO wprowadzających możliwość podpisania wniosku bezpośrednio w oknie przeglądarki.

Enterprise JavaBeans

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),

Zaawansowane aplikacje internetowe

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

2) W wyświetlonym oknie należy zaznaczyć chęć utworzenia nowej aplikacji (wygląd okna może się różnić od powyższego); kliknąć OK

Złożone komponenty JSF wg

EJB 3.0 (Enterprise JavaBeans 3.0)

Podstawowe wykorzystanie Hibernate

Zagrożenia trywialne. Zagrożenia bezpieczeństwa aplikacji internetowych. Parametry ukryte. Modyfikowanie parametrów wywołania

Instrukcja 10 Laboratorium 13 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

Uniwersytet Łódzki Wydział Matematyki i Informatyki, Katedra Analizy Nieliniowej. Wstęp. Programowanie w Javie 2. mgr inż.

Instrukcja użytkownika

Podręcznik Użytkownika LSI WRPO

Podstawy wzorca MVC MODEL KON- TROLER WIDOK. Odpowiada za wyświetlenie danych użytkownikowi. Zawiera dane aplikacji oraz jej logikę.

OfficeObjects e-forms

6. Powtórz kroki z punktu 5. dla strony sorry.jsp, zmieniając jedynie treść wyświetlanego tekstu ( Niestety zamiast Witaj )

Wybrane działy Informatyki Stosowanej

Programowanie w języku Java. Wykład 13: Java Platform, Enterprise Edition (Java EE)

Programowanie CGI. Jolanta Bachan Informatyka

Warstwa integracji. wg. D.Alur, J.Crupi, D. Malks, Core J2EE. Wzorce projektowe.

Instrukcja obsługi aplikacji Karty Pojazdów dla Dealerów Samochodowych

Architektura bezpiecznych aplikacji internetowych na platformie Java Enterprise Edition. Jakub Grabowski Warszawa,

D:\DYDAKTYKA\ZAI_BIS\_Ćwiczenia_wzorce\04\04_poprawiony.doc 2009-lis-23, 17:44

Aplikacje Internetowe, Servlety, JSP i JDBC

PHP: bloki kodu, tablice, obiekty i formularze

Transkrypt:

173 Tworzenie aplikacji J2EE w technologii Struts

Plan prezentacji 174 Architektura MVC Wprowadzenie do Apache Struts Sterowanie w Apache Struts Komponenty Form Bean Zaawansowane elementy Struts

Architektura MVC 175

Architektura Model-View-Controller 176 Architektura MVC zakłada podział składników systemu aplikacyjnego na trzy kategorie: Model (komponenty modelu): komponenty reprezentujące dane, na których operują aplikacje; komponenty modelu oferują także metody dostępu do danych View (komponenty prezentacji): komponenty reprezentujące wizualizację (prezentację) danych dla użytkownika; komponenty prezentacji pobierają dane od komponentów modelu, a następnie wyświetlają je na ekranie użytkownika Controller (komponenty sterujące): komponenty przechwytujące żądania użytkowników i odwzorowujące je w wywołania metod komponentów modelu; następnie komponenty sterujące przekazują sterowanie do komponentów prezentacji

Uniwersalna architektura MVC 177 wykonuje Controller odświeża Model Model prezentuje View View informuje Dispatcher Servlet Controller żądanie Model Model odpowiedź View View

Architektura MVC dla J2EE 178 Widoki najczęściej implementowane jako JSP (JSP Model 2) Rolę kontrolera pełni serwlet Model oparty o JavaBeans, EJB, POJO, Business Components, itp. 1 Serwlet (Controller) 5 3 2 JSP (View) 4 Klasa zewnętrzna 4 (Model)

Wprowadzenie do Apache Struts 179

Czym jest Apache Struts? 180 Apache Struts to rozwijana na licencji open source powłoka kontrolna wykorzystująca standardowe technologie (serwlety, komponenty JavaBean, XML) i ułatwiająca tworzenie aplikacji webowych zgodnie z paradygmatem Model 2 MVC. W zależności od punktu widzenia: szkielet aplikacji MVC zbiór klas i interfejsów użytkowych zbiór bibliotek znaczników JSP

181 Bałagan na stronie http://struts.apache.org Struts Action Framework podstawowy szkielet aplikacyjny zgodny z modelem MVC (oryginalny projekt Struts), aktualna wersja stabilna to 1.2.8 Struts Shale Framework całkowicie nowy szkielet aplikacyjny zgodny z modelem MVC i ściśle zintegrowany z technologią Java Server Faces, projekt w fazie eksperymentalnej Struts Extensions EL, Extras, Flow, Struts-Faces, Struts-Taglibs, Scripting, Tiles Struts Titanium (Struts Ti) propozycja Struts Action Framework 2 wynikająca z włączenia Open Symphony WebWork do projektu Struts Struts Classics Struts 1.3 zostały podzielone na podprojekty, Struts Classics to ujednolicona dystrybucja Struts umożliwiająca tworzenie nowych podprojektów (Struts Action Framework Library?)

Zalety Struts 182 Scentralizowane zarządzanie na podstawie plików konfiguracyjnych praktycznie całość zarządzania przeniesiona do plików konfiguracyjnych XML, wysoka elastyczność aplikacji Komponenty Form Bean użyteczny mechanizm obsługi danych wejściowych przesyłanych z formularzy HTML Bogaty zestaw bibliotek znaczników do obsługi formularzy i komponentów JavaBean łatwość wyświetlania danych przechowywanych w komponentach JB Biblioteka znaczników HTML Automatyczna walidacja formularzy HTML

Wady Struts 183 Duży koszt rozpoczęcia pracy ze środowiskiem konieczność poznania obszernego API, długi czas uczenia się struktury aplikacji, duża inwestycja początkowa Niekompletna dokumentacja w porównaniu z innymi technikami Struts są źle udokumentowane, zasoby książkowe i on-line są niewystarczające Brak przejrzystości aplikacje Struts są trudne do zrozumienia, oceny i optymalizacji ze względu na dużą liczbę procesów i czynności odbywających się niewidocznie dla projektanta

Składniki Struts 184 Model reprezentuje stan aplikacji jako zbiór instancji komponentów JavaBean oraz zbiór akcji zmieniających stan aplikacji. W ramach modelu wyróżnia się dane wejściowe (dane wprowadzone przez użytkownika) i dane wyjściowe (odczytane przez komponenty modelu, być może na podstawie danych wejściowych). logika biznesowa aplikacji jako interakcje między komponentami JavaBean zawartymi w modelu, możliwe wykorzystanie szkieletów: Commons Chain of Responsibility Spring XWork dostęp do danych zewnętrznych realizowany za pomocą różnych technologii: Enterprise Java Beans Hibernate JDBC O/R Bridge

Składniki Struts 185 View najczęściej ta część aplikacji jest konstruowana za pomocą dokumentów JSP i standardowych znaczników umożliwiających interakcję z komponentami JavaBean przenoszącymi informacje, np. <jsp:usebean>. Możliwe wykorzystanie specjalizowanych bibliotek znaczników JSP, np. Struts Bean lub zaawansowanych technologii prezentacji, takich jak Cocoon, Velocity Templates, XSLT komponent View jest odpowiedzialny za obsługę wielojęzyczności, automatycznej walidacji formularzy, itp. Struts dostarcza gotowych rozszerzeń ułatwiających korzystanie z rozbudowanych technologii prezentacji: Struts Taglibs Struts Cocoon Velocity Struts Stxx for Struts

Składniki Struts 186 Controller podstawowym elementem Struts jest org.apache.struts.action.actionservlet który zarządza całą aplikacją na podstawie konfiguracji zapisanej w pliku struts-config.xml. Kontroler jest odpowiedzialny za: przetwarzanie żądań użytkowników określanie zamiarów użytkowników przeniesienie danych z Modelu do Widoku wybór właściwego Widoku i przekazanie go do użytkownika za pomocą odwzorowania ActionMapping parsowanie pliku konfiguracyjnego i inicjalizację aplikacji pozostałe elementy komponentu Controller to klasy org.apache.struts.action.action (sterujące przekazywaniem danych z formularzy do warstwy Model) i org.apache.struts.action.actionform (reprezentujące formularze HTML)

Sterowanie w Struts 187

Przepływ sterowania w Struts 188 request /form.jsp struts-config.xml <struts-config>... </struts-config> JSP xxx xxx xxx submit /form.do określ określ działanie execute() Action Action return warunek wybierz wybierz stronę stronęjsp JSP form forward wynik JSP

Przepływ sterowania w Struts 189 Użytkownik żąda formularza /form.jsp Użytkownik wypełnia formularz i wysyła go pod /form.do plik struts-config.xml odwzorowuje adres /form.do na odpowiednią klasę Action Metoda execute() klasy Action zostaje uruchomiona jednym z parametrów wywołania metody jest komponent FormBean, który jest automatycznie tworzony i którego składowe odpowiadają polom formularza klasa Action odczytuje dane wejściowe, łączy się z bazą danych i uruchamia logikę biznesową w celu odczytania danych wyjściowych, dane wyjściowe są umieszczane jako zbiór komponentów JavaBean w zasięgu żądania, sesji, lub aplikacji klasa Action wykorzystuje metodę mapping.findforward() do zwrócenia warunku, który jest odwzorowywany przez struts-config.xml na wynikową stronę JSP Sterowanie zostaje przekierowane do wybranej strony JSP

Prosty przykład aplikacji (1/16) Statyczny formularz HTML form.jsp <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/tr/html4/loose.dtd"> <%@ page contenttype="text/html;charset=windows-1252"%> <html> <head> <meta http-equiv="content-type" content="text/html; charset=windows-1252"></meta> <title>login form</title> </head> <body> <h1>login form</h1> <form action="/login.do"> <table cellspacing="1" cellpadding="5" border="0"> <tr><td>username</td><td><input type="text" name="username"/></td></tr> <tr><td>password</td><td><input type="password" name="password"/></td></tr> <tr><td colspan="2" align="center"> <input type="submit" value="send"/> <input type="reset" value="clear"/> </td> </tr> </table> </form> </body> </html> 190

Prosty przykład aplikacji (2/16) 191 Utworzenie pliku struts-config.xml struts-config.jsp <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"> <struts-config> <action-mappings> <action path="/login" type="pl.org.ploug.struts.loginaction"> <forward name="success" path="/success.jsp"/> </action> </action-mappings> <global-forwards> <forward name="success" path="/success.jsp"/> </global-forwards> </struts-config> warunek zwrócony przez metodę execute() klasy LoginAction

Prosty przykład aplikacji (3/16) 192 Przygotowanie klasy Action do której zostanie przesłana zawartość formularza package pl.org.ploug.struts; import javax.servlet.http.*; import org.apache.struts.action.*; LoginAction.java klasa musi być w pakiecie klasa musi rozszerzać klasę Action klasa musi przesłaniać metodę execute public class LoginAction extends Action { public ActionForward execute(actionmapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { return mapping.findforward("success"); } klasa zwraca warunek logiczny }

Prosty przykład aplikacji (4/16) 193 Przygotowanie wynikowego dokumentu JSP success.jsp <%@ page contenttype="text/html;charset=windows-1252"%> <html> <head> <meta http-equiv="content-type" content="text/html; charset=windows-1252"> <title>congratulations</title> </head> <body> <h1>congratulations!</h1> You have logged on successfully. </body> </html>

Przepływ sterowania w Struts 194 request /form.jsp struts-config.xml <struts-config>... </struts-config> JSP xxx xxx xxx submit /form.do określ określ działanie execute() Action Action return warunek wybierz wybierz stronę stronęjsp JSP form utworzenie komponentu JavaBean na podstawie danych wejściowych i przekazanie komponentu jako parametru metody execute(). Komponent rozszerza klasę ActionForm wynik forward wykorzystanie znacznika <bean:write> do wyświetlenia zawartości komponentu JSP

Prosty przykład aplikacji (5/16) 195 Modyfikacja pliku struts-config.xml struts-config.jsp <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"> <struts-config> <form-beans> <form-bean name="loginformbean" type="pl.org.ploug.struts"/> </form-beans> <action-mappings> <action path="/login" type="pl.org.ploug.struts.loginaction" name="loginformbean" scope="request"> <forward name="success" path="/success.jsp"/> </action> </action-mappings> </struts-config> request/session nazwa komponentu

Komponenty Form Bean 196

Konstrukcja komponentu Form Bean 197 Komponent Form Bean służy do reprezentacji danych wejściowych aplikacji. Komponent jest automatycznie wypełniany danymi wysłanymi z formularza i przekazywany do właściwej metody execute() Wymagania rozszerza klasę org.apache.struts.action.actionform posiada konstruktor bezargumentowy lub domyślny posiada zapisywalne składowe, których nazwy odpowiadają parametrom przesłanym z formularza, dla każdej składowej istnieje odpowiadająca jej metoda setter posiada metody getter dla wszystkich składowych które będą wyświetlane w wynikowych dokumentach JSP

Prosty przykład aplikacji (6/16) 198 Stworzenie komponentu Form Bean package pl.org.ploug.struts; import javax.servlet.http.*; import org.apache.struts.action.*; LoginFormBean.java klasa musi być w pakiecie klasa musi rozszerzać klasę ActionForm metody setter i getter public class LoginFormBean extends ActionForm { private String username = "scott"; private String password = "tiger"; public String getusername() { return this.username; } public void setusername(string username) { this.username = username; } } public String getpassword() { return this.password; } public void setpassword(string password) { this.password = password; }

199 Zasady tworzenia komponentów Form Bean Programista tworzący klasy dziedziczące z ActionForm powinien kierować się następującymi zaleceniami: jeśli klasa ActionForm jest umieszczona w zasięgu sesji, to należy koniecznie zaimplementować metodę reset(), klasy ActionForm nie muszą implementować żadnych metod, najczęściej zawierają tylko komplet metod dostępowych getter i setter dla składników formularza, klasy ActionForm umożliwiają walidację danych wejściowych, cechami formularza mogą być nie tylko pola tekstowe i listy, ale także przyciski, pola wyboru, pola radiowe, itp., klasa ActionForm powinna być postrzegana jako bufor między użytkownikiem i klasą Action, sprawdzenie poprawności danych i obecności wymaganych danych powinno się odbyć przed przekazaniem wartości do przetwarzania klasie Action.

Prosty przykład aplikacji (7/16) 200 Stworzenie komponentu reprezentującego dane biznesowe, klasa nie jest rejestrowana w struts-config.xml package pl.org.ploug.struts; public class UserDataBean { private String username = "scott"; private String password = "tiger"; klasa musi być w pakiecie UserDataBean.java } public UserDataBean(String username, String password) { this.username = username; this.password = password; // logika aplikacji, np. doczytanie informacji z bazy danych } metody setter i getter public String getusername() { return this.username; } public String getpassword() { return this.password; }

Prosty przykład aplikacji (8/16) 201 Modyfikacja klasy Action pobranie danych wejściowych z komponentu Form Bean przygotowanie komponentu biznesowego i umieszczenie go we właściwym zasięgu package pl.org.ploug.struts; import javax.servlet.http.*; import org.apache.struts.action.*; public class LoginAction extends Action { public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { LoginFormBean lfb = (LoginFormBean)form; String username = lfb.getusername(); String password = lfb.getpassword(); UserDataBean udb = new UserDataBean(username, password); request.setattribute("userdatabean", udb); LoginAction.java } } return mapping.findforward("success");

Prosty przykład aplikacji (9/16) 202 W wynikowym dokumencie JSP dostęp do składowych komponentu JavaBean przez znacznik <bean:write> success.jsp <%@ page contenttype="text/html;charset=windows-1252"%> <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %> <html> <head> <meta http-equiv="content-type" content="text/html; charset=windows-1252"> <title>congratulations</title> </head> <body> <h1>congratulations!</h1> You have logged on successfully <br> as <bean:write name="userdatabean" property="username"/> with password <bean:write name="userdatabean" property="password"/> </body> </html>

Prosty przykład aplikacji (10/16) 203 W wynikowym dokumencie JSP dostęp do składowych komponentu JavaBean przez język wyrażeń EL dostępny od JSP 2.0 (Tomcat 5.x, WebLogic 9) konieczne użycie wersji web.xml odpowiadającej Servlet API 2.4 brak odpowiednika <bean:message> w EL success.jsp <%@ page contenttype="text/html;charset=windows-1252"%> <html> <head> <meta http-equiv="content-type" content="text/html; charset=windows-1252"> <title>congratulations</title> </head> <body> <h1>congratulations!</h1> You have logged on successfully <br> as ${UserDataBean.username} with password ${UserDataBean.password} </body> </html>

Dynamiczne komponenty Form Bean 204 Jeśli komponent Form Bean służy tylko i wyłącznie do wczytania danych z formularza i standardowej walidacji, zamiast tradycyjnych komponentów Form Bean można wykorzystać dynamiczne komponenty Form Bean: dynamiczny komponent nie wymaga oprogramowania klasy Java, definicja komponentu jest w całości umieszczona w pliku struts-config.xml, dynamiczne komponenty to instancje klasy org.apache.struts.action.dynaactionform, można tworzyć hierarchię klas w oparciu o klasę DynaActionForm, ale nie można w klasie umieszczać jednocześnie cech tradycyjnych i dynamicznych (czyli można specjalizować metody validate() i reset()), DynaActionForm podlega automatycznej walidacji jeśli rozszerza org.apache.struts.action.validatoractionform. dostęp do cech klasy z wyrażeń EL: ${beanname.map.property}

Przykład DynaActionForm 205 struts-config.jsp... <struts-config> <form-beans> <form-bean name="loginformbean" type="pl.org.ploug.struts"/> <form-bean name="dynaloginformbean" type="org.apache.struts.action.dynaactionform"> <form-property name="username" type="java.lang.string" initial="scott"/> <form-property name="password" type="java.lang.string" initial="tiger"/> </form-bean> </form-beans>... </struts-config> LoginAction.java... public class LoginAction extends Action { public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {... } DynaActionForm lfb = (DynaActionForm)form; String username = (String)lfb.get("username"); String password = (String)lfb.get("password"); rzutowanie niezbędne gdyż DynaActionForm przechowuje mapę składowych w postaci obiektów klasy Object

Leniwe komponenty Form Bean 206 Leniwy programista może poniechać definiowania komponentu Form Bean w pliku struts-config.xml i wykorzystać klasę org.apache.commons.beanutils.lazydynabean: komponent LazyDynaBean jest automatycznie wypełniany wszystkimi parametrami przesłanymi z formularza, składowe komponentu LazyDynaBean mogą być dodawane i usuwane za pomocą metod get() set() i remove(), jeśli komponent posiada indeksowane składowe (List, Array) to są one automatycznie rozszerzane wg potrzeby, składowe komponentu będące listami, tablicami, mapami i zagnieżdżonymi komponentami Java Bean są automatycznie tworzone.

Zaawansowane elementy Struts 207

Zbiory zasobów 208 Mechanizm zbiorów zasobów (resource bundles) umożliwia scentralizowane zarządzanie zasobami tekstowymi (tytuły stron, etykiety pól, łącza, komunikaty o błędach) i łatwą obsługę wielojęzyczności. Zbiory zasobów to pliki tekstowe zawierające mapę z kluczami i wartościami komunikatów. Pliki zasobów muszą być zarejestrowane w struts-config.xml ApplicationResources.properties form.title = Success form.confirmation = Congratulations! form.message = You have logged on successfully struts-config.jsp <struts-config>... <message-resources parameter="pl.org.ploug.struts.applicationresources"/> </struts-config>

Prosty przykład aplikacji (11/16) 209 Wykorzystanie komunikatów ze zbioru zasobów za pomocą znacznika <bean:message> success.jsp <%@ page contenttype="text/html;charset=windows-1252"%> <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %> <html> <head> <meta http-equiv="content-type" content="text/html; charset=windows-1252"> <title><bean:message key="form.title"/></title> </head> <body> <h1><bean:message key="form.confirmation"/></h1> <bean:message key="form.message"/><br> as <bean:write name="userdatabean" property="username"/> with password <bean:write name="userdatabean" property="password"/> </body> </html>

Wielojęzyczność 210 Wykorzystanie plików ze zbiorami zasobów pozwala na łatwą obsługę wielojęzyczności odwołanie <message-resources parameter="somefile"/> dotyczy w rzeczywistości pliku /WEB-INF/classes/someFile.properties na podstawie ustawień przeglądarki określany jest preferowany język Struts poszukuje lokalizowanych zbiorów komunikatów, np. /WEB-INF/classes/someFile_pl.properties znalezione wpisy lokalizowane nadpisują klucze domyślne zmiana lokalizacji może nastąpić programowo w klasie Action przez wywołanie metody setlocale()

Prosty przykład aplikacji (12/16) 211 Przygotowanie pliku z polską lokalizacją komunikatów ApplicationResources_pl.properties form.title = Sukces form.confirmation = Gratulujemy! form.message = Zalogowanie jest poprawnie Konfiguracja przeglądarki Firefox: Tools, Options, Languages IE: Tools, Internet Options, Languages

Przepływ sterowania w Struts wykorzystanie znacznika <html:form> do budowy formularza wejściowego request /form.jsp struts-config.xml <struts-config>... </struts-config> 212 JSP xxx xxx xxx submit /form.do określ określ działanie execute() Action Action return warunek wybierz wybierz stronę stronęjsp JSP form forward wynik JSP

Prosty przykład aplikacji (13/16) Formularz HTML zbudowany przy pomocy znacznika <html:form> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/tr/html4/loose.dtd"> <%@ page contenttype="text/html;charset=windows-1252"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%> <html> <head> <meta http-equiv="content-type" content="text/html; charset=windows-1252"></meta> <title>login form</title> </head> <body> <h1>login form</h1> <html:form action="/login"> <table cellspacing="1" cellpadding="5" border="0"> <tr><td>username</td><td><html:text name="username"/></td></tr> <tr><td>password</td><td><html:password name="password"/></td></tr> <tr><td colspan="2" align="center"> <html:submit value="send"/> <html:reset value="clear"/> </td> </tr> </table> </html:form> </body> </html> form.jsp przedrostek z nazwą aplikacji jest dołączany automatycznie, podobnie jak przyrostek.do domyślnie formularz wysyłany metodą POST 213

Wykorzystanie <html:form> 214 Znacznik <html:form> pozwala na: związanie formularza HTML z komponentem Form Bean, zachowanie pełnej synchronizacji między nazwami parametrów wejściowych i składowymi komponentu Form Bean, inicjalizację wartości pól formularza przez aplikację. Wartość atrybutu action znacznika <html:form> musi być zarejestrowana w pliku struts-config.xml, na tej podstawie identyfikowany jest właściwy komponent Form Bean obsługujący dany formularz.

Ponowne wyświetlenie formularza 215 W przypadku wprowadzenia niekompletnych lub niepoprawnych danych formularz może być łatwo wyświetlony powtórnie z zachowaniem wcześniej wprowadzonych pól: przekierowanie warunku w struts-config.xml na formularz wysłanie przekierowania do przeglądarki do komponentu Form Bean można dodać składowe służące do informowania użytkownika o popełnionych błędach. Zawartości składowych można odczytywać standardowo przez <bean:write> lub wyrażenia EL.

Prosty przykład aplikacji (14/16) 216 Modyfikacja pliku struts-config.xml struts-config.jsp <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"> <struts-config> <form-beans> <form-bean name="loginformbean" type="pl.org.ploug.struts"/> </form-beans> <action-mappings> <action path="/login" type="pl.org.ploug.struts.loginaction" name="loginformbean" scope="session"> <forward name="success" path="/success.jsp"/> <forward name="missing" path="/form.jsp" redirect="true"/> </action> </action-mappings> </struts-config> warunek reprezentuje odwzorowanie na stronę z formularzem HTML zachowanie URL

Walidacja danych z formularza 217 Etapy przetwarzania na których możliwa jest walidacja: klasa Action: pełen dostęp do logiki biznesowej, źródeł danych, walidacja podobnych danych musi być powtarzana niezależnie w każdej klasie Action, odwzorowanie wyniku walidacji na właściwą stronę JSP odbywa się ręcznie, reguły walidacji muszą być ręcznie oprogramowane klasa ActionForm: możliwa manipulacja wartościami składowych na poziomie poszczególnych metod setter, metoda validate() umożliwia ponowne wyświetlenie formularza i jest wspólna dla wszystkich sposobów wykorzystania komponentu Form Bean, reguły walidacji muszą być ręcznie oprogramowane automatyczny walidator: Struts oferuje mechanizm automatycznej walidacji podstawowych danych przy wykorzystaniu JavaScript

Przepływ sterowania w Struts 218 request /form.jsp struts-config.xml <struts-config>... </struts-config> JSP xxx xxx xxx submit /form.do określ określ działanie execute() Action Action return warunek wybierz wybierz stronę stronęjsp JSP form uruchom metodę validate(), jeśli wynik działania nie jest pusty to przesteruj do formularza, w przeciwnym wypadku wywołaj metodę execute() wynik forward JSP

Prosty przykład aplikacji (15/16) 219 Dodanie metody validate() do komponentu Form Bean package pl.org.ploug.struts; LoginFormBean.java import javax.servlet.http.*; import org.apache.struts.action.*; public class LoginFormBean extends ActionForm {... public ActionErrors validate(actionmapping mapping, HttpServletRequest req) { ActionErrors errors = new ActionErrors(); }... if (this.getemail() == null) { errors.add("email", new ActionError("email.required")); } if (this.getpassword() == null) { errors.add("password", new ActionError("password.required")); } return (errors);

Prosty przykład aplikacji (16/16) 220 Dodanie pliku z komunikatami o błędach i rejestracja pliku w struts-config.xml, wyświetlenie komunikatów za pomocą znacznika <html:errors/> errors.header=<ul> errors.prefix=<li><b><font COLOR="RED"> errors.suffix=</font></b></li> errors.footer=</ul>... ApplicationResources.properties... struts-config.jsp <action-mappings> <action path="/login" type="pl.org.ploug.struts.loginaction" name="loginformbean" scope="session" input="form.jsp"> <forward name="success" path="/success.jsp"/> <forward name="missing" path="/form.jsp" redirect="true"/> </action> </action-mappings> </struts-config> <body> <h1>login form</h1> <html:errors/> <html:form action="/login">... </html:form> </body> form.jsp

Automatyczna walidacja formularza 221 Automatyczna walidacja ujednolica kod służący do sprawdzania poprawności danych wejściowych i umożliwia korzystanie ze standardowych reguł walidacji. Walidacja po stronie klienta kod JavaScript weryfikuje poprawność wprowadzonych danych, błędy sygnalizowane oknami dialogowymi, wysłanie formularza wstrzymane do momentu poprawienia błędów walidacja nie może implementować złożonej logiki i może zostać wyłączona (celowo bądź przypadkowo) Walidacja po stronie serwera kod Java weryfikuje poprawność wprowadzonych danych, w przypadku błędów formularz jest ponownie wyświetlony, tryb walidacji po stronie serwera jest obowiązkowy

Automatyczna walidacja (1/4) 222 Zmiany w pliku konfiguracyjnym struts-config.xml włączenie automatycznego walidatora struts-config.jsp... <form-beans> <form-bean name="loginformbean" type="pl.org.ploug.struts"/> </form-beans> <action-mappings> <action path="/login" type="pl.org.ploug.struts.loginaction" name="loginformbean" scope="session" input="form.jsp"> <forward name="success" path="/success.jsp"/> </action> </action-mappings> <message-resources parameter="messageresources"/> <plug-in classname="org.apache.struts.validator.validatorplugin"> <set-property property="pathnames" value="/web-inf/validator-rules.xml,/web-inf/validation.xml"/> </plug-in> </struts-config>

Automatyczna walidacja (2/4) 223 Przygotowanie pliku z komunikatami wykorzystywanymi przez automatyczny walidator # -- standardowe wyświetlanie błędów -- errors.header=<ul> errors.prefix=<li><b><font COLOR="RED"> errors.suffix=</font></b></li> errors.footer=</ul> MessageResources.properties # -- komunikaty walidatora -- errors.invalid={0} is invalid. errors.maxlength={0} cannot be greater than {1} characters. errors.minlength={0} cannot be less than {1} characters. errors.range={0} is not in the range {1} through {2}. errors.required={0} is required. komunikaty o błędach mogą być parametryzowane

Automatyczna walidacja (3/4) 224 Przygotowanie definicji reguł walidacji <form-validation> <global> <constant> <constant-name>postalcode</constant-name> <constant-value>^\d{5}\d*$</constant-value> </constant> </global> <formset> <form name="loginformbean"> <field property="username" depends="required"> <arg0 key="loginformbean.username"/> </field> <field property="password" depends="required,mask"> <arg0 key="loginformbean.password"/> <var> <var-name>mask</var-name> <var-value>^[0-9a-za-z]*$</var-value> </var> </field> </form> </formset> </form-validation> validator.xml globalny format kodu pocztowego nazwa reguły z validator-rules.xml parametr komunikatu o błędzie

Automatyczna walidacja (4/4) 225 Zmiana definicji komponentu Form Bean dziedziczy z org.apache.struts.validator.validatorform package pl.org.ploug.struts; import javax.servlet.http.*; import org.apache.struts.action.*; LoginFormBean.java klasa musi rozszerzać klasę ValidatorForm public class LoginFormBean extends ValidatorForm { private String username = "scott"; private String password = "tiger"; public String getusername() { return this.username; } public void setusername(string username) { this.username = username; } } public String getpassword() { return this.password; } public void setpassword(string password) { this.password = password; }

Automatyczny walidator - możliwości 226 Automatyczny walidator umożliwia weryfikację poprawności formatu wielu typów danych mask intrange, floatrange, doublerange, maxlength, minlength integer, float, double, long, short, byte date email creditcard url... Spis reguł można znaleźć w pliku validator-rules.xml

Obsługa wyjątków 227 Struts umożliwia scentralizowanie obsługi typowych wyjątków występujących w aplikacji. W tym celu programista musi stworzyć klasę obsługi wyjątku która rozszerza klasę org.apache.struts.action.exceptionhandler, a następnie zadeklarować klasę obsługi wyjątku w struts-config.xml IOExceptionHandler.java... public class IOExceptionHandler extends ExceptionHandler { public ActionForward execute( Exception e, ExceptionConfig ec, ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { // tutaj obsługa wyjątku return mapping.findforward("after-error"); } } struts-config.jsp... <global-exceptions> <exception key="exception.any" type="java.io.ioexception" handler="pl.org.ploug.struts.ioexceptionhandler"/> </global-exceptions>...

Struts w JDeveloper 10.1.3 228