Introducción modelo MVC y arquitectura Struts


                    mayo de 2005
¿Qué es STRUTS?
   Strut: “Componente estructural no visible
    que soporta una construcción o
    estructura”
   Framework Opensource para construir
    aplicaciones web Java
       Parte de proyecto Jakarta de Apache
       Se basa en JavaBeans, ResourceBundles,
        XML, Jakarta Commons
       Fomenta el modelo MVC Model 2
Tecnologías subyacentes (I)
       HTTP
         Protocolo original para transporte HTML
         Hoy transporte genérico de archivos
         Sin estado  “solución” cookies y reescritura de URLs
         Petición (GET, POST)  Respuesta (RESPONSE)
       Common Gateway Interface (CGI)
         Origen del “web dinámico”
         Programas ejecutados por Servidor Web
         Dependientes de plataforma y necesitan “entender” HTML y
          HTTP
         Sin estandarización
Tecnologías subyacentes (II)
       Java Servlets
         Resuelven dos problemas de CGIs:
             Rendimiento: Una instancia múltiples hilos
             Portabilidad: write-once run-anywhere
             Abstracción de sesión, petición, respuesta en base objetos Java.
         Clases java que corren en contenedores (Tomcat, Jrun,
          Weblogic, …)
             Conexión: Servidor web (Apache, IIS) pasa al contenedor ciertas
              URLs
             Autónomo: El contenedor incorpora servidor web
         Inconvenientes:
             Misma pega que CGIs  Programa renderiza html

          out.println("<P>One line of HTML.</P>");
          out.println("<P>Another line of HTML.</P>");
Tecnologías subyacentes (III)
       Java Server Pages (JSP)
          Servlet del “revés” página HTML con inserciones de código.
          Contenido dinámico:
             Inserción código Java:
                 Expresiones: <%= %>

              <B> Hora de visita de esta página: <%= new Date() %></B>

                 Scriptlets <% %>
                 Declaraciones <!% %>
             JSP Tags (mayor limpieza que insertar código):
                 Incorporadas (JSTL)
                 Extensible  Taglibs (Struts, definidas por usuario).
       Alternativas en otros lenguajes:
          ASP (VisualBasic, .Net)
          PHP
Tecnologías subyacentes (IV)
   Java Beans
       Clases java con estructura común
           Propiedades privadas (datos)
           Métodos de acceso públicos:
               Lectura (accessors): getPropiedad() isPropiedad()
               Escritura (mutators): setPropiedad()
       Manipulables por introspección (sin
        necesidad de conocer nombre de
        propiedades)
       Estándar de paso de variables a JSPs
JSP Model 1
   JSP Model 1. Primera recomendación
    diseño de aplicaciones web en base a
    JSPs
       JSPs, JavaBeans, JDBC
   Vigente para aplicaciones sencillas
Problemas Model 1
       Código spaguetti:
          Lógica compleja conduce a diversos flujos que se entremezclan
           dentro de un JSP (condiciones y bucles)
       Difícil reutilización
          Cada JSP suele ser autocontenida, incorpora toda la funcionalidad.
           Prácticas Copy&Paste (repetición de funcionalidad)
       El código tiende a ser no modular
          Las actualizaciones requieren modificaciones en muchos sitios. Dificil
           de modificar aspecto.
       Tareas entremezcladas (perdida de eficiencia)
          Diseñador gráfico debe saber programar y/o programador diseñar
           interfaces gráficas.
       Depuración problemática
          Los contenedores de servlets devuelve error en línea de JSP
           convertido a Servlet.
Origen MVC
       Finales de los 70  Aparecen GUIs
       MVC (Model – View – Controller):
          Comienzos de los 80 framework de Smalltalk para crear interfaces de
           usuario
       Partes:
          Modelo: Sistema contenedor de datos
          Vista: Sistema de presentación (salida)
          Controlador: Lógica de interacción usuario (entrada)
Model 2
       Especificación 0.92 de Servlets/JSP introduce la arquitectura Model 2.
          Incorpora conceptos de MVC  A veces se conoce MVC2 o Web MVC
       Separación lógica/presentación:
          Datos representados en JavaBeans (modelo), que contienen lógica de
           negocio y estado de la aplicación.
          Servlets (controlador) gestionan acceso a datos y el flujo de navegación
           (controlador)
          JSPs gestionan la presentación (vista).
¿Por qué Struts?
       Aplicaciones web componentes críticos para
        empresas:
         Listas en tiempo record
         Deben durar
       Gran cantidad de tecnologías disponibles Java
         Presentación: JSPs, plantillas Velocity
         Manejo de BBDD: JDBC y EJBs

       ¿Cómo juntamos todo en tiempo record?
                      Struts
Introducción Struts
       Struts:
          Elemento central  Controlador MVC. Puente entre vista y
           controlador
          Incorpora elementos necesarios “invisibles” comunes a toda
           aplicación web profesional
       Beneficios
          Refuerza la modularidad y partición de la aplicación
          Incrementa la separación de roles
          Incrementa la manejabilidad del código
          Incrementa la extensibilidad del código
          Centra al desarrollador en la lógica de negocio.
          Reduce el TCO de una aplicación, reduciendo sus costes de
           desarrollo y mantenimiento
Arquitectura
       Componentes del sistema:
         Modelo:
             Combinación de EJBs, Java Beans y clases derivadas de la clase
              de Struts ActionForm
         Vista:
             Representada por JSPs, para los cuales Struts proporciona
              librerías de JSP Tags. Aunque no obliga a usar JSPs, favorece
              su utilización.
         Controlador:
             Implementado a través del servlet ActionServlet que llama a las
              clases derivadas de Action que se definan.
       Configuración:
         A través del fichero web.xml (común a toda aplicación web) y
          el fichero struts-config.xml (común a toda aplicación que haga
          uso de struts)
Componentes Controlador (I)
       Interacción con el usuario:
         Formularios  Recogen información de usuario.
         Acciones (Actions)  Envían datos de formularios.
         Hiperenlaces  Envían usuario a otra pág.
       Componentes principales de Struts:
         ActionForm. Permite definir formularios e
          hiperenlaces
         Actions a medida. Derivando de la clase base
          Action se implentan acciones.
Componentes Controlador (II)
   Hiperenlaces:
       Enlace a un recurso en la aplicación
       Modelados a través de clase
        ActionForward.
       Definidos por configuración. Ejemplo:
        <forward name="welcome“
         path="/pages/index.jsp"/>
       JSPs y otros componentes lo referenciarán
        por el nombre (“welcome”)
Componentes Controlador (III)
       Formularios:
          HTML y HTTP proporcionan mecanismos para enviar información de usuario
           a la aplicación
          Struts proporciona la clase ActionForm.
              Son JavaBeans con métodos para validar los datos recibidos
          El desarrollador sólo define el ActionForm y Struts mapea automáticamente
           sus propiedades con campos del formulario HTML con el mismo nombre.

           public final class LogonForm extends ActionForm {
              private String username = null;
              public String getUsername() {
                 return (this.username);
              }
              public void setUsername(String username) {
                 this.username = username;
              }
           }
Componentes Controlador (IV)
   Formularios:
       Referencia desde configuración:
        <form-bean
        name="articleForm"
        type="org.apache.artimus.struts.Form"/>
Componentes Controlador (V)
       Actions a medida:
         En un formulario “action” es a dónde van dirigidos los datos
         Struts proporciona Action para recoger los datos en cuestión,
          que se le proporcionan a través de un ActionForm.
         Ejemplo:
          public final class LogonAction extends Action {
            public ActionForward perform(ActionMapping mapping,
                                     ActionForm form,
                                     HttpServletRequest request,
                                     HttpServletResponse response)
                        throws IOException, ServletException {
              MyForm myForm = (MyForm) form;
               // ...
               return mapping.findForward("continue");
            }
          }
Componentes Controlador (VI)
       Actions a medida:
          Desde la versión 1.1 de Struts se prefiere el método execute() frente a
           perform()
       ActionMapping.
       De cara al exterior sirve para proporcionar una URI a un Action determinado.
       Se especifica por configuración.
       Ejemplo:
    <action-mappings>
    <action
            path="/logonSubmit"                               URI
            type="app.LogonAction"
            name="logonForm"                              Clase derivada
            scope="request"                              de ActionMapping
            validate="true"
            input="/pages/logon.jsp"/>                           ¿Requiere
    </action-mappings>                                           validación?
Componentes Controlador (VII)

   ActionServlet:
       Pieza central. “Reparte el juego”.
       Recibe todas las peticiones y redirecciona al
        action determinado. También completa y
        valida los ActionForms.
       Extensible. Puede extenderse a través de
        subclases (no habitual).
Componentes Modelo (I)

       JavaBeans:
         No son parte de Struts, sino son parte de
          especificación de Java.
         Struts no fija en dónde se almacena el modelo
          (EJBs, BBDD relacional, servidor LDAP).
         Habitualmente relacionados con ActionForms.
            Recomendable separarlos
            Struts ofrece funcionalidad para “mapear” propiedades de
             ActionForm a JavaBean del modelo
Componentes Vista (I)

       JSPs:
         Struts no obliga utilizar JSPs para la vista, podría
          utilizarse otras alternativas (templates velocity).
         Struts incluye librerías de tags.
            Facilitan interacción con componentes de controlador
            Incorporan lógica útil (p.e. facilidad para incorporar bucles
             en presentación)
            Incorporan funcionalidad adicional: Soporte para
             internacionalización.
         Alguna funcionalidad se ha incorporado en la
          especificación JSTL (Struts es anterior a JSTL)
Componentes Vista (II)
       JSPs:
         struts-html.tld. Tags JSP que encapsulan componentes de
          formularios HTML.

                JSP “normal”: <input type="text"
                name="username“
                             value="<
                %=loginBean.getUsername() >"/>
                Tags Struts:    <html:text
                property="username"/>


         struts-bean.tld. Tags JSP para el manejo de beans y soporte
          de internacionalización adicional al nativo de Java (parte de
          funcionalidad en JSTL).
Componentes Vista (III)
       JSPs:
         struts-logic.tld. Tags para testear valores de
          propiedades (mucha funcionalidad presente en
          JSTL), iterar sobre colecciones, etc.
            Ejemplo. Iteración sobre beans de una HashTable:
             <logic:iterate id="element" name="myhashtable">
                Next element is <bean:write
                                  name="element“
                                  property="value"/>
             </logic:iterate>


         struts-nested.tld. Tags JSP que permiten acceder
          de forma ordenada a beans encapsulados en otros
          beans (anidamiento).
Componentes Vista (IV)

       JSPs:
         struts-tiles.tld. Tags para crear bloques
          reutilizables de presentación (tiles). Facilita cambiar
          el aspecto general de una aplicación (Look & Feel).
            Se basa en la directiva include de los JSPs
            Permite crear definiciones de pantalla en base a bloques:
             cabecera, pie, menu, cuerpo, etc.
            Permite definir distribuciones uniformes para todo el sitio (layouts)
            Ofrece un soporte alternativo para internacionalización (Tiles
             diferentes dependiendo del Locale).
            Vistas diferentes según roles, tipo de navegador, etc.
Configuración (I)
   web.xml:
       Todo lo que recibe el ServletContainer va a
        parar al ActionServlet.
       Mapping de URLs (2 esquemas):
           *.do
           /do/*
       Especificación de qué librerías de tags se
        van a utilizar (incluir taglibs adecuadas)
            <taglib>
               <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
               <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
            </taglib>
Configuración (II)
       ApplicationResources.properties
         Fichero properties utilizado por defecto para las
          etiquetas de los mensajes internacionalizados.
       struts-config.xml:
         Los componentes están débilmente acoplados para
          permitir reutilización e independencia unos de otros
         Struts-config.xml configura la relación entre ellos.
         Define principalmente:
             Action-mappings: Qué Actions ha de aceptar el
              ActionServlet
             Form-beans: Las clases ActionForms que aceptará como
              entrada la aplicación
Configuración (III)
   Ejemplo struts-config.xml:
Todo en uno
Referencias
       MVC:
         http://ootips.org/mvc-pattern.html
         http://www.object-arts.com/EducationCentre/Overviews/M
       JSP/Servlets:
         http://java.sun.com/products/servlet/
         http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/
       Struts:
         http://struts.apache.org/
         http://rollerjm.free.fr/pro/Struts11.html

01 introducción

  • 1.
    Introducción modelo MVCy arquitectura Struts mayo de 2005
  • 2.
    ¿Qué es STRUTS?  Strut: “Componente estructural no visible que soporta una construcción o estructura”  Framework Opensource para construir aplicaciones web Java  Parte de proyecto Jakarta de Apache  Se basa en JavaBeans, ResourceBundles, XML, Jakarta Commons  Fomenta el modelo MVC Model 2
  • 3.
    Tecnologías subyacentes (I)  HTTP  Protocolo original para transporte HTML  Hoy transporte genérico de archivos  Sin estado  “solución” cookies y reescritura de URLs  Petición (GET, POST)  Respuesta (RESPONSE)  Common Gateway Interface (CGI)  Origen del “web dinámico”  Programas ejecutados por Servidor Web  Dependientes de plataforma y necesitan “entender” HTML y HTTP  Sin estandarización
  • 4.
    Tecnologías subyacentes (II)  Java Servlets  Resuelven dos problemas de CGIs:  Rendimiento: Una instancia múltiples hilos  Portabilidad: write-once run-anywhere  Abstracción de sesión, petición, respuesta en base objetos Java.  Clases java que corren en contenedores (Tomcat, Jrun, Weblogic, …)  Conexión: Servidor web (Apache, IIS) pasa al contenedor ciertas URLs  Autónomo: El contenedor incorpora servidor web  Inconvenientes:  Misma pega que CGIs  Programa renderiza html out.println("<P>One line of HTML.</P>"); out.println("<P>Another line of HTML.</P>");
  • 5.
    Tecnologías subyacentes (III)  Java Server Pages (JSP)  Servlet del “revés” página HTML con inserciones de código.  Contenido dinámico:  Inserción código Java:  Expresiones: <%= %> <B> Hora de visita de esta página: <%= new Date() %></B>  Scriptlets <% %>  Declaraciones <!% %>  JSP Tags (mayor limpieza que insertar código):  Incorporadas (JSTL)  Extensible  Taglibs (Struts, definidas por usuario).  Alternativas en otros lenguajes:  ASP (VisualBasic, .Net)  PHP
  • 6.
    Tecnologías subyacentes (IV)  Java Beans  Clases java con estructura común  Propiedades privadas (datos)  Métodos de acceso públicos:  Lectura (accessors): getPropiedad() isPropiedad()  Escritura (mutators): setPropiedad()  Manipulables por introspección (sin necesidad de conocer nombre de propiedades)  Estándar de paso de variables a JSPs
  • 7.
    JSP Model 1  JSP Model 1. Primera recomendación diseño de aplicaciones web en base a JSPs  JSPs, JavaBeans, JDBC  Vigente para aplicaciones sencillas
  • 8.
    Problemas Model 1  Código spaguetti:  Lógica compleja conduce a diversos flujos que se entremezclan dentro de un JSP (condiciones y bucles)  Difícil reutilización  Cada JSP suele ser autocontenida, incorpora toda la funcionalidad. Prácticas Copy&Paste (repetición de funcionalidad)  El código tiende a ser no modular  Las actualizaciones requieren modificaciones en muchos sitios. Dificil de modificar aspecto.  Tareas entremezcladas (perdida de eficiencia)  Diseñador gráfico debe saber programar y/o programador diseñar interfaces gráficas.  Depuración problemática  Los contenedores de servlets devuelve error en línea de JSP convertido a Servlet.
  • 9.
    Origen MVC  Finales de los 70  Aparecen GUIs  MVC (Model – View – Controller):  Comienzos de los 80 framework de Smalltalk para crear interfaces de usuario  Partes:  Modelo: Sistema contenedor de datos  Vista: Sistema de presentación (salida)  Controlador: Lógica de interacción usuario (entrada)
  • 10.
    Model 2  Especificación 0.92 de Servlets/JSP introduce la arquitectura Model 2.  Incorpora conceptos de MVC  A veces se conoce MVC2 o Web MVC  Separación lógica/presentación:  Datos representados en JavaBeans (modelo), que contienen lógica de negocio y estado de la aplicación.  Servlets (controlador) gestionan acceso a datos y el flujo de navegación (controlador)  JSPs gestionan la presentación (vista).
  • 11.
    ¿Por qué Struts?  Aplicaciones web componentes críticos para empresas:  Listas en tiempo record  Deben durar  Gran cantidad de tecnologías disponibles Java  Presentación: JSPs, plantillas Velocity  Manejo de BBDD: JDBC y EJBs  ¿Cómo juntamos todo en tiempo record? Struts
  • 12.
    Introducción Struts  Struts:  Elemento central  Controlador MVC. Puente entre vista y controlador  Incorpora elementos necesarios “invisibles” comunes a toda aplicación web profesional  Beneficios  Refuerza la modularidad y partición de la aplicación  Incrementa la separación de roles  Incrementa la manejabilidad del código  Incrementa la extensibilidad del código  Centra al desarrollador en la lógica de negocio.  Reduce el TCO de una aplicación, reduciendo sus costes de desarrollo y mantenimiento
  • 13.
    Arquitectura  Componentes del sistema:  Modelo:  Combinación de EJBs, Java Beans y clases derivadas de la clase de Struts ActionForm  Vista:  Representada por JSPs, para los cuales Struts proporciona librerías de JSP Tags. Aunque no obliga a usar JSPs, favorece su utilización.  Controlador:  Implementado a través del servlet ActionServlet que llama a las clases derivadas de Action que se definan.  Configuración:  A través del fichero web.xml (común a toda aplicación web) y el fichero struts-config.xml (común a toda aplicación que haga uso de struts)
  • 14.
    Componentes Controlador (I)  Interacción con el usuario:  Formularios  Recogen información de usuario.  Acciones (Actions)  Envían datos de formularios.  Hiperenlaces  Envían usuario a otra pág.  Componentes principales de Struts:  ActionForm. Permite definir formularios e hiperenlaces  Actions a medida. Derivando de la clase base Action se implentan acciones.
  • 15.
    Componentes Controlador (II)  Hiperenlaces:  Enlace a un recurso en la aplicación  Modelados a través de clase ActionForward.  Definidos por configuración. Ejemplo: <forward name="welcome“ path="/pages/index.jsp"/>  JSPs y otros componentes lo referenciarán por el nombre (“welcome”)
  • 16.
    Componentes Controlador (III)  Formularios:  HTML y HTTP proporcionan mecanismos para enviar información de usuario a la aplicación  Struts proporciona la clase ActionForm.  Son JavaBeans con métodos para validar los datos recibidos  El desarrollador sólo define el ActionForm y Struts mapea automáticamente sus propiedades con campos del formulario HTML con el mismo nombre. public final class LogonForm extends ActionForm { private String username = null; public String getUsername() { return (this.username); } public void setUsername(String username) { this.username = username; } }
  • 17.
    Componentes Controlador (IV)  Formularios:  Referencia desde configuración: <form-bean name="articleForm" type="org.apache.artimus.struts.Form"/>
  • 18.
    Componentes Controlador (V)  Actions a medida:  En un formulario “action” es a dónde van dirigidos los datos  Struts proporciona Action para recoger los datos en cuestión, que se le proporcionan a través de un ActionForm.  Ejemplo: public final class LogonAction extends Action { public ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { MyForm myForm = (MyForm) form; // ... return mapping.findForward("continue"); } }
  • 19.
    Componentes Controlador (VI)  Actions a medida:  Desde la versión 1.1 de Struts se prefiere el método execute() frente a perform()  ActionMapping.  De cara al exterior sirve para proporcionar una URI a un Action determinado.  Se especifica por configuración.  Ejemplo: <action-mappings> <action path="/logonSubmit" URI type="app.LogonAction" name="logonForm" Clase derivada scope="request" de ActionMapping validate="true" input="/pages/logon.jsp"/> ¿Requiere </action-mappings> validación?
  • 20.
    Componentes Controlador (VII)  ActionServlet:  Pieza central. “Reparte el juego”.  Recibe todas las peticiones y redirecciona al action determinado. También completa y valida los ActionForms.  Extensible. Puede extenderse a través de subclases (no habitual).
  • 21.
    Componentes Modelo (I)  JavaBeans:  No son parte de Struts, sino son parte de especificación de Java.  Struts no fija en dónde se almacena el modelo (EJBs, BBDD relacional, servidor LDAP).  Habitualmente relacionados con ActionForms.  Recomendable separarlos  Struts ofrece funcionalidad para “mapear” propiedades de ActionForm a JavaBean del modelo
  • 22.
    Componentes Vista (I)  JSPs:  Struts no obliga utilizar JSPs para la vista, podría utilizarse otras alternativas (templates velocity).  Struts incluye librerías de tags.  Facilitan interacción con componentes de controlador  Incorporan lógica útil (p.e. facilidad para incorporar bucles en presentación)  Incorporan funcionalidad adicional: Soporte para internacionalización.  Alguna funcionalidad se ha incorporado en la especificación JSTL (Struts es anterior a JSTL)
  • 23.
    Componentes Vista (II)  JSPs:  struts-html.tld. Tags JSP que encapsulan componentes de formularios HTML. JSP “normal”: <input type="text" name="username“ value="< %=loginBean.getUsername() >"/> Tags Struts: <html:text property="username"/>  struts-bean.tld. Tags JSP para el manejo de beans y soporte de internacionalización adicional al nativo de Java (parte de funcionalidad en JSTL).
  • 24.
    Componentes Vista (III)  JSPs:  struts-logic.tld. Tags para testear valores de propiedades (mucha funcionalidad presente en JSTL), iterar sobre colecciones, etc.  Ejemplo. Iteración sobre beans de una HashTable: <logic:iterate id="element" name="myhashtable"> Next element is <bean:write name="element“ property="value"/> </logic:iterate>  struts-nested.tld. Tags JSP que permiten acceder de forma ordenada a beans encapsulados en otros beans (anidamiento).
  • 25.
    Componentes Vista (IV)  JSPs:  struts-tiles.tld. Tags para crear bloques reutilizables de presentación (tiles). Facilita cambiar el aspecto general de una aplicación (Look & Feel).  Se basa en la directiva include de los JSPs  Permite crear definiciones de pantalla en base a bloques: cabecera, pie, menu, cuerpo, etc.  Permite definir distribuciones uniformes para todo el sitio (layouts)  Ofrece un soporte alternativo para internacionalización (Tiles diferentes dependiendo del Locale).  Vistas diferentes según roles, tipo de navegador, etc.
  • 26.
    Configuración (I)  web.xml:  Todo lo que recibe el ServletContainer va a parar al ActionServlet.  Mapping de URLs (2 esquemas):  *.do  /do/*  Especificación de qué librerías de tags se van a utilizar (incluir taglibs adecuadas) <taglib> <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri> <taglib-location>/WEB-INF/struts-bean.tld</taglib-location> </taglib>
  • 27.
    Configuración (II)  ApplicationResources.properties  Fichero properties utilizado por defecto para las etiquetas de los mensajes internacionalizados.  struts-config.xml:  Los componentes están débilmente acoplados para permitir reutilización e independencia unos de otros  Struts-config.xml configura la relación entre ellos.  Define principalmente:  Action-mappings: Qué Actions ha de aceptar el ActionServlet  Form-beans: Las clases ActionForms que aceptará como entrada la aplicación
  • 28.
    Configuración (III)  Ejemplo struts-config.xml:
  • 29.
  • 30.
    Referencias  MVC:  http://ootips.org/mvc-pattern.html  http://www.object-arts.com/EducationCentre/Overviews/M  JSP/Servlets:  http://java.sun.com/products/servlet/  http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/  Struts:  http://struts.apache.org/  http://rollerjm.free.fr/pro/Struts11.html