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