La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache.

Copie: 1
Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache.

Presentazioni simili


Presentazione sul tema: "Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache."— Transcript della presentazione:

1 Struts

2 Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache Jakarta ma ora è divenuto un progetto a sé. Struts estende le Java Servlet, aiutando all'utilizzo del pattern Model-View-Controller Ideatoda Craig McClanahan donato alla Apache Software Foundation nel maggio del 2000.

3 Struts Framework (infrastruttura) è una struttura di supporto su cui un software può essere organizzato e progettato. Ha le seguenti caratteristiche Risparmiare allo sviluppatore la riscrittura di codice già steso in precedenza per compiti simili Si estendono le classi del framerwork e/o se ne implementano le interfacce; sono i componenti del framework che hanno la responsabilità di controllare il flusso elaborativo. sono le classi del framework che invocano il nostro codice applicativo e non viceversa come nel caso delle librerie di classi Utilizza i design pattern Una libreria contiene funzioni o routine (metodi) che lapplicazione può invocare Framework fornisce componenti generici che collaborano tra loro che possono essere estesi (punti di estensione) per fornire nuove funzionalità

4 Vantaggi di un framework 1. Disegno architetturale Un framework è fondato su un disegno architetturale valido, in quanto il suo codice è scritto in base alle best- practices della tecnologia in uso. 2. Riduzione dei tempi di progetto Lo sviluppatore deve implementare esclusivamente la logica applicativa potendo risparmiare le energie e il tempo necessari alla scrittura di componenti infrastrutturali. Semplificazione dello sviluppo Semplifica lo sviluppo applicativo perché fornisce tutta una serie di componenti che risolvono la gran parte dei compiti comuni a tutte le applicazioni web J2EE (controllo del flusso, logging, gestione messaggi di errore, custom tags per la presentation logic, internazionalizzazione, validazione dei dati, etc..)

5 Scelta del Framework 1. Maturità del progetto Sconsigliabile adottare un framework che sia in una fase iniziale di sviluppo e che sia poco adottato nella comunità degli sviluppatori e quindi poco testato sul campo in progetti reali. 2. Documentazione Verificare che la documentazione sia ricca e ben fatta. Questo facilita la risoluzione dei problemi che si incontrano nella realizzazione dell'applicazione e la comprensione del suo funzionamento. 3. Validità del disegno architetturale Verificare che sia disegnato correttamente e quindi che siano adottati i design-pattern e le best-practises della tecnologia di riferimento. Adozione degli standard Un framework deve essere fondato sui componenti standard della tecnologia di riferimento. Evitare framework conuso di specifici tool di sviluppo o un modello troppo indirizzato ad uno specifico caso applicativo Estensibilità Deve essere possibile estenderne le funzionalità per adattarlo alle alle proprie esigenze.

6 Web application: Modello 1 Browser Web / Servlet Container JSP Java Beans Richiesta dellutente Risposta del sistema DBDB

7 Pattern Model-View-Controller Controller Business Model Utente AzioneModifica stato View Scelta rappresentazione dello stato Notifica variazione dello stato

8 Web application: Modello 2 Browser Web / Servlet Container JSP Richiesta Risposta Servlet dispatch Business Model

9 Struts e Modello 2 Client Web / Servlet Container view Richiesta Risposta Servlet dispatch Business Model Servlet Struts Extension point

10 I componenti di Struts ActionServlet: servlet di controllo che gestisce tutte le richieste dell'applicazione; estende la classe javax.servlet.http.HttppServlet e quindi implementa tutti i metodi di lifecycle, incluso init(), doGet(), doPost() ed il destroy. struts-config.xml: cuore di tutta l'applicazione. In tale file XML si vanno a settare ed a definire i vari elementi della nostra applicazione e le loro associazioni. Tale file viene letto in fase di start-up dell'applicazione dalla ActionServlet. Action: Le Action sono le classi alle quali le ActionServlet delega l'elaborazione della richiesta. ActionMapping: Contiene gli oggetti associati ad una Action nello struts-config come ad esempio gli ActionForward. ActionForm: Sono dei veri contenitori di dati. Fanno riferimento ad uno specifico form e vengono popolati automaticamente dal framework con i dati contenuti nella request http. ActionForward: Contengono i path ai quali la servlet di Struts inoltra il flusso in base alla logica dell'applicazione. Custom-tags: Sono tag particolari forniti dal framework Struts per assolvere a molti dei più comuni compiti delle pagine JSP.

11

12 Caratteristiche di Struts 1. DP FrontController :Esiste una sola servlet di controllo centralizzata e tutte le richieste sono mappate sulla ActionServlet nel web.xml dell'applicazione. Unico punto di gestione del flusso applicativo permette di implementare in modo univoco e centralizzato funzioni quali sicurezza, logging, filtri etc. 2. I livelli logici dell'applicazione sono disaccoppiati. Le viste dell'applicazione non contengono al loro interno il riferimento al flusso dell'applicazione e non contengono logica applicativa. 3. Le viste sono mappate con nomi logici definiti nel file di configurazione struts-config.xml. Nel codice Java non è presente alcun riferimento a nomi di pagine JSP il che rende molto più semplice variare il flusso applicativo. 4. Configurazione dell'applicazione in un file XML: consente di modificare le associazioni tra le richieste http e le classi ad essa associate in modo molto semplice.

13 Controller e Model in Struts Struts è un framework model-neutral, ovvero che implementa esclusivamente i livelli di controller e view. E possibile realizzare il livello di business logic in base alle proprie scelte con semplici classi Java DAO (quindi implementando la logica applicativa nel web-container) ricorrendo agli EJB quindi sfruttando i servizi del EJB- container

14 ActionServlet e RequestProcessor org.apache.struts.action.ActionServlet è la servlet di controllo di Struts: gestisce tutte le richieste http che provengono dai client e indirizza il flusso applicativo in base alla configurazione presente nel file XML struts-config.xml. estende la javax.servlet.http.HttpServlet; i suoi metodi doGet() e doPost() chiamano entrambi un metodo process() La ActionServlet esegue l'elaborazione che prevede: 1. I metodi doGet() e doPost() invocano il metodo process() della ActionServlet 2. Nel process() la ActionServlet ottiene l'istanza del RequestProcessor, configurato per l'applicazione nel tag dello struts.config.xml, e ne esegue il metodo process(). 3. Nel metodo process() del RequestProcessor viene eseguita l'elaborazione vera e propria, ed in output al metodo viene fornito un oggetto ActionForward che consente alla ActionServlet di inoltrare l'elaborazione in base alla configurazione presente nello struts-config.xml.

15 ActionServlet e RequestProcessor action org.apache.struts.action.ActionServlet config /WEB-INF/struts-config.xml debug 2 1 action *. do

16 ActionServlet e RequestProcessor la org.apache.struts.action.RequestProcessor è la classe alla quale la ActionServlet delega l'elaborazione delle richieste. RequestProcessor viene configurato mediante il tag dello struts-config.xml E possibile utilizzarne uno proprio scrivendo una classe che estende la org.apache.struts.action.RequestProcessor e ne implementa i metodi Di uso comune fare l'override del metodo processPreprocess() che viene eseguito dal RequestProcessor prima dell'elaborazione di ogni richiesta. Punto ottimale per inserire controlli di validità della sessione, dell'utente o simili.

17 ActionServlet e RequestProcessor Il RequestProcessor esegue i seguenti step: 1. Legge il file struts-config.xml per trovate un un elemento XML corrispondente al path della richiesta. 2. Trovato l'elemento verifica se è presente l'attributo name che corrisponde al nome dell'ActionForm. Reperire una istanza dell'ActionForm e ne popola gli attributi con i valori presenti nella request http, facendo una corrispondenza tra nome parametro e nome attributo. 3. Se nell'elemento è presente l'attributo validate al valore true chiama il metodo validate() dell'ActionForm per il controllo dei dati forniti dalla request. 4. Se il controllo è ok a questo punto il RequestProcessor chiama il metodo execute() dell'Action configurata nell'elemento delegandole l'elaborazione della richiesta. 5. Il metodo execute() dell'Action al termine dell'elaborazione restituisce un oggetto ActionForward che consente al RequestProcessor di inoltrare il flusso elaborativo.

18 Struts-config

19 Classe Action La classe Action :creare una propria classe che la estende e ne implementa il metodo execute() public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception{ Il metodo execute() riceve in input request e response http, un'istanzadell'oggetto ActionForm prima descritto, e un oggetto ActionMapping che contiene le infornazioni configurate nell'elemento tra le quali i forward, ovvero i percorsi a cui inoltrare in uscita l'elaborazione. Restituisce un oggetto ActionForward che contiene il path di inoltro dell'elaborazione.

20 Classe Action Le Action costituiscono il 'ponte' applicativo tra lo strato di Controller e di Model di un aapplicazione scritta con Struts Le Action vengono gestite come delle servlet logica multithread delle servlet codice scritto nelle Action deve essere thread-safe per un corretto funzionamento delle stesse. Le Action fanno parte del Controller e non del Model. La logica applicativa non deve essere scritta nella Action, ma questa deve delegare allo strato di Model l'elaborazione della business-logic.

21 Classe Action Compiti della Action Acquisire i dati della request dal form Delegare l'elaborazione della business-logic alle classi del Model Acquisire i risultati dell'elaborazione e prepararli per la vista da inviare all'utente mettendoli nello scope opportuno (se necessario). Inoltrare il flusso elaborativo in base alla logica applicativa.

22 Classi Action Pronte ForwardAction quando è necessario fare il forward da una pagina jsp a unaltra senza bisogno di passare per unAction

23 Classi Action Pronte DispatchAction consentire che risiedano su una singola classe operazioni multiple

24 Classi Action Pronte LookupDispatchAction consentire di invocare metodi multipli invocati sulla base del valore di uno speciale parametro di request indicato nel file di configurazione. Viene fatto poi un reverseLookup sul resourse bundle. Occorre creare una classe che estenda LookupDispatchAction e implementi il metodo getKeyMethodMap() Protected Map getKeyMethodMap() {Map map= new HashMap(); map.put(button.checkout,checkout); map.put(button.saveorder, saveorder);} Nel resource bundle si ha: button.checkout= Checkout button.saveorder= Save Order

25 Classi Action pronte

26 ActionForm org.apache.struts.action.ActionForm. I form (come sono chiamate nella terminologia Struts le classi che estendono la org.apache.struts.action.ActionForm) sono sostanzialmente dei bean contenenti dati, che il framework popola automaticamente con i dati della request svincolando lo sviluppatore dal doverlo fare con proprio codice applicativo la struttura è esattamente quella di un JavaBean a parte l'estensione della classe ActionForm hanno attributi privati e corrispondenti metodi get e set pubblici. due metodi particolari: reset() e validate()

27 ActionForm public ActionErrors validate(ActionMappings mapping,HttpServletRequest request) Il tipo di ritorno del metodo è un oggetto della classe ActionErrors che è un contenitore di oggetti della classe org.apache.struts.action.ActionError Ogni oggetto della classe ActionError rappresenta un errore verificatosi nella validazione dei dati Con un opportuno custom tag ( ) posto nella pagina stessa sarà possibile visualizzare i messaggi di errore associati agli errori verificatisi senza scrittura di codice aggiuntivo. Il messaggio di errore viene reperito automaticamente dal framework dal resouce bundle dell'applicazione ActionErrors errors = new ActionErrors(); if ((username == null) || (username.length() < 1)) errors.add ("username",new ActionError("errore.username.obbligatorio")); return errors; }

28 Sezioni global

29 Librerie custom-tag 1. html Tag per la generazione di form HTML che interagiscono con gli ActionForm e degli altri elementi HTML di una pagina JSP 2. bean Tag usati per accedere a proprietà di JavaBeans e per creare istanze di bean 3. logic Tag usati per logica condizionale, iterazioni e controllo di flusso 4. Template 5. nested Tag che estendono le funzionalità dei tag base

30 Librerie di tag Username: Password: Nella libreria logic esistono numerosi tag per eseguire logica condizionale quali ed altri., tag per eseguire iterazioni su array e collection quali, e tag per eseguire controllo di flusso come il. Nella libreria bean sono presenti tag per la definizione di variabili di scripting utilizzabili all'interno della pagina quali, tag per la scrittura in output del valore di attributi di un e così via.

31 Gestione delle eccezioni I due approcci possibili nella gestione delle situazioni di eccezione, così come nella gestione di molte altre problematiche sono quello programmatico e quello dichiarativo. l'approccio programmatico consiste nello scrivere all'interno della propria applicazione codice specifico per la gestione di una determinata problematica l'approccio dichiarativo consiste nel configurare all'esterno dell'applicazione le modalità di gestione del problema stesso

32 Gestione delle eccezioni Una Action contenente gestione programmatica delle eccezioni potrebbe avere un aspetto simile: try{ //codice che può generare eccezioni } catch(Exception e){ ActionErrors errors = new ActionErrors(); erorrs.add("eccezione", new ActionErorrs("eccezione")); saveErrors(request,errors); return mapping.findForward("eccezione"); } costringe comunque lo sviluppatore a scrivere codice ad hoc, spesso ridondante, per gestire queste situazioni. Se si vuole modificare il comportamento dell'applicazione al verificarsi di una eccezione è necessario intervenire nel codice.

33 Gestione delle eccezioni Più elegante ed efficiente sfruttare la possibilità offerta da Struts di gestire in modo dichiarativo le eccezioni nel file XML di configurazione struts-config.xml, è possibile descrivere mediante opportune sezioni XML il comportamento che l'applicazione deve avere a fronte di una particolare eccezione può essere fatta a livello di singola Action o a livello globale per tutta l'applicazione. Per configurare la gestione a livello di singola action si utilizza il tag all'interno della configurazione della Action stessa.

34 Gestione delle eccezioni Nel tag si dichiara la classe dell'eccezione da gestire, la risorsa a cui verrà inoltrato il flusso elaborativo ed una chiave per acquisire dal resource bundle dell'applicazione un messaggio di errore

35 Gestione delle eccezioni E' anche possibile definire un comportamento globale utilizzando il tag. In tal caso si presuppone la definizione di una o più classi handler per le eccezioni da gestire, ovvero delle classi che estendono org.apache.struts.action.ExceptionHandler ed il cui metodo execute() viene eseguito dal framework al verificarsi della corrispondente eccezione.

36 Gestione delle eccezioni it.esempi.ExceptionHandler, che estende org.apache.struts.action.ExceptionHandler, gestisce le eccezioni di tipo it.esempi.MiaException al verificarsi di una eccezione di questo tipo il framework manderà in esecuzione il metodo execute() della classe handler così dichiarata. In questo metodo in genere è opportuno inserire del codice per effettuare il log dell'eccezione, memorizzando tutte le informazioni utili alla comprensione del problema che la ha generata, quali il messaggio associato all'eccezione, lo stack-trace etc. Il metodo restituisce in output un oggetto della classe ActionForward che consente di effettuare il forward alla risorsa desiderata

37 Gestione delle eccezioni Suggerimenti pratici preferibile dichiarare delle global exceptions almeno per quelle eccezioni comuni a tutte le Action, lasciando alla dichiarazione della singola Action solo i casi particolari di eccezioni possibili solo in quel contesto Se non è necessaria una gestione estremamente particolareggiata è possibile dichiarare una classe handler per la java.lang.Exception che gestirà quindi in maniera centralizzata tutte le possibili eccezioni.

38 Gestione delle eccezioni casi in cui non è possibile non inserire blocchi try/catch all'interno del codice. Basti pensare al caso di codice che esegue in modo programmatico una transazione su un database e che necessita di gestire le situazioni di eccezione per effettuare correttamente il commit o il rollback della transazione stessa. In tal caso lo sviluppatore è obbligato ad inserire uno o più blocchi catch al cui interno eseguire l'operazione di rollback per annullare la transazione corrente.

39 Validator di struts Validazione dei dati immessi in un form HTML metodo validate() della classe org.apache.struts.action. ActionForm costituisce il punto nel quale vengono effettuati i controlli lato server sui dati immessi Problemi: codice di validazione è spesso duplicato cambiamento delle regole di validazione implica una modifica ai sorgenti.

40 Validator di Struts Validator è un framework che fornisce gli strumenti per effettuare in modo automatico e dichiarativo i controlli formali sui campi digitati in un form HTML. Il Validator costituito da un insieme di classi predisposte per eseguire tutti i più comuni controlli di validazione in genere usati nelle applicazione possibile di creare routine di validazione non fornite dal Validator supporta sia la validazione server-side che quella client- side mediante opportune funzioni JavaScript, non fornita dal meccanismo standard degli ActionForm di Struts.

41 Validator di Struts Nel file validator-rules.xml vengono dichiarate tutte le routine di validazione disponibili, i loro nomi logici e il codice JavaScript corrispondente a ciascuna routine di validazione per l'esecuzione dei controlli client-side Nel file validation.xml si specifica come queste routine vengano applicate ai vari campi di input dei form dell'applicazione, ai quali si fa riferimento mediante i nomi dei form beans dichiarati nello struts-config.xml step: 1. Abilitare il Validator plug-in 2. Configurare i due file XML appena citati, validator-rules.xml e validation.xml 3. Creare form bean che estendano gli ActionForm del Validator.

42 Validator di Struts Il Validator viene configurato come un plug-in di Struts. Per abilitare il Validator bisogna aggiungere nello struts- config.xml le seguenti righe; In questo modo Struts all'avvio dell'applicazione carica e inizializza il Validator; si può notare come vengano definiti i percorsi dei due file XML di configurazione del Validator.

43 Validator di Struts Sono già presenti gran parte delle comuni esigenze per ciò che riguarda i controlli formali da eseguire sui campi di input di un form

44 Validator di Struts Come già accennato per utilizzare il Validator i form bean dell'applicazione non devono estendere la classe ActionForm standard di Struts ma la classe org.apache.struts.validator.ValidatorForm che fornisce l'implementazione del metodo validate(). In questo caso non è più necessario scrivere il codice di validazione perché è il Validator che lo fa per noi; non bisogna implementare neanche il reset() public class LogonForm extends ValidatorForm {…

45 Validator di Struts Il nome dato al form bean nello struts-config.xml è usato nel validation.xml per far riferimento al form in questione. Il validation.xml viene usato per dichiarare i controlli che verranno effettuati sui campi di input di un form dell'applicazione

46 Validator di Struts Per i messaggi di errore associati a ciascuna routine di validazione il Validator utilizza il file ApplicationResource.properties di Struts. In questo file vengono definiti i messaggi di errore associati a ciascun criterio di validazione definito nel validator-rules.xml : errors.required={0} is required errors.minlength={0} cannot be less than {1} characters.

47 Validator di Struts Il Validator foirnisce anche il supporto alla validazione client-side dei form dell'applicazione. Le funzioni JavaSctipt associate ai diversi criteri di validazione sono definite nel file validator-rules.xml come già visto. Per abilitare la validazione client-side è sufficiente inserire nelle pagine JSP dell'applicazione il seguente tag: Nel nostro caso genererà la funzione validateLogonForm() che effettuerà la validazione del form purchè la si colleghi al submit dello stesso come segue: Chiaramente il submit del form non avverrà se i controlli sui campi non hanno successo

48 Esempio di validazione name="minlength" resource="false" /> minlength 5 Nel resource bundle errors.minlength={0} non può essere meno di {1} caratteri. #{0} fa riferimento ad arg0 mentre {1} ad arg1

49 Regole già presenti nel validator required: controlla se il campo non è vuoto validwhen: il campo è valido quando la condizione specificata si verifica minlength: il campo deve avere minimo un certo numero di caratteri maxlength: il campo deve avere massimo un certo numero di caratteri mask: il campo deve contenere certi tipi di caratteri byte: vede se il valore del campo è un byte short: vede se il valore del campo è uno short integer: vede se il valore del campo è un intero long: vede se il valore del campo è un long float: vede se il valore del campo è un float double: vede se il valore del campo è un double date: vede se il valore del campo è una data vede se il campo è un indirizzo mail url: vede se il campo è un url

50 Creazione di una propria regola di validazione Creare una classe che contenga i metodi di validazione del tipo public static boolean validateXXX (Object,org.apache.commons.validator.ValidatorAction, org.apache.commons.validator.Field, org.apache.struts.action.ActionMessages, org.apache.commons.validator.Validator, javax.servlet.http.HttpServletRequest)

51 Esempio di regola di validazione public class MyValidator implements Serializable { public static boolean validateDistretto(Object bean, ValidatorAction va, Field field, ActionMessages errors,Validator vl, HttpServletRequest request) { String value = null; if((field.getProperty()!=null)&&(field.getProperty().length()>0)) { value = ValidatorUtils.getValueAsString(bean, field.getProperty()); if((value.equals(""))||(value.equals("0"))) { errors.add(field.getKey(), Resources.getActionMessage(request, va, field)); } return errors.isEmpty(); }

52 Struts Tag Library Sono HTML (ex Form) BEAN LOGIC TEMPLATE NESTED

53 Struts Tag Library Modalità di accesso alle proprietà del bean Proprietà semplici user.address Proprietà annidate user.address.city Proprietà indicizzate user.address[2]

54 Struts tag library HTML esempi crea il tag html base che punte alla colocazione della pagina assoluta che lo contiene per gestiere poi src e simili

55 Struts tag library

56 Struts tag library

57 empty Evaluate the nested body content of this tag if the requested variable is either null or an empty string. equal Evaluate the nested body content of this tag if the requested variable is equal to the specified value. forward Forward control to the page specified by the specified ActionForward entry. greaterEqual Evaluate the nested body content of this tag if the requested variable is greater than or equal to the specified value. greaterThan Evaluate the nested body content of this tag if the requested variable is greater than the specified value. iterate Repeat the nested body content of this tag over a specified collection. lessEqual Evaluate the nested body content of this tag if the requested variable is less than or equal to the specified value. lessThan Evaluate the nested body content of this tag if the requested variable is less than the specified value.

58 match Evaluate the nested body content of this tag if the specified value is an appropriate substring of the requested variable. messagesNotPresent Generate the nested body content of this tag if the specified message is not present in this request. messagesPresent Generate the nested body content of this tag if the specified message is present in this request. notEmpty Evaluate the nested body content of this tag if the requested variable is neither null, nor an empty string, nor an empty java.util.Collection (tested by the.isEmpty() method on the java.util.Collection interface). notEqual Evaluate the nested body content of this tag if the requested variable is not equal to the specified value. notMatch Evaluate the nested body content of this tag if the specified value is not an appropriate substring of the requested variable. notPresent Generate the nested body content of this tag if the specified value is not present in this request. present Generate the nested body content of this tag if the specified value is present in this request. redirect Render an HTTP Redirect

59 Struts Tag library base- renders an HTML base element button- renders a button input fiels cancel- renders a cancel button checkbox- renders a checkbox input field errors- conditionnaly renders a set of accumulated error messages file- renders a file select input field form- defines an HTML form element frame- renders an HTML frame element hidden- renders a hidden field html- renders an HTMl html element image- renders an input tag of type "image" img- renders an HTMl img tag javascript- renderts JavaScript validation rules loaded by ValidationPlugin link- renders an HTML anchoror hyperlink messages- Conditionally displays a set of accumulated messages

60 multibox-renders multiple checkbox input fields option- renders a select option options- renders a collection of select options options Collection - render a collection of select options password-renders apassword input field radio-renders a radio button input field reset-renders a rest button input field rewrite- renders a URI select-renders a select element submit-renders a submi button text-renders an input field of type "text" textarea-renders an textarea input field


Scaricare ppt "Struts. Framework open source per lo sviluppo di applicazioni web su piattaforma J2EE. Progetto inizialmente sviluppato come sotto-progetto di Apache."

Presentazioni simili


Annunci Google