際際滷

際際滷Share a Scribd company logo
MVC Struts 1
A Web Application Framework


          a cura di
      Tarin Gamberini
Sommario  Parte 1 di 2

1.    MVC
     1.    JSP, JSP Model 1, JSP Model 2
     2.    Model-View-Controller (MVC) Pattern
     3.    Distributed Multitiered Applications
     4.    Dove si inserisce Struts?




www.taringamberini.com    MVC Struts 1            2
Sommario  Parte 2 di 2

1.    Struts 1
     1.    Installazione e configurazione
     2.    Controller: Action, ActionForward
     3.    Model
     4.    View: ActionForm
     5.    Struts Custom Tag Library



www.taringamberini.com    MVC Struts 1         3
MVC

    MVC Struts 1
A Web Application Framework
       Parte 1 di 2
JavaServer Pages (JSP)
   Una JSP 竪 unastrazione (vista ad alto livello) di
    una servlet
   Il Web Container, a fronte di una Request di una
    JSP:
        traduce il .jsp in un .java (servlet)
        compila il .java (servlet) in un .class
   Ogni JSP ha molte responsabilit:
        view logic, flow logic, data access logic,
        business logic, security logic, ...


www.taringamberini.com        MVC Struts 1            5
JavaServer Pages (JSP)
   Parte di logica pu嘆 essere incapsulata in tag:
        Disaccoppiamento fra presentazione (View) e
         contenuto (Model)
        Una pagina con tag 竪 compresa meglio dai web
         designer
   Parte di logica rimane nella JSP sotto forma di:
        scriptlet <%  String firstDate =
         request.getParameter(firstDate);  %>
        JavaScript per pagine pi湛 dinamiche e performanti
         <script type=text/javascript  validate(firstDate) 

www.taringamberini.com       MVC Struts 1                     6
JSP Model 1




www.taringamberini.com      MVC Struts 1   7
JSP Model 1
   Request e Response sono a carico della JSP
   JSP accede alla base dati attraverso JavaBeans:
    disaccoppiamento nellaccesso ai dati. Benefici:
             La JSP pu嘆 cambiare (layout) senza obbligare al
              cambiamento il JavaBean
             Il JavaBean pu嘆 cambiare (alter table) senza obbligare al
              cambiamento la JSP
   Architettura adatta per semplici applicazioni:
        business logic, data access logic, I18n logic, security
         logic, ... sono semplici o del tutto assenti

www.taringamberini.com            MVC Struts 1                            8
JSP Model 2




www.taringamberini.com      MVC Struts 1   9
JSP Model 2
   Request a carico della servlet (Controller),
    Response a carico della JSP (View)
   Servlet (Controller) ha le responsabilit pi湛
    pesanti:
        I18n logic, security logic, ...
        business logic, persistence logic: istanzia Bean ed
         oggetti che user la JSP
        flow logic: in base alle azioni dellutente determina il
         forward alla JSP successiva
   JSP (View) ha la responsabilit della
        view logic: accede ai Bean istanziati dalla servlet

www.taringamberini.com        MVC Struts 1                          10
MVC Pattern - Scenario




www.taringamberini.com   MVC Struts 1   11
MVC Pattern - Scenario
        Applicazioni Enterprise supportano pi湛 utenti
         che utilizzano diverse View, per esempio:
          HTML per B2C
          WML per B2C
          JFC/Swing per amministratori (magazziniere)
          XML per B2B
        Evitare duplicazione codice View dipendente
         (copia/incolla)
          Elevati costi di manutenzione
          Evoluzione in differenti applicativi, uno per ogni
           View, con stesse funzionalit

www.taringamberini.com        MVC Struts 1                      12
MVC Pattern - Obiettivi
        Accedere agli stessi dati da presentare in
         differenti View: HTML, WML, JFC/Swing, XML
        Aggiornare gli stessi dati attraverso interazioni
         differenti:
          Click sui link di pagina HTML o su WML card
          Click sui bottoni di una GUI JFC/Swing
          Invio messaggi fra web services SOAP (XML)
        Supporto alle diverse View ed ai diversi tipi di
         Interazioni utente non deve impattare le core
         functionality della enterprise application

www.taringamberini.com      MVC Struts 1                    13
MVC Pattern - Soluzione




   Model-View-Controller (MVC) Pattern garantisce
    semplificazione delle fasi di sviluppo, test,
    manutenzione, attraverso il disaccoppiamento tra core
    functionality (M), logica di presentazione (V), logica di
    interazione (C)
www.taringamberini.com      MVC Struts 1                        14
MVC Pattern - Model
     Il Model 竪 un modello software di
      processi che avvengono nel mondo reale
     Il Model descrive:
          Enterprise data
          Regole di accesso/aggiornamento dei dati
          Regole di elaborazione dei dati specifiche del
           processo modellato (business logic)


www.taringamberini.com     MVC Struts 1                15
MVC Pattern - View
     La View accede ai dati, attraverso il
      Model, e li presenta
     La View mantiene consistenza fra il dato
      presentato ed il dato contenuto nel
      Model:
          Modalit push (passiva): la View riceve il
           dato corrente dal Model
          Modalit pull (attiva): la View chiede al
           Model il dato corrente (Web application)
www.taringamberini.com     MVC Struts 1                 16
MVC Pattern - Controller
        Il Controller traduce le interazioni fra utente e
         View in azioni
          EventListener per JFC/Swing View
          HttpRequest get e post per Web View
        Il Controller delega lesecuzione delle azioni al
         Model
        Il Controller sceglie la successiva View in
         funzione del risultato dellesecuzione delle
         azioni da parte del Model

www.taringamberini.com      MVC Struts 1                     17
Distributed Multitiered Applications
        La piattaforma JEE concepisce una
         applicazione enterprise secondo un modello
         multistrato distribuito
        Le funzionalit realizzate dalla logica
         applicativa sono divise in componenti installati
         in differenti strati e differenti macchine
          Client-tier: esegue sulla macchina client
          Web-tier: esegue sul JEE server
          Business-tier: esegue sul JEE server
          EIS-tier (Enterprise Information System): esegue
           sul DB server

www.taringamberini.com       MVC Struts 1                     18
Distributed Multitiered Applications




www.taringamberini.com   MVC Struts 1   19
Componenti Java EE
        Un componente offre una funzionalit
         incapsulata in una unit software
          Applet e Applicazioni Client: componenti che
           eseguono sul client
          Java Servlet, JSP, JSF: tecnologie di componenti
           web che eseguono sul server
          EJB: componenti business che eseguono sul server
        Un componente 竪 eseguito su una macchina
         allinterno di un Container

www.taringamberini.com      MVC Struts 1                  20
Java EE Containers
   I Containers sono un'interfaccia fra i componenti
    e le funzionalit, di basso livello, che risiedono
    nella piattaforma che supporta tali componenti
        EJB Container: componenti (EJB) e container
         eseguono sul JEE server
        Web Container: componenti (Servlet, JSP) e container
         eseguono sul JEE server
        Application Container: componenti (applicazioni) e
         container eseguono sul client
        Applet Container: componenti (Applet) e container
         (web browser e Java Plug-in) eseguono sul client


www.taringamberini.com      MVC Struts 1                   21
Java EE Containers




   Un componente viene deployato nel relativo
    Container

www.taringamberini.com   MVC Struts 1              22
Dove si inserisce Struts?




   Struts rappresenta una implementazione del pattern MVC
   Struts offre uninfrastruttura su cui costruire una applicazione
    enterprise Multi-Tier

www.taringamberini.com           MVC Struts 1                          23
Struts 1

    MVC Struts 1
A Web Application Framework
       Parte 2 di 2
Struts mapping
                             web.xml
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" ... >

 <servlet>
  <servlet-name>controller</servlet-name>
  <servle-class>org.apache.struts.action.ActionServlet</servlet-class>
 </servlet>

 <servlet-mapping>
  <servlet-name>controller</servlet-name>
  <url-pattern>*.do</url-pattern>
 </servlet-mapping>

</web-app>



www.taringamberini.com           MVC Struts 1                            25
Struts configuration
                         web.xml
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" ... >

 <servlet>
  <servlet-name>controller</servlet-name>
  <servle-class>org.apache.struts.action.ActionServlet</servlet-class>
  <init-param>
   <param-name>config</param-name>
   <param-value>/WEB-INF/struts-config.xml</param-value>
  </init-param>
 </servlet>

 ...

</web-app>


www.taringamberini.com           MVC Struts 1                            26
Struts Controller (MVC)
     Il Controller (RequestProcessor) traduce le interazioni fra utente e
      View in azioni dichiarativamente nello struts-config.xml

<struts-config>
 <action-mappings>
  <action
     path="/login" type="login.LoginAction"
     name="loginForm" scope="request" input="/login.jsp">
    <forward name="success" path="/logged.jsp" />
    <forward name="failure" path="/failure.jsp" />
  </action>
 </action-mappings>
</struts-config>


www.taringamberini.com          MVC Struts 1                            27
Struts Controller (MVC)
     Il Controller delega lesecuzione delle azioni al Model tramite una
      classe de gestione dell'azione

<struts-config>
 <action-mappings>
  <action
     path="/login" type="login.LoginAction"
     name="loginForm" scope="request" input="/login.jsp">
    <forward name="success" path="/logged.jsp" />
    <forward name="failure" path="/failure.jsp" />
  </action>
 </action-mappings>
</struts-config>


www.taringamberini.com          MVC Struts 1                            28
Struts Controller (MVC)
     Il Controller sceglie la successiva View in funzione del risultato
      dellesecuzione delle azioni da parte del Model

<struts-config>
 <action-mappings>
  <action
     path="/login" type="login.LoginAction"
     name="loginForm" scope="request" input="/login.jsp">
    <forward name="success" path="/logged.jsp" />
    <forward name="failure" path="/failure.jsp" />
  </action>
 </action-mappings>
</struts-config>


www.taringamberini.com           MVC Struts 1                              29
Struts init()
         Il Web Container inizializza Struts invocando il metodo
          init() della ActionServlet:
     1.     Lettura delle risorse di messaggi interne di Struts
     2.     Lettura dal web.xml dei parametri di configurazione di Struts
     3.     Init. della configurazione:
               Parsing dello struts.config.xml (dtd)
               Creazione dell'oggetto ApplicationConfig
               Salvataggio dell'ApplicationConfig nel ServletContext
     4.     Init. delle risorse di messaggi
               Lettura dei vari message-resources.properties
               Salvataggio dei messaggi nel ServletContext
           Init. DataSource
           Init. Plug-in


www.taringamberini.com               MVC Struts 1                           30
La classe Action
     Un Action 竪 il ponte (Adapter) fra il contenuto
      di una richiesta HTTP e la logica di business
     Estendendo Action si possono progettare
      Action personalizzate che delegano
      l'elaborazione della richiesta HTTP
      all'appropriata logica di business
     Il controller di Struts (RequestProcessor)
      invoca il metodo execute(...) dell'Action


www.taringamberini.com        MVC Struts 1              31
La classe Action
public class LoginAction extends Action {
 public ActionForward execute(ActionMapping mapping,
  ActionForm form, HttpServletRequest request, HttpServletResponse
      response) throws Exception {

        // 1. ottiene i parametri dal form
        // 2. delega alla logica di business
        // 3. determina view successiva
        if (...) { return mapping.findForward("success"); }
        else { return mapping.findForward("failure"); }
    }
}



www.taringamberini.com              MVC Struts 1                 32
Ciclo di vita di una Action
        RequestProcessor contiene una HashMap:
          Key: nome delle Action nello struts-config.xml
          Value: riferimento all'istanza della relativa Action
2.       Struts, a fronte di una richiesta di un'Action,
         controlla l'HashMap:
          Se l'Action non 竪 ancora istanziata (Value==null) la
           istanzia, salvandone il riferimento nell'HashMap
          Se l'Action era gi stata istanziata ne ottiene il
           riferimento
        Action condivise fra pi湛 thread: thread-safe se
         progettate senza variabili di istanza

www.taringamberini.com        MVC Struts 1                        33
La classe ActionForward
     La classe ActionForward rappresenta una
      destinazione alla quale il controller
      inoltra il risultato dell'elaborazione della
      richiesta HTTP da parte del Business
     Una ActionForward pu嘆 essere:
          creato nell'Action
          ottenuto dal mapping dichiarato nello struts-
           config invocando mapping.findForward(...)
www.taringamberini.com     MVC Struts 1                34
La classe ActionForward
public class LoginAction extends Action {
 public ActionForward execute(ActionMapping mapping,
  ActionForm form, HttpServletRequest request, HttpServletResponse
      response) throws Exception {

        // 1. ottiene i parametri dal form
        // 2. delega alla logica di business
        // 3. determina view successiva
        if ( ... ) { return mapping.findForward("success"); }
        else { return mapping.findForward("failure"); }
    }
}



www.taringamberini.com               MVC Struts 1                35
Struts Model (MVC)
        Struts non offre granch辿 per progettare il
         Model
        Ricorso ad infrastrutture esterne a Struts:
          EJB
        Progetto di infrastrutture ad-hoc basate su:
          JavaBeans (BO, DAO, DTO)
          Pattern vari
          Object-to-Relational Mapping (iBatis, Hybernate)


www.taringamberini.com       MVC Struts 1                     36
Struts View (MVC)
     La View accede ai dati, attraverso il
      Model, e li presenta
     La presentazione sfrutta un'interfaccia
      utente visualizzata dal client all'interno di
      un web browser:
          HTML, CSS
          JSP con JSTL, con Struts custom tag
          Resource bundle Java

www.taringamberini.com    MVC Struts 1            37
Struts View (MVC)
     La View mantiene consistenza fra il dato
      presentato ed il dato contenuto nel
      Model:
          Modalit pull (attiva): la View chiede al
           Model il dato corrente (il client 竪 un browser
           web che inoltra richieste HTTP)
          JSP con JSTL, con Struts custom tag
          ActionForm di Struts
          DTO
www.taringamberini.com     MVC Struts 1                 38
La classe ActionForm
     ActionForm 竪 impiegata per catturare i dati in
      ingresso da un form HTML e trasferirli alla
      classe Action
     ActionForm si interpone fra la View ed il
      Controller
     ActionForm agisce da buffer per i dati del form
      HTML mentre sono validati
     ActionForm sono JavaBeans: dati del form
      HTML memorizzati come properties

www.taringamberini.com   MVC Struts 1               39
La classe ActionForm
         Gli ActionForm sono dichiarati nel file struts-config.xml nella
          sezione form-beans:

<struts-config>
 <form-beans>
  <form-bean name="loginForm" type="login.LoginForm" />
  <form-bean ...
 </form-beans>

    ...

</struts-config>



www.taringamberini.com              MVC Struts 1                            40
La classe ActionForm
     Gli ActionForm sono associate alle Action attraverso il nome simbolico del form:

<struts-config>
 <form-beans>
  <form-bean name="loginForm" type="login.LoginForm" />
 </form-beans>

 <action-mappings>
  <action
     path="/login" type="login.LoginAction"
     name="loginForm" scope="request" input="/login.jsp">
    <forward name="success" path="/logged.jsp" />
    <forward name="failure" path="/failure.jsp" />
  </action>
 </action-mappings>
</struts-config>


www.taringamberini.com                MVC Struts 1                                       41
La classe ActionForm
     Gli ActionForm possono essere messi in request od in session (default):

<struts-config>
 <form-beans>
  <form-bean name="loginForm" type="login.LoginForm" />
 </form-beans>

 <action-mappings>
  <action
     path="/login" type="login.LoginAction"
     name="loginForm" scope="request" input="/login.jsp">
    <forward name="success" path="/logged.jsp" />
    <forward name="failure" path="/failure.jsp" />
  </action>
 </action-mappings>
</struts-config>


www.taringamberini.com                MVC Struts 1                              42
La classe ActionForm
     Se fallisce la validazione dell'ActionForm si esegue forward all'input :

<struts-config>
 <form-beans>
  <form-bean name="loginForm" type="login.LoginForm" />
 </form-beans>

 <action-mappings>
  <action
     path="/login" type="login.LoginAction"
     name="loginForm" scope="request" input="/login.jsp">
    <forward name="success" path="/logged.jsp" />
    <forward name="failure" path="/failure.jsp" />
  </action>
 </action-mappings>
</struts-config>


www.taringamberini.com                 MVC Struts 1                              43
Ciclo di vita di una ActionForm
1.        Il controller riceve una richiesta HTTP
2.        Crea o riusa ActionForm
3.        Inizializza propriet dell' ActionForm: reset()
4.        Salva ActionForm nello scope dichiarato
5.        Popola ActionForm prendendo i dati dalla richiesta
          HTTP
6.        Valida propriet dell'ActionForm: validate()
           se errore si esegue forward all'input
     2.     altrimenti invoca il metodo execute() dell'Action
     3.     Forward alla view successiva con ActionForm nello scope
            dichiarato

www.taringamberini.com           MVC Struts 1                         44
Inviare messaggi alla View
     ActionForm e Action permettono di salvare
      nella richiesta HTTP eventuali messaggi prima
      dell'inoltro alla View successiva
     ActionMessages rappresentano messaggi
      informativi
     ActionErrors (竪 un ActionMessages)
      rappresentano messaggi d'errore
     ActionMessages ed ActionErrors sono formati
      da insiemi di pi湛 ActionMessage

www.taringamberini.com   MVC Struts 1                 45
Messaggi da un ActionForm
          La validazione delle propriet di un ActionForm salva automaticamente nella
           richiesta Http gli ActionErrors impiegati per rappresentare insiemi di messaggi di
           errori di validazione

public class LoginForm extends ActionForm {
 public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
  ActionErrors actionErrors = new ActionErrors();

        // se password troppo corta prepara un messaggio d'errore
        ActionMessage actionMessage = new ActionMessage(
          "login.form.validating.error.password.minLenght",
          getPasswordMinLenght());

        actionErrors.add("password", actionMessage);
        return actionErrors;
    }
}


www.taringamberini.com                     MVC Struts 1                                         46
Messaggi da un Action
          Un Action pu嘆 salvare nella richiesta HTTP sia ActionErrors, con
           saveErrors(), che ActionMessages con saveMessages()

public class LoginAction extends Action {
 public ActionForward execute(...) {
  ...
  ActionMessage actionMessage = new ActionMessage("login.success", user);
  ActionMessages actionMessages = new ActionMessages();
  actionMessages.add(ActionMessages.GLOBAL_MESSAGE, actionMessage);
  saveMessages(request.getSession(), actionMessages);

        return mapping.findForward("success");
    }
}


www.taringamberini.com                 MVC Struts 1                           47
Struts Custom Tag Library - HTML
     Utilizzata per interagire con tag HTML: input form,
      checkbox, image, link, submit, text, textarea, ecc...
     Dichiarazione nel web.xml (optional dalla 2.4):
     <taglib>
      <taglib-uri> http://struts.apache.org/tags-html</taglib-uri>
      <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
     </taglib>

     Dichiarazione in una JSP:
     <%@ taglib uri="http://struts.apache.org/tags-html"
       prefix="html" %>


www.taringamberini.com         MVC Struts 1                          48
Struts Custom Tag Library - HTML
      Esempio di una JSP da cui effettuare il login:

<html:form action="/login.do">

    <p><bean:message key="login.form.userName" />
      <html:text property="userName" /></p>
    <p><bean:message key="login.form.password" />
      <html:password property="password" /></p>
    <p><html:checkbox property="forgotPassword" />
      <bean:message key="login.form.forgotPassword" /></p>
    <html:submit />

</html:form>

www.taringamberini.com           MVC Struts 1                49
Struts Custom Tag Library - Bean
     Utilizzata per interagire con JavaBeans e resource
      bundle: write, message, ecc...
     Dichiarazione nel web.xml (optional dalla 2.4):
     <taglib>
      <taglib-uri>http://struts.apache.org/tags-bean</taglib-uri>
      <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
     </taglib>

     Dichiarazione in una JSP:
     <%@ taglib uri="http://struts.apache.org/tags-bean"
       prefix="bean" %>


www.taringamberini.com        MVC Struts 1                          50
Struts Custom Tag Library - Bean

     Esempio di una JSP dopo il login:
     <p><bean:write name= loginForm
        property=userName />
        <bean:message key="logged.success" /></p>

     Ove possibile preferire a <bean:write> il
      <c:out> della JSTL:
     <p><c:out value="loginForm.userName"/>
        <bean:message key="logged.success" /></p>

www.taringamberini.com   MVC Struts 1               51
Struts Custom Tag Library - Logic
     Utilizzata per inserimento di HTML dinamico in modo
      condizionale o iterativo: equal, notEqual, greaterThan,
      lessEqual, iterate, ecc...
     Dichiarazione nel web.xml (optional dalla 2.4):
     <taglib>
      <taglib-uri>http://struts.apache.org/tags-logic</taglib-uri>
      <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
     </taglib>

     Dichiarazione in una JSP:
     <%@ taglib uri="http://struts.apache.org/tags-logic"
       prefix="logic" %>


www.taringamberini.com         MVC Struts 1                          52
Struts Custom Tag Library - Logic
     Inserimento condizionale:
     <logic:equal name="profiloUtenteForm" property="lettura"
         value="true">
      <p><bean:message key="login.form.userName" />
        <html:text property="userName" disabled="true" /></p>
     </logic:equal>

     Ove possibile preferire a <logic:equal> il <c:if> della
      JSTL:
     <c:if test="${profiloUtenteForm.lettura eq 'true'}">
      <p><bean:message key="login.form.userName" />
       <html:text property="userName" disabled="true" /></p>
     </c:if>

www.taringamberini.com       MVC Struts 1                       53
Struts Custom Tag Library - Logic
     Inserimento iterativo:
     <logic:iterate id="utente" name="listaUtentiForm" property="listaUtenti"
          indexId="index">
      <tr>
        <td><bean:write name="index" /></td>
        <td><bean:write name="utente" property="userName" /></td></tr>
     </logic:iterate>

     Ove possibile preferire a <logic:equal> il <c:if> della JSTL:
     <c:forEach var="utente" items="${listaUtentiForm.listaUtenti}"
          varStatus="loopTagStatus">
      <tr>
       <td>${loopTagStatus.index + 1 }</td>
       <td>${utente.userName}</td></tr>
     </c:forEach>

www.taringamberini.com            MVC Struts 1                             54
I18N
        Resource bundle conformi alle convenzioni
         della classe java.util.PropertyResourceBundle:
          File di testo con estensione .properties
          Ogni riga contiene una coppia key=value
        Es. di un MessageResources_it.properties:
     login.form.userName=Utente
     login.form.password=Password
     login.success=L'utente {0} si 竪 loggato con successo.
         Ultimo accesso il {1} alle ore {2}.

www.taringamberini.com       MVC Struts 1                    55
Bibliografia
     JavaServer Pages Model 2 architecture:
      http://www.javaworld.com/javaworld/jw-12-1999/jw-12-ssj-
      jspmvc.html
     Java BluePrints Enterprise Patterns:
      http://java.sun.com/blueprints/patterns/MVC.html
     The Java EE 5 Tutorial:
      http://java.sun.com/javaee/5/docs/tutorial/doc/p1.html
     Struts 1 User Guide:
      http://struts.apache.org/1.3.9/userGuide/index.html
     Programmare con Jakarta Struts  Chuck Cavaness  Ulrico
      Hoepli Editore  2003
     Jakarta-Struts Live  Richard Hightower  SourceBeat, LLC,
      Higland Ranch, Colorado - 2004



www.taringamberini.com        MVC Struts 1                         56

More Related Content

What's hot (20)

Sviluppo Web Agile Con MonoRail
Sviluppo Web Agile Con MonoRailSviluppo Web Agile Con MonoRail
Sviluppo Web Agile Con MonoRail
Stefano Ottaviani
Un backend per tutte le stagioni con Spring
Un backend per tutte le stagioni con SpringUn backend per tutte le stagioni con Spring
Un backend per tutte le stagioni con Spring
Marcello Teodori
Asp.Net MVC 3 - Il Model View Controller secondo Microsoft
Asp.Net MVC 3 - Il Model View Controller secondo MicrosoftAsp.Net MVC 3 - Il Model View Controller secondo Microsoft
Asp.Net MVC 3 - Il Model View Controller secondo Microsoft
Stefano Benedetti
Model View Controller - Semplificare Il Codice E Minimizzare I Tempi
Model View Controller - Semplificare Il Codice E Minimizzare I TempiModel View Controller - Semplificare Il Codice E Minimizzare I Tempi
Model View Controller - Semplificare Il Codice E Minimizzare I Tempi
Marco Parenzan
Niccol嘆 Becchi: Introduzione a GWT
Niccol嘆 Becchi: Introduzione a GWTNiccol嘆 Becchi: Introduzione a GWT
Niccol嘆 Becchi: Introduzione a GWT
firenze-gtug
Spring @Aspect e @Controller
Spring @Aspect e @Controller Spring @Aspect e @Controller
Spring @Aspect e @Controller
Massimiliano Dess狸
SPRING - MAVEN - REST API (ITA - Luglio 2017)
SPRING - MAVEN - REST API (ITA - Luglio 2017)SPRING - MAVEN - REST API (ITA - Luglio 2017)
SPRING - MAVEN - REST API (ITA - Luglio 2017)
Valerio Radice
Spring E Spring Web Flow Nel Progetto Jug Avis Web
Spring E Spring Web Flow Nel Progetto Jug Avis WebSpring E Spring Web Flow Nel Progetto Jug Avis Web
Spring E Spring Web Flow Nel Progetto Jug Avis Web
Massimiliano Dess狸
Introduzione WPF
Introduzione WPFIntroduzione WPF
Introduzione WPF
Ercole Palmeri
Yii Framework - yes it is rapid web application development (Parte 1)
Yii Framework - yes it is rapid web application development (Parte 1)Yii Framework - yes it is rapid web application development (Parte 1)
Yii Framework - yes it is rapid web application development (Parte 1)
brossi676
Selenium e testing web - di Alessio Benedetti
Selenium e testing web - di Alessio BenedettiSelenium e testing web - di Alessio Benedetti
Selenium e testing web - di Alessio Benedetti
Giuneco S.r.l
Spring, IBatis e Transazioni Aop Nel Jug Avis Web
Spring, IBatis e Transazioni Aop Nel Jug Avis WebSpring, IBatis e Transazioni Aop Nel Jug Avis Web
Spring, IBatis e Transazioni Aop Nel Jug Avis Web
Massimiliano Dess狸
Blazor with .net 5 - di Gerardo Greco
Blazor with .net 5 - di Gerardo GrecoBlazor with .net 5 - di Gerardo Greco
Blazor with .net 5 - di Gerardo Greco
Giuneco S.r.l
Angularjs
AngularjsAngularjs
Angularjs
Francesco Portus
Knockout.js
Knockout.jsKnockout.js
Knockout.js
Manuel Scapolan
Cert03 70-486 developing asp.net mvc 4 web applications
Cert03   70-486 developing asp.net mvc 4 web applicationsCert03   70-486 developing asp.net mvc 4 web applications
Cert03 70-486 developing asp.net mvc 4 web applications
DotNetCampus
際際滷 Prelaurea. Alessandro Andreos竪
際際滷 Prelaurea. Alessandro Andreos竪際際滷 Prelaurea. Alessandro Andreos竪
際際滷 Prelaurea. Alessandro Andreos竪
guesta10af3
Spring Intro
Spring IntroSpring Intro
Spring Intro
guestfb22d3
Sviluppo Web Agile Con MonoRail
Sviluppo Web Agile Con MonoRailSviluppo Web Agile Con MonoRail
Sviluppo Web Agile Con MonoRail
Stefano Ottaviani
Un backend per tutte le stagioni con Spring
Un backend per tutte le stagioni con SpringUn backend per tutte le stagioni con Spring
Un backend per tutte le stagioni con Spring
Marcello Teodori
Asp.Net MVC 3 - Il Model View Controller secondo Microsoft
Asp.Net MVC 3 - Il Model View Controller secondo MicrosoftAsp.Net MVC 3 - Il Model View Controller secondo Microsoft
Asp.Net MVC 3 - Il Model View Controller secondo Microsoft
Stefano Benedetti
Model View Controller - Semplificare Il Codice E Minimizzare I Tempi
Model View Controller - Semplificare Il Codice E Minimizzare I TempiModel View Controller - Semplificare Il Codice E Minimizzare I Tempi
Model View Controller - Semplificare Il Codice E Minimizzare I Tempi
Marco Parenzan
Niccol嘆 Becchi: Introduzione a GWT
Niccol嘆 Becchi: Introduzione a GWTNiccol嘆 Becchi: Introduzione a GWT
Niccol嘆 Becchi: Introduzione a GWT
firenze-gtug
SPRING - MAVEN - REST API (ITA - Luglio 2017)
SPRING - MAVEN - REST API (ITA - Luglio 2017)SPRING - MAVEN - REST API (ITA - Luglio 2017)
SPRING - MAVEN - REST API (ITA - Luglio 2017)
Valerio Radice
Spring E Spring Web Flow Nel Progetto Jug Avis Web
Spring E Spring Web Flow Nel Progetto Jug Avis WebSpring E Spring Web Flow Nel Progetto Jug Avis Web
Spring E Spring Web Flow Nel Progetto Jug Avis Web
Massimiliano Dess狸
Yii Framework - yes it is rapid web application development (Parte 1)
Yii Framework - yes it is rapid web application development (Parte 1)Yii Framework - yes it is rapid web application development (Parte 1)
Yii Framework - yes it is rapid web application development (Parte 1)
brossi676
Selenium e testing web - di Alessio Benedetti
Selenium e testing web - di Alessio BenedettiSelenium e testing web - di Alessio Benedetti
Selenium e testing web - di Alessio Benedetti
Giuneco S.r.l
Spring, IBatis e Transazioni Aop Nel Jug Avis Web
Spring, IBatis e Transazioni Aop Nel Jug Avis WebSpring, IBatis e Transazioni Aop Nel Jug Avis Web
Spring, IBatis e Transazioni Aop Nel Jug Avis Web
Massimiliano Dess狸
Blazor with .net 5 - di Gerardo Greco
Blazor with .net 5 - di Gerardo GrecoBlazor with .net 5 - di Gerardo Greco
Blazor with .net 5 - di Gerardo Greco
Giuneco S.r.l
Cert03 70-486 developing asp.net mvc 4 web applications
Cert03   70-486 developing asp.net mvc 4 web applicationsCert03   70-486 developing asp.net mvc 4 web applications
Cert03 70-486 developing asp.net mvc 4 web applications
DotNetCampus
際際滷 Prelaurea. Alessandro Andreos竪
際際滷 Prelaurea. Alessandro Andreos竪際際滷 Prelaurea. Alessandro Andreos竪
際際滷 Prelaurea. Alessandro Andreos竪
guesta10af3

Similar to MVC and Struts 1 (20)

ASP.NET MVC: Full Throttle
ASP.NET MVC: Full ThrottleASP.NET MVC: Full Throttle
ASP.NET MVC: Full Throttle
Andrea Saltarello
Asp.Net MVC 2 :: VS 2010 Community Tour
Asp.Net MVC 2 :: VS 2010 Community TourAsp.Net MVC 2 :: VS 2010 Community Tour
Asp.Net MVC 2 :: VS 2010 Community Tour
Andrea Balducci
Come sviluppare applicazioni cross device con HTML
Come sviluppare applicazioni cross device con HTMLCome sviluppare applicazioni cross device con HTML
Come sviluppare applicazioni cross device con HTML
Sinergia Totale
Asp.NET MVC Framework
Asp.NET MVC FrameworkAsp.NET MVC Framework
Asp.NET MVC Framework
DotNetMarche
Alessandro Forte - MVP vs MVC
Alessandro Forte - MVP vs MVCAlessandro Forte - MVP vs MVC
Alessandro Forte - MVP vs MVC
Alessandro Forte
Web Api The HTTP Way
Web Api  The HTTP WayWeb Api  The HTTP Way
Web Api The HTTP Way
Luca Milan
Zend Framework Workshop Parte1
Zend Framework Workshop Parte1Zend Framework Workshop Parte1
Zend Framework Workshop Parte1
massimiliano.wosz
Fe02 ria con breeze e knockout
Fe02   ria con breeze e knockoutFe02   ria con breeze e knockout
Fe02 ria con breeze e knockout
DotNetCampus
ASP.NET MVC: sfruttare la piattaforma al 100%
ASP.NET MVC: sfruttare la piattaforma al 100%ASP.NET MVC: sfruttare la piattaforma al 100%
ASP.NET MVC: sfruttare la piattaforma al 100%
DomusDotNet
Introduzione a Struts
Introduzione a StrutsIntroduzione a Struts
Introduzione a Struts
Andrea Colleoni
AngularJS-Intro
AngularJS-IntroAngularJS-Intro
AngularJS-Intro
Vittorio Conte
Hands on MVC - Mastering the Web
Hands on MVC - Mastering the WebHands on MVC - Mastering the Web
Hands on MVC - Mastering the Web
Claudio Gandelli
Applicazioni web con Asp.Net MVC 6
Applicazioni web con Asp.Net MVC 6Applicazioni web con Asp.Net MVC 6
Applicazioni web con Asp.Net MVC 6
Michele Aponte
Asp.net web form 4.5 - what's new!!
Asp.net web form 4.5 - what's new!!Asp.net web form 4.5 - what's new!!
Asp.net web form 4.5 - what's new!!
Massimo Bonanni
Progetto SOD Davide Sito
Progetto SOD Davide SitoProgetto SOD Davide Sito
Progetto SOD Davide Sito
Davide Sito
We Want Web - Web Applications con MVC 3
We Want Web - Web Applications con MVC 3We Want Web - Web Applications con MVC 3
We Want Web - Web Applications con MVC 3
DomusDotNet
Design pattern architetturali Model View Controller, MVP e MVVM
Design pattern architetturali   Model View Controller, MVP e MVVMDesign pattern architetturali   Model View Controller, MVP e MVVM
Design pattern architetturali Model View Controller, MVP e MVVM
Riccardo Cardin
SUE AGILE Framework (Italiano)
SUE AGILE Framework (Italiano)SUE AGILE Framework (Italiano)
SUE AGILE Framework (Italiano)
Sabino Labarile
Novit di Asp.Net 4.0
Novit di Asp.Net 4.0Novit di Asp.Net 4.0
Novit di Asp.Net 4.0
Gian Maria Ricci
ASP.NET MVC Intro
ASP.NET MVC IntroASP.NET MVC Intro
ASP.NET MVC Intro
Manuel Scapolan
ASP.NET MVC: Full Throttle
ASP.NET MVC: Full ThrottleASP.NET MVC: Full Throttle
ASP.NET MVC: Full Throttle
Andrea Saltarello
Asp.Net MVC 2 :: VS 2010 Community Tour
Asp.Net MVC 2 :: VS 2010 Community TourAsp.Net MVC 2 :: VS 2010 Community Tour
Asp.Net MVC 2 :: VS 2010 Community Tour
Andrea Balducci
Come sviluppare applicazioni cross device con HTML
Come sviluppare applicazioni cross device con HTMLCome sviluppare applicazioni cross device con HTML
Come sviluppare applicazioni cross device con HTML
Sinergia Totale
Asp.NET MVC Framework
Asp.NET MVC FrameworkAsp.NET MVC Framework
Asp.NET MVC Framework
DotNetMarche
Alessandro Forte - MVP vs MVC
Alessandro Forte - MVP vs MVCAlessandro Forte - MVP vs MVC
Alessandro Forte - MVP vs MVC
Alessandro Forte
Web Api The HTTP Way
Web Api  The HTTP WayWeb Api  The HTTP Way
Web Api The HTTP Way
Luca Milan
Zend Framework Workshop Parte1
Zend Framework Workshop Parte1Zend Framework Workshop Parte1
Zend Framework Workshop Parte1
massimiliano.wosz
Fe02 ria con breeze e knockout
Fe02   ria con breeze e knockoutFe02   ria con breeze e knockout
Fe02 ria con breeze e knockout
DotNetCampus
ASP.NET MVC: sfruttare la piattaforma al 100%
ASP.NET MVC: sfruttare la piattaforma al 100%ASP.NET MVC: sfruttare la piattaforma al 100%
ASP.NET MVC: sfruttare la piattaforma al 100%
DomusDotNet
Introduzione a Struts
Introduzione a StrutsIntroduzione a Struts
Introduzione a Struts
Andrea Colleoni
Hands on MVC - Mastering the Web
Hands on MVC - Mastering the WebHands on MVC - Mastering the Web
Hands on MVC - Mastering the Web
Claudio Gandelli
Applicazioni web con Asp.Net MVC 6
Applicazioni web con Asp.Net MVC 6Applicazioni web con Asp.Net MVC 6
Applicazioni web con Asp.Net MVC 6
Michele Aponte
Asp.net web form 4.5 - what's new!!
Asp.net web form 4.5 - what's new!!Asp.net web form 4.5 - what's new!!
Asp.net web form 4.5 - what's new!!
Massimo Bonanni
Progetto SOD Davide Sito
Progetto SOD Davide SitoProgetto SOD Davide Sito
Progetto SOD Davide Sito
Davide Sito
We Want Web - Web Applications con MVC 3
We Want Web - Web Applications con MVC 3We Want Web - Web Applications con MVC 3
We Want Web - Web Applications con MVC 3
DomusDotNet
Design pattern architetturali Model View Controller, MVP e MVVM
Design pattern architetturali   Model View Controller, MVP e MVVMDesign pattern architetturali   Model View Controller, MVP e MVVM
Design pattern architetturali Model View Controller, MVP e MVVM
Riccardo Cardin
SUE AGILE Framework (Italiano)
SUE AGILE Framework (Italiano)SUE AGILE Framework (Italiano)
SUE AGILE Framework (Italiano)
Sabino Labarile

More from Tarin Gamberini (6)

Test di Accettazione con Cucumber (LinuxDay 2018 Ferrara)
Test di Accettazione con Cucumber (LinuxDay 2018 Ferrara)Test di Accettazione con Cucumber (LinuxDay 2018 Ferrara)
Test di Accettazione con Cucumber (LinuxDay 2018 Ferrara)
Tarin Gamberini
MUTANTS KILLER (Revised) - PIT: state of the art of mutation testing system
MUTANTS KILLER (Revised) - PIT: state of the art of mutation testing system MUTANTS KILLER (Revised) - PIT: state of the art of mutation testing system
MUTANTS KILLER (Revised) - PIT: state of the art of mutation testing system
Tarin Gamberini
MUTANTS KILLER - PIT: state of the art of mutation testing system
MUTANTS KILLER - PIT: state of the art of mutation testing system MUTANTS KILLER - PIT: state of the art of mutation testing system
MUTANTS KILLER - PIT: state of the art of mutation testing system
Tarin Gamberini
Commit messages - Good practices
Commit messages - Good practicesCommit messages - Good practices
Commit messages - Good practices
Tarin Gamberini
Apache Maven
Apache MavenApache Maven
Apache Maven
Tarin Gamberini
Log4j in 8 slides
Log4j in 8 slidesLog4j in 8 slides
Log4j in 8 slides
Tarin Gamberini
Test di Accettazione con Cucumber (LinuxDay 2018 Ferrara)
Test di Accettazione con Cucumber (LinuxDay 2018 Ferrara)Test di Accettazione con Cucumber (LinuxDay 2018 Ferrara)
Test di Accettazione con Cucumber (LinuxDay 2018 Ferrara)
Tarin Gamberini
MUTANTS KILLER (Revised) - PIT: state of the art of mutation testing system
MUTANTS KILLER (Revised) - PIT: state of the art of mutation testing system MUTANTS KILLER (Revised) - PIT: state of the art of mutation testing system
MUTANTS KILLER (Revised) - PIT: state of the art of mutation testing system
Tarin Gamberini
MUTANTS KILLER - PIT: state of the art of mutation testing system
MUTANTS KILLER - PIT: state of the art of mutation testing system MUTANTS KILLER - PIT: state of the art of mutation testing system
MUTANTS KILLER - PIT: state of the art of mutation testing system
Tarin Gamberini
Commit messages - Good practices
Commit messages - Good practicesCommit messages - Good practices
Commit messages - Good practices
Tarin Gamberini

MVC and Struts 1

  • 1. MVC Struts 1 A Web Application Framework a cura di Tarin Gamberini
  • 2. Sommario Parte 1 di 2 1. MVC 1. JSP, JSP Model 1, JSP Model 2 2. Model-View-Controller (MVC) Pattern 3. Distributed Multitiered Applications 4. Dove si inserisce Struts? www.taringamberini.com MVC Struts 1 2
  • 3. Sommario Parte 2 di 2 1. Struts 1 1. Installazione e configurazione 2. Controller: Action, ActionForward 3. Model 4. View: ActionForm 5. Struts Custom Tag Library www.taringamberini.com MVC Struts 1 3
  • 4. MVC MVC Struts 1 A Web Application Framework Parte 1 di 2
  • 5. JavaServer Pages (JSP) Una JSP 竪 unastrazione (vista ad alto livello) di una servlet Il Web Container, a fronte di una Request di una JSP: traduce il .jsp in un .java (servlet) compila il .java (servlet) in un .class Ogni JSP ha molte responsabilit: view logic, flow logic, data access logic, business logic, security logic, ... www.taringamberini.com MVC Struts 1 5
  • 6. JavaServer Pages (JSP) Parte di logica pu嘆 essere incapsulata in tag: Disaccoppiamento fra presentazione (View) e contenuto (Model) Una pagina con tag 竪 compresa meglio dai web designer Parte di logica rimane nella JSP sotto forma di: scriptlet <% String firstDate = request.getParameter(firstDate); %> JavaScript per pagine pi湛 dinamiche e performanti <script type=text/javascript validate(firstDate) www.taringamberini.com MVC Struts 1 6
  • 8. JSP Model 1 Request e Response sono a carico della JSP JSP accede alla base dati attraverso JavaBeans: disaccoppiamento nellaccesso ai dati. Benefici: La JSP pu嘆 cambiare (layout) senza obbligare al cambiamento il JavaBean Il JavaBean pu嘆 cambiare (alter table) senza obbligare al cambiamento la JSP Architettura adatta per semplici applicazioni: business logic, data access logic, I18n logic, security logic, ... sono semplici o del tutto assenti www.taringamberini.com MVC Struts 1 8
  • 10. JSP Model 2 Request a carico della servlet (Controller), Response a carico della JSP (View) Servlet (Controller) ha le responsabilit pi湛 pesanti: I18n logic, security logic, ... business logic, persistence logic: istanzia Bean ed oggetti che user la JSP flow logic: in base alle azioni dellutente determina il forward alla JSP successiva JSP (View) ha la responsabilit della view logic: accede ai Bean istanziati dalla servlet www.taringamberini.com MVC Struts 1 10
  • 11. MVC Pattern - Scenario www.taringamberini.com MVC Struts 1 11
  • 12. MVC Pattern - Scenario Applicazioni Enterprise supportano pi湛 utenti che utilizzano diverse View, per esempio: HTML per B2C WML per B2C JFC/Swing per amministratori (magazziniere) XML per B2B Evitare duplicazione codice View dipendente (copia/incolla) Elevati costi di manutenzione Evoluzione in differenti applicativi, uno per ogni View, con stesse funzionalit www.taringamberini.com MVC Struts 1 12
  • 13. MVC Pattern - Obiettivi Accedere agli stessi dati da presentare in differenti View: HTML, WML, JFC/Swing, XML Aggiornare gli stessi dati attraverso interazioni differenti: Click sui link di pagina HTML o su WML card Click sui bottoni di una GUI JFC/Swing Invio messaggi fra web services SOAP (XML) Supporto alle diverse View ed ai diversi tipi di Interazioni utente non deve impattare le core functionality della enterprise application www.taringamberini.com MVC Struts 1 13
  • 14. MVC Pattern - Soluzione Model-View-Controller (MVC) Pattern garantisce semplificazione delle fasi di sviluppo, test, manutenzione, attraverso il disaccoppiamento tra core functionality (M), logica di presentazione (V), logica di interazione (C) www.taringamberini.com MVC Struts 1 14
  • 15. MVC Pattern - Model Il Model 竪 un modello software di processi che avvengono nel mondo reale Il Model descrive: Enterprise data Regole di accesso/aggiornamento dei dati Regole di elaborazione dei dati specifiche del processo modellato (business logic) www.taringamberini.com MVC Struts 1 15
  • 16. MVC Pattern - View La View accede ai dati, attraverso il Model, e li presenta La View mantiene consistenza fra il dato presentato ed il dato contenuto nel Model: Modalit push (passiva): la View riceve il dato corrente dal Model Modalit pull (attiva): la View chiede al Model il dato corrente (Web application) www.taringamberini.com MVC Struts 1 16
  • 17. MVC Pattern - Controller Il Controller traduce le interazioni fra utente e View in azioni EventListener per JFC/Swing View HttpRequest get e post per Web View Il Controller delega lesecuzione delle azioni al Model Il Controller sceglie la successiva View in funzione del risultato dellesecuzione delle azioni da parte del Model www.taringamberini.com MVC Struts 1 17
  • 18. Distributed Multitiered Applications La piattaforma JEE concepisce una applicazione enterprise secondo un modello multistrato distribuito Le funzionalit realizzate dalla logica applicativa sono divise in componenti installati in differenti strati e differenti macchine Client-tier: esegue sulla macchina client Web-tier: esegue sul JEE server Business-tier: esegue sul JEE server EIS-tier (Enterprise Information System): esegue sul DB server www.taringamberini.com MVC Struts 1 18
  • 20. Componenti Java EE Un componente offre una funzionalit incapsulata in una unit software Applet e Applicazioni Client: componenti che eseguono sul client Java Servlet, JSP, JSF: tecnologie di componenti web che eseguono sul server EJB: componenti business che eseguono sul server Un componente 竪 eseguito su una macchina allinterno di un Container www.taringamberini.com MVC Struts 1 20
  • 21. Java EE Containers I Containers sono un'interfaccia fra i componenti e le funzionalit, di basso livello, che risiedono nella piattaforma che supporta tali componenti EJB Container: componenti (EJB) e container eseguono sul JEE server Web Container: componenti (Servlet, JSP) e container eseguono sul JEE server Application Container: componenti (applicazioni) e container eseguono sul client Applet Container: componenti (Applet) e container (web browser e Java Plug-in) eseguono sul client www.taringamberini.com MVC Struts 1 21
  • 22. Java EE Containers Un componente viene deployato nel relativo Container www.taringamberini.com MVC Struts 1 22
  • 23. Dove si inserisce Struts? Struts rappresenta una implementazione del pattern MVC Struts offre uninfrastruttura su cui costruire una applicazione enterprise Multi-Tier www.taringamberini.com MVC Struts 1 23
  • 24. Struts 1 MVC Struts 1 A Web Application Framework Parte 2 di 2
  • 25. Struts mapping web.xml <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" ... > <servlet> <servlet-name>controller</servlet-name> <servle-class>org.apache.struts.action.ActionServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>controller</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app> www.taringamberini.com MVC Struts 1 25
  • 26. Struts configuration web.xml <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" ... > <servlet> <servlet-name>controller</servlet-name> <servle-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> </servlet> ... </web-app> www.taringamberini.com MVC Struts 1 26
  • 27. Struts Controller (MVC) Il Controller (RequestProcessor) traduce le interazioni fra utente e View in azioni dichiarativamente nello struts-config.xml <struts-config> <action-mappings> <action path="/login" type="login.LoginAction" name="loginForm" scope="request" input="/login.jsp"> <forward name="success" path="/logged.jsp" /> <forward name="failure" path="/failure.jsp" /> </action> </action-mappings> </struts-config> www.taringamberini.com MVC Struts 1 27
  • 28. Struts Controller (MVC) Il Controller delega lesecuzione delle azioni al Model tramite una classe de gestione dell'azione <struts-config> <action-mappings> <action path="/login" type="login.LoginAction" name="loginForm" scope="request" input="/login.jsp"> <forward name="success" path="/logged.jsp" /> <forward name="failure" path="/failure.jsp" /> </action> </action-mappings> </struts-config> www.taringamberini.com MVC Struts 1 28
  • 29. Struts Controller (MVC) Il Controller sceglie la successiva View in funzione del risultato dellesecuzione delle azioni da parte del Model <struts-config> <action-mappings> <action path="/login" type="login.LoginAction" name="loginForm" scope="request" input="/login.jsp"> <forward name="success" path="/logged.jsp" /> <forward name="failure" path="/failure.jsp" /> </action> </action-mappings> </struts-config> www.taringamberini.com MVC Struts 1 29
  • 30. Struts init() Il Web Container inizializza Struts invocando il metodo init() della ActionServlet: 1. Lettura delle risorse di messaggi interne di Struts 2. Lettura dal web.xml dei parametri di configurazione di Struts 3. Init. della configurazione: Parsing dello struts.config.xml (dtd) Creazione dell'oggetto ApplicationConfig Salvataggio dell'ApplicationConfig nel ServletContext 4. Init. delle risorse di messaggi Lettura dei vari message-resources.properties Salvataggio dei messaggi nel ServletContext Init. DataSource Init. Plug-in www.taringamberini.com MVC Struts 1 30
  • 31. La classe Action Un Action 竪 il ponte (Adapter) fra il contenuto di una richiesta HTTP e la logica di business Estendendo Action si possono progettare Action personalizzate che delegano l'elaborazione della richiesta HTTP all'appropriata logica di business Il controller di Struts (RequestProcessor) invoca il metodo execute(...) dell'Action www.taringamberini.com MVC Struts 1 31
  • 32. La classe Action public class LoginAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { // 1. ottiene i parametri dal form // 2. delega alla logica di business // 3. determina view successiva if (...) { return mapping.findForward("success"); } else { return mapping.findForward("failure"); } } } www.taringamberini.com MVC Struts 1 32
  • 33. Ciclo di vita di una Action RequestProcessor contiene una HashMap: Key: nome delle Action nello struts-config.xml Value: riferimento all'istanza della relativa Action 2. Struts, a fronte di una richiesta di un'Action, controlla l'HashMap: Se l'Action non 竪 ancora istanziata (Value==null) la istanzia, salvandone il riferimento nell'HashMap Se l'Action era gi stata istanziata ne ottiene il riferimento Action condivise fra pi湛 thread: thread-safe se progettate senza variabili di istanza www.taringamberini.com MVC Struts 1 33
  • 34. La classe ActionForward La classe ActionForward rappresenta una destinazione alla quale il controller inoltra il risultato dell'elaborazione della richiesta HTTP da parte del Business Una ActionForward pu嘆 essere: creato nell'Action ottenuto dal mapping dichiarato nello struts- config invocando mapping.findForward(...) www.taringamberini.com MVC Struts 1 34
  • 35. La classe ActionForward public class LoginAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { // 1. ottiene i parametri dal form // 2. delega alla logica di business // 3. determina view successiva if ( ... ) { return mapping.findForward("success"); } else { return mapping.findForward("failure"); } } } www.taringamberini.com MVC Struts 1 35
  • 36. Struts Model (MVC) Struts non offre granch辿 per progettare il Model Ricorso ad infrastrutture esterne a Struts: EJB Progetto di infrastrutture ad-hoc basate su: JavaBeans (BO, DAO, DTO) Pattern vari Object-to-Relational Mapping (iBatis, Hybernate) www.taringamberini.com MVC Struts 1 36
  • 37. Struts View (MVC) La View accede ai dati, attraverso il Model, e li presenta La presentazione sfrutta un'interfaccia utente visualizzata dal client all'interno di un web browser: HTML, CSS JSP con JSTL, con Struts custom tag Resource bundle Java www.taringamberini.com MVC Struts 1 37
  • 38. Struts View (MVC) La View mantiene consistenza fra il dato presentato ed il dato contenuto nel Model: Modalit pull (attiva): la View chiede al Model il dato corrente (il client 竪 un browser web che inoltra richieste HTTP) JSP con JSTL, con Struts custom tag ActionForm di Struts DTO www.taringamberini.com MVC Struts 1 38
  • 39. La classe ActionForm ActionForm 竪 impiegata per catturare i dati in ingresso da un form HTML e trasferirli alla classe Action ActionForm si interpone fra la View ed il Controller ActionForm agisce da buffer per i dati del form HTML mentre sono validati ActionForm sono JavaBeans: dati del form HTML memorizzati come properties www.taringamberini.com MVC Struts 1 39
  • 40. La classe ActionForm Gli ActionForm sono dichiarati nel file struts-config.xml nella sezione form-beans: <struts-config> <form-beans> <form-bean name="loginForm" type="login.LoginForm" /> <form-bean ... </form-beans> ... </struts-config> www.taringamberini.com MVC Struts 1 40
  • 41. La classe ActionForm Gli ActionForm sono associate alle Action attraverso il nome simbolico del form: <struts-config> <form-beans> <form-bean name="loginForm" type="login.LoginForm" /> </form-beans> <action-mappings> <action path="/login" type="login.LoginAction" name="loginForm" scope="request" input="/login.jsp"> <forward name="success" path="/logged.jsp" /> <forward name="failure" path="/failure.jsp" /> </action> </action-mappings> </struts-config> www.taringamberini.com MVC Struts 1 41
  • 42. La classe ActionForm Gli ActionForm possono essere messi in request od in session (default): <struts-config> <form-beans> <form-bean name="loginForm" type="login.LoginForm" /> </form-beans> <action-mappings> <action path="/login" type="login.LoginAction" name="loginForm" scope="request" input="/login.jsp"> <forward name="success" path="/logged.jsp" /> <forward name="failure" path="/failure.jsp" /> </action> </action-mappings> </struts-config> www.taringamberini.com MVC Struts 1 42
  • 43. La classe ActionForm Se fallisce la validazione dell'ActionForm si esegue forward all'input : <struts-config> <form-beans> <form-bean name="loginForm" type="login.LoginForm" /> </form-beans> <action-mappings> <action path="/login" type="login.LoginAction" name="loginForm" scope="request" input="/login.jsp"> <forward name="success" path="/logged.jsp" /> <forward name="failure" path="/failure.jsp" /> </action> </action-mappings> </struts-config> www.taringamberini.com MVC Struts 1 43
  • 44. Ciclo di vita di una ActionForm 1. Il controller riceve una richiesta HTTP 2. Crea o riusa ActionForm 3. Inizializza propriet dell' ActionForm: reset() 4. Salva ActionForm nello scope dichiarato 5. Popola ActionForm prendendo i dati dalla richiesta HTTP 6. Valida propriet dell'ActionForm: validate() se errore si esegue forward all'input 2. altrimenti invoca il metodo execute() dell'Action 3. Forward alla view successiva con ActionForm nello scope dichiarato www.taringamberini.com MVC Struts 1 44
  • 45. Inviare messaggi alla View ActionForm e Action permettono di salvare nella richiesta HTTP eventuali messaggi prima dell'inoltro alla View successiva ActionMessages rappresentano messaggi informativi ActionErrors (竪 un ActionMessages) rappresentano messaggi d'errore ActionMessages ed ActionErrors sono formati da insiemi di pi湛 ActionMessage www.taringamberini.com MVC Struts 1 45
  • 46. Messaggi da un ActionForm La validazione delle propriet di un ActionForm salva automaticamente nella richiesta Http gli ActionErrors impiegati per rappresentare insiemi di messaggi di errori di validazione public class LoginForm extends ActionForm { public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { ActionErrors actionErrors = new ActionErrors(); // se password troppo corta prepara un messaggio d'errore ActionMessage actionMessage = new ActionMessage( "login.form.validating.error.password.minLenght", getPasswordMinLenght()); actionErrors.add("password", actionMessage); return actionErrors; } } www.taringamberini.com MVC Struts 1 46
  • 47. Messaggi da un Action Un Action pu嘆 salvare nella richiesta HTTP sia ActionErrors, con saveErrors(), che ActionMessages con saveMessages() public class LoginAction extends Action { public ActionForward execute(...) { ... ActionMessage actionMessage = new ActionMessage("login.success", user); ActionMessages actionMessages = new ActionMessages(); actionMessages.add(ActionMessages.GLOBAL_MESSAGE, actionMessage); saveMessages(request.getSession(), actionMessages); return mapping.findForward("success"); } } www.taringamberini.com MVC Struts 1 47
  • 48. Struts Custom Tag Library - HTML Utilizzata per interagire con tag HTML: input form, checkbox, image, link, submit, text, textarea, ecc... Dichiarazione nel web.xml (optional dalla 2.4): <taglib> <taglib-uri> http://struts.apache.org/tags-html</taglib-uri> <taglib-location>/WEB-INF/struts-html.tld</taglib-location> </taglib> Dichiarazione in una JSP: <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %> www.taringamberini.com MVC Struts 1 48
  • 49. Struts Custom Tag Library - HTML Esempio di una JSP da cui effettuare il login: <html:form action="/login.do"> <p><bean:message key="login.form.userName" /> <html:text property="userName" /></p> <p><bean:message key="login.form.password" /> <html:password property="password" /></p> <p><html:checkbox property="forgotPassword" /> <bean:message key="login.form.forgotPassword" /></p> <html:submit /> </html:form> www.taringamberini.com MVC Struts 1 49
  • 50. Struts Custom Tag Library - Bean Utilizzata per interagire con JavaBeans e resource bundle: write, message, ecc... Dichiarazione nel web.xml (optional dalla 2.4): <taglib> <taglib-uri>http://struts.apache.org/tags-bean</taglib-uri> <taglib-location>/WEB-INF/struts-bean.tld</taglib-location> </taglib> Dichiarazione in una JSP: <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %> www.taringamberini.com MVC Struts 1 50
  • 51. Struts Custom Tag Library - Bean Esempio di una JSP dopo il login: <p><bean:write name= loginForm property=userName /> <bean:message key="logged.success" /></p> Ove possibile preferire a <bean:write> il <c:out> della JSTL: <p><c:out value="loginForm.userName"/> <bean:message key="logged.success" /></p> www.taringamberini.com MVC Struts 1 51
  • 52. Struts Custom Tag Library - Logic Utilizzata per inserimento di HTML dinamico in modo condizionale o iterativo: equal, notEqual, greaterThan, lessEqual, iterate, ecc... Dichiarazione nel web.xml (optional dalla 2.4): <taglib> <taglib-uri>http://struts.apache.org/tags-logic</taglib-uri> <taglib-location>/WEB-INF/struts-logic.tld</taglib-location> </taglib> Dichiarazione in una JSP: <%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %> www.taringamberini.com MVC Struts 1 52
  • 53. Struts Custom Tag Library - Logic Inserimento condizionale: <logic:equal name="profiloUtenteForm" property="lettura" value="true"> <p><bean:message key="login.form.userName" /> <html:text property="userName" disabled="true" /></p> </logic:equal> Ove possibile preferire a <logic:equal> il <c:if> della JSTL: <c:if test="${profiloUtenteForm.lettura eq 'true'}"> <p><bean:message key="login.form.userName" /> <html:text property="userName" disabled="true" /></p> </c:if> www.taringamberini.com MVC Struts 1 53
  • 54. Struts Custom Tag Library - Logic Inserimento iterativo: <logic:iterate id="utente" name="listaUtentiForm" property="listaUtenti" indexId="index"> <tr> <td><bean:write name="index" /></td> <td><bean:write name="utente" property="userName" /></td></tr> </logic:iterate> Ove possibile preferire a <logic:equal> il <c:if> della JSTL: <c:forEach var="utente" items="${listaUtentiForm.listaUtenti}" varStatus="loopTagStatus"> <tr> <td>${loopTagStatus.index + 1 }</td> <td>${utente.userName}</td></tr> </c:forEach> www.taringamberini.com MVC Struts 1 54
  • 55. I18N Resource bundle conformi alle convenzioni della classe java.util.PropertyResourceBundle: File di testo con estensione .properties Ogni riga contiene una coppia key=value Es. di un MessageResources_it.properties: login.form.userName=Utente login.form.password=Password login.success=L'utente {0} si 竪 loggato con successo. Ultimo accesso il {1} alle ore {2}. www.taringamberini.com MVC Struts 1 55
  • 56. Bibliografia JavaServer Pages Model 2 architecture: http://www.javaworld.com/javaworld/jw-12-1999/jw-12-ssj- jspmvc.html Java BluePrints Enterprise Patterns: http://java.sun.com/blueprints/patterns/MVC.html The Java EE 5 Tutorial: http://java.sun.com/javaee/5/docs/tutorial/doc/p1.html Struts 1 User Guide: http://struts.apache.org/1.3.9/userGuide/index.html Programmare con Jakarta Struts Chuck Cavaness Ulrico Hoepli Editore 2003 Jakarta-Struts Live Richard Hightower SourceBeat, LLC, Higland Ranch, Colorado - 2004 www.taringamberini.com MVC Struts 1 56