SlideShare ist ein Scribd-Unternehmen logo
1 von 56
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 è un’astrazione (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 nell’accesso 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 dell’utente 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 l’esecuzione delle azioni al
         Model
        Il Controller sceglie la successiva View in
         funzione del risultato dell’esecuzione 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
         all’interno 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 un’infrastruttura 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 l’esecuzione 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
      dell’esecuzione 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

Weitere ähnliche Inhalte

Was ist angesagt?

Sviluppo Web Agile Con MonoRail
Sviluppo Web Agile Con MonoRailSviluppo Web Agile Con MonoRail
Sviluppo Web Agile Con MonoRailStefano 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 SpringMarcello 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 MicrosoftStefano 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 TempiMarco Parenzan
 
Niccolò Becchi: Introduzione a GWT
Niccolò Becchi: Introduzione a GWTNiccolò Becchi: Introduzione a GWT
Niccolò Becchi: Introduzione a GWTfirenze-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 WebMassimiliano 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 BenedettiGiuneco 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 WebMassimiliano 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 GrecoGiuneco 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 applicationsDotNetCampus
 
Slide Prelaurea. Alessandro Andreosè
Slide Prelaurea. Alessandro AndreosèSlide Prelaurea. Alessandro Andreosè
Slide Prelaurea. Alessandro Andreosèguesta10af3
 

Was ist angesagt? (20)

Sviluppo Web Agile Con MonoRail
Sviluppo Web Agile Con MonoRailSviluppo Web Agile Con MonoRail
Sviluppo Web Agile Con MonoRail
 
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
 
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
 
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
 
Niccolò Becchi: Introduzione a GWT
Niccolò Becchi: Introduzione a GWTNiccolò Becchi: Introduzione a GWT
Niccolò Becchi: Introduzione a GWT
 
Spring @Aspect e @Controller
Spring @Aspect e @Controller Spring @Aspect e @Controller
Spring @Aspect e @Controller
 
ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
 
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)
 
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
 
Introduzione WPF
Introduzione WPFIntroduzione WPF
Introduzione WPF
 
Asp.Net MVC 5
Asp.Net MVC 5Asp.Net MVC 5
Asp.Net MVC 5
 
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)
 
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
 
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
 
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
 
Angularjs
AngularjsAngularjs
Angularjs
 
Knockout.js
Knockout.jsKnockout.js
Knockout.js
 
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
 
Slide Prelaurea. Alessandro Andreosè
Slide Prelaurea. Alessandro AndreosèSlide Prelaurea. Alessandro Andreosè
Slide Prelaurea. Alessandro Andreosè
 
Spring Intro
Spring IntroSpring Intro
Spring Intro
 

Ähnlich wie MVC and Struts 1

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 TourAndrea 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 HTMLSinergia Totale
 
Asp.NET MVC Framework
Asp.NET MVC FrameworkAsp.NET MVC Framework
Asp.NET MVC FrameworkDotNetMarche
 
Alessandro Forte - MVP vs MVC
Alessandro Forte - MVP vs MVCAlessandro Forte - MVP vs MVC
Alessandro Forte - MVP vs MVCAlessandro Forte
 
Web Api – The HTTP Way
Web Api – The HTTP WayWeb Api – The HTTP Way
Web Api – The HTTP WayLuca Milan
 
Zend Framework Workshop Parte1
Zend Framework Workshop Parte1Zend Framework Workshop Parte1
Zend Framework Workshop Parte1massimiliano.wosz
 
Fe02 ria con breeze e knockout
Fe02   ria con breeze e knockoutFe02   ria con breeze e knockout
Fe02 ria con breeze e knockoutDotNetCampus
 
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
 
Hands on MVC - Mastering the Web
Hands on MVC - Mastering the WebHands on MVC - Mastering the Web
Hands on MVC - Mastering the WebClaudio 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 6Michele 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 SitoDavide 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 3DomusDotNet
 
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 MVVMRiccardo Cardin
 
SUE AGILE Framework (Italiano)
SUE AGILE Framework (Italiano)SUE AGILE Framework (Italiano)
SUE AGILE Framework (Italiano)Sabino Labarile
 

Ähnlich wie MVC and Struts 1 (20)

ASP.NET MVC: Full Throttle
ASP.NET MVC: Full ThrottleASP.NET MVC: Full Throttle
ASP.NET MVC: Full Throttle
 
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
 
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
 
Asp.NET MVC Framework
Asp.NET MVC FrameworkAsp.NET MVC Framework
Asp.NET MVC Framework
 
Alessandro Forte - MVP vs MVC
Alessandro Forte - MVP vs MVCAlessandro Forte - MVP vs MVC
Alessandro Forte - MVP vs MVC
 
Web Api – The HTTP Way
Web Api – The HTTP WayWeb Api – The HTTP Way
Web Api – The HTTP Way
 
Zend Framework Workshop Parte1
Zend Framework Workshop Parte1Zend Framework Workshop Parte1
Zend Framework Workshop Parte1
 
Fe02 ria con breeze e knockout
Fe02   ria con breeze e knockoutFe02   ria con breeze e knockout
Fe02 ria con breeze e knockout
 
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%
 
Introduzione a Struts
Introduzione a StrutsIntroduzione a Struts
Introduzione a Struts
 
AngularJS-Intro
AngularJS-IntroAngularJS-Intro
AngularJS-Intro
 
Hands on MVC - Mastering the Web
Hands on MVC - Mastering the WebHands on MVC - Mastering the Web
Hands on MVC - Mastering the Web
 
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
 
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!!
 
Progetto SOD Davide Sito
Progetto SOD Davide SitoProgetto SOD Davide Sito
Progetto SOD 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
 
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
 
SUE AGILE Framework (Italiano)
SUE AGILE Framework (Italiano)SUE AGILE Framework (Italiano)
SUE AGILE Framework (Italiano)
 
Novità di Asp.Net 4.0
Novità di Asp.Net 4.0Novità di Asp.Net 4.0
Novità di Asp.Net 4.0
 
ASP.NET MVC Intro
ASP.NET MVC IntroASP.NET MVC Intro
ASP.NET MVC Intro
 

Mehr von 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 practicesTarin Gamberini
 

Mehr von 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)
 
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
 
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
 
Commit messages - Good practices
Commit messages - Good practicesCommit messages - Good practices
Commit messages - Good practices
 
Apache Maven
Apache MavenApache Maven
Apache Maven
 
Log4j in 8 slides
Log4j in 8 slidesLog4j in 8 slides
Log4j in 8 slides
 

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 è un’astrazione (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 nell’accesso 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 dell’utente 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 l’esecuzione delle azioni al Model  Il Controller sceglie la successiva View in funzione del risultato dell’esecuzione 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 all’interno 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 un’infrastruttura 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 l’esecuzione 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 dell’esecuzione 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