01 introducción
TRANSCRIPT
mayo de 2005
Introducción modelo MVC y arquitectura Struts
¿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" type="app.LogonAction" name="logonForm" scope="request" validate="true" input="/pages/logon.jsp"/></action-mappings>
Clase derivada de ActionMapping
¿Requiere validación?
URI
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/MVC.htm
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