Struts [parte I]

Documentos relacionados
DESARROLLO DE APLICACIONES WEB Introducción a Struts Framework

Java Struts Framework. Juan Fco. Rodríguez Hervella

Especialista Universitario Java Enterprise. Struts. Sesión 4: Introducción a Struts Depto. Ciencia de la Computación e IA

Lección 1 Introducción a Struts. uacosta@globalmentoring.com.mx

FUNCIONAMIENTO: FUNCIONALIDAD

La vista: ActionForms y taglibs propias

A continuación en la figura D.1 se verá el código de una implementación del archivo struts-config.xml:

Struts. Índice. Copyright Dept. Ciencia de la Computación e IA All rights reserved.

DIPLOMATURA DESARROLLO DE APLICACIONES JAVA

Fundamentos para el desarrollo de aplicaciones en la red. Tema: Frameworks de desarrollo sobre páginas JSP. Autor: Elías Niño

Requisitos. Universidad ORT Arquitectura de Software

Ficha Técnica. Categoría. Contenido del Pack. Sinopsis. Programación. - 2 Manual Teórico - 1 Cuaderno de Ejercicios - 1 CDROM

4.4 Tutorial de JSP 2.0, JSTL y Apache Struts

Mario Muñoz Organero & Norberto Fernández * Departamento de Ingeniería Telemática

4. CODIFICACIÓN. Previo a la codificación además de instalar las respectivas herramientas es. importante tenerlas bien configuradas.

3.1 Escribiendo una aplicación en Struts

Diseño e implementación de una tienda electrónica mediante Struts y SOAP. Rocío López Valladolid Tutor: Dr. Abelardo Pardo Sánchez

Curso Desarrollo Java Web con JSP, Servlets y el MVC

JSP (I) Aplicaciones Distribuidas

Figura 7-1 Enlace para instalar el servidor web Apache Jakarta Tomcat

Temario curso Desarrollo de Aplicaciones Empresariales con Spring Framework Core 4

4. DESARROLLO WEB CON JAVA JSP & SERVLETS

Curso Java Web (JSP's/Servlets)

UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS

TEMARIO. 4-Servlet Definición de servlet El Web Container y el ciclo de vida de los servlets El ciclo request- response.

Java Struts Framework

Curso JAVA EE

Servlets. Unidad: 4 Laboratorio de Programación. Universidad Nacional de la Patagonia Austral Unidad Académica Río Gallegos

Java Servlets. Luis Fernando Llana Díaz. 17 de abril de Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid

Validación. Internacionalización

<?xml version="1.0" encoding="utf-8"?> <portlet-app xmlns="

Capítulo III. Análisis y diseño.

4.5 Caso de estudio: diseño e implementación de las capas controlador y vista de MiniBank con JSTL y Jakarta Struts.

USANDO SERVLETS EN UN SERVIDOR WEB RESIN

FRAMEWORK 2 Creación de Servicios Web

DESARROLLO DE APLICACIONES WEB Introducción a Java Server Faces

Oracle 10g: Creación de Aplicaciones J2EE

CAPÍTULO 1. MI PRIMERA APLICACIÓN...

Introducción a los servlets

Framework 1. Web en Java. (solo aplicaciones en mantenimiento)

Sistemas de Información 12/13 Servlets y JSPs (Java Server Pages)

FUJITSU Java Development Framework

Contiene código HTML normal junto elementos especiales de JSP. Internamente, el servidor de aplicaciones las compilará a un servlet

Elementos sintácticos de una JSP.

Java 2 Enterprise Edition

Curso Java Curso Online Analista Programador Java

Struts2. 06 de Noviembre de 2009

Java EE JavaServer Pages (JSP)

J2EE TIENDAVIRTUAL APPLICATION FRAMEWORK

Seguridad de la aplicación para servlets y JSP (página activas java)

Desarrollo de Aplicaciones Web con JAVA: J2EE y Struts

Un servlet es una clase java que implementa la Servlet interface. Un servlet corre dentro de un contexto denominado Servlet engine.

COMPONENTES Y CONTENEDORES. Ingeniería de Software II

MASTER PROFESIONAL C# 5 Y ASP.NET MVC 5

Sistemas de Información 12/13 Ejercicios Tecnologías Web

J2EE Java 2 Enterprise Edition

Técnico Superior en Programación con Java SE Standard Edition

Curso: Programación con JAVA SE Estándar Edition.

Arquitectura J2EE para aplicaciones web. Aplicaciones web con JSP. Arquitectura J2EE: Capa de Acceso Web. Arquitectura J2EE: Capa Cliente

Web Tier en JAVA. Nicolás Troncoso Carrère. Valparaíso, ILI 258 Departamento de Informática Universidad Técnica Federico Santa María

Introducción (1) En una aplicación web, especialmente en Internet, los cambios a la interfaz gráfica son muy frecuentes

Desarrollador de Aplicaciones Web con Java

U IVERSIDAD CARLOS III DE MADRID. Escuela Politécnica Superior. Ingeniería Técnica de Telecomunicación: Telemática

Programación JAVA utilizando IDE Eclipce

Taller de Sistemas de Información 2. Desarrollo Web

Diplomado Java Web Programming with Servlets, JSP, JSF & Ajax

FRAMEWORK SPRING EN UNA APLICACIÓN WEB

Introducción a las aplicaciones WEB

JSP Básico. Índice. 2 Traducción de los JSP a servlets Acciones Introducción a JSP... 2

Capítulo 2 : Marco Teórico

Empleo. CURSO FORMATIVO Desarrollo de portales WEB en Liferay. Coordinador Académico Antonio José Martín Sierra

Struts2. 8 de Febrero de STRUTS2

Librería Estándar de Etiquetas JSP (JSTL JSP Standard Tag Library)

Aplicaciones web con MVC. Desarrollo de aplicaciones II

JAVA EE 5. Arquitectura, conceptos y ejemplos.

Utilización Crystal Reports 2008 Usando Bussiness Object V4.0

Práctica 4 PROGRAMACIÓN WEB CON SERVLETS Y JSP. 1. Introducción a JSP... 2

Desarrollo de Grandes Aplicaciones de Gestión de Red: Decisiones generales de diseño

TFC J2EE. Aplicación Web para la gestión de facturación de una empresa de cerrajería. Sara Gutiérrez Melero ITIG Junio de 2012

Identidad Corporativa de ICM 1 TABLA DE CONTENIDO INTRODUCCIÓN COMPONENTES NECESARIOS... 3

Tema 4: Tecnologías Web Java

JSP JDBC SALVADORES OLAIZOLA,

javax.servlet.genericservlet javax.servlet.http.httpservlet MiServlet

Transcripción:

Struts [parte I]

Módulo 1 Introducción a Struts

Qué es Struts? Marco de trabajo MVC de Apache para la tecnología Java EE Marco de trabajo (framework): extensión de un lenguaje por medio de una jerarquía de librerías y/o clases Framework API JVM

Visión Java EE + Struts Struts Framework API Java EE Contenedor API Java SE JVM

Patrón MVC Modelo-Vista-Controlador Separación de la lógica de negocio de la lógica de presentación Struts usa MVC en conjunto con Front Controller, Dispatcher,...

Ventajas Velocidad de desarrollo Controlador pre-programado Librerías de etiquetas para evitar scriptlets Flujo de acciones basado en XML Extensible con EL Permite el desarrollo separado de lógica de negocio y lógica de presentación con personal especializado

Requerimientos Contenedor web Colocar en la carpeta lib de la aplicación a desarrollar: commons-*.jar, paquete de manipulación de archivos XML de Apache/Jakarta struts.jar, paquete de clases definidas en el marco de trabajo Struts Los archivos struts-*.tld, librerías de etiquetas Struts para interfaces web, deben agregarse y especificar su ruta en el descriptor de despliegue web.xml Todos los archivos son descargables de la sección de Struts en www.apache.org

Carpetas y archivos

Clases principales ActionServlet: Servlet pre-programado para el marco de trabajo Struts. Hace las veces de Front Controler. Su ruta es org.apache.struts.action.actionservlet Action: clase que implementa el patrón Command a fin de ejecutar determinadas acciones sobre el modelo dependiendo de la petición que se le haga al ActionServlet. Hereda de org.apache.struts.action.action

Clases principales ActionForm: Java Bean que contiene los datos de la solicitud hecha por un formulario al ActionServlet y los valida. Hereda de org.apache.struts.action.actionform ActionMapping: representa las acciones y rutas escritas por el programador en el archivo de configuración de Struts. Su ruta es org.apache.struts.action.actionmapping

Clases principales ActionForward: representa el redireccionamiento de la petición HTTP a un url específico. Su ruta es org.apache.struts.action.actionforward ActionError: representa un mensaje de error. Su ruta es org.apache.struts.action.actionerror. (Esta clase está deprecada y se reemplaza por org.apache.struts.action.actionmessage) Más información: http://struts.apache.org/1.3.8/apidocs/index.html

Archivo web.xml <web-app> <servlet> <servlet-name>action</servlet-name> <servlet-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> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <jsp-config> <taglib> <taglib-uri>/web-inf/struts-html.tld</taglib-uri> <taglib-location>/web-inf/struts-html.tld</taglib-location> </taglib> </jsp-config> </web-app>

Módulo 2 Caso Práctico

Caso práctico

ActionForm import org.apache.struts.action.actionform public class RegistroForm extends ActionForm{ protected String username; protected String password1; protected String password2; public String getusername() {return this.username;} public String getpassword1() {return this.password1;} public String getpassword2() {return this.password2;} } public void setusername(string username) {this.username = username;} public void setpassword1(string password1) {this.password1 = password1;} public void setpassword2(string password2) {this.password2 = password2;}

Action import org.apache.struts.action.*; import javax.servlet.http.*; public class RegistroAction extends Action{ public ActionForward execute(actionmapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response){ RegistroForm rf = (RegistroForm) form; String username = rf.getusername(); String password1 = rf.getpassword1(); String password2 = rf.getpassword2(); } } if(password1.equals(password2)){ try{ UserDirectory.getInstance().setUser(username, password1); return mapping.findforward( exito ); }catch(exception e){ e.printstacktrace(); return mapping.findforward( fracaso ); } }else{ return mapping.findforward( fracaso ); }

struts-config.xml <struts-config> <form-beans> <form-bean name= registroform type= RegistroForm /> </form-beans> <action-mappings> <action path= /registro name= registroform type= RegistroAction input= /registro.jsp > <forward name= exito path= /exito.html /> <forward name= fracaso path= /fracaso.html /> </action> </action-mappings> </struts-config>

exito.html y fracaso.html exito.html <html> <body> <h1>exito!</h1> </body> </html> fracaso.html <html> <body> <h1> <font color= #ff0000 > Fracaso! </font> </h1> </body> </html>

registro.jsp <%@ taglib uri= /WEB-INF/struts-html.tld prefix= html > <html> <body> <html:form action= registro.do > </html:form> </body> </html> Login: <html:text property= username /> <br/> Password: <html:password property= password1 /> <br/> Confirme su password: <html:password property= password1 /> <br/> <html:submit value= Registro />

Validación en el ActionForm [hasta Struts 1.2] import javax.servlet.http.*; import org.apache.struts.action.*; public class RegistroForm extends ActionForm{ protected String username; //... public String getusername() {return this.username;} //... public void setusername(string username) {this.username = username;} //... } public ActionErrors validate (ActionMapping mapping, HttpServletRequest request){ ActionErrors errors = new ActionErrors(); if((username == null) (username.trim().equals( )){ ActionError error = new ActionError( username.requerido ); errors.add( username, error); } return errors; }

Validación en el ActionForm [desde Struts 1.2] import javax.servlet.http.*; import org.apache.struts.action.*; public class RegistroForm extends ActionForm{ protected String username; //... public String getusername() {return this.username;} //... public void setusername(string username) {this.username = username;} //... } public ActionErrors validate (ActionMapping mapping, HttpServletRequest request){ ActionErrors errors = new ActionErrors(); if((username == null) (username.trim().equals( )){ ActionMessage error = new ActionMessage( username.requerido ); errors.add( username, error); } return errors; }

Validación en el ActionForm <struts-config> <form-beans> <form-bean name= registroform type= RegistroForm /> </form-beans> <action-mappings> <action path= /registro name= registroform type= RegistroAction input= /registro.jsp validate= true > <forward name= exito path= /exito.html /> <forward name= fracaso path= /fracaso.html /> </action> </action-mappings> </struts-config>

El archivo por defecto de todos los mensajes es ApplicationResources.properties Ejemplo del contenido de un archivo ApplicationResources.properties: Mensajes en i18n username.requerido = <b>por favor, ingrese el login</b> username.default = Pedro Perez La ruta del archivo de propiedades debe ser especificada en el archivo de configuración de struts y es relativa a la carpeta classes dentro de WEB-INF: <struts-config> <message-resources parameter="com/myapp/struts/applicationresource" /> </struts-config>

Mensajes e i18n Para usar internacionalización solo se debe crear el archivo del idioma especificando en el nombre de este el acrónimo que representa dicho idioma. El archivo debe ser almacendo junto al archivo por defecto ApplicationResources.properties. Ej: ApplicationResources_es.properties El browser del cliente está definido por lo general para un idioma de preferencia, si existe el archivo ApplicationResources_XX.properties para dicho idioma, este es seleccionado, en caso contrario se selecciona el archivo de propiedades por defecto Ejemplo para ApplicationResources_en.properties: username.requerido = <b>please, insert a login</b> username.default = John Doe

Módulo 3 Librerías de etiquetas

Grupos de etiquetas HTML: struts-html.tld, de uso frecuente en la creación de formularios HTML que introducen datos al marco de trabajo. [http://struts.apache.org/1.2.7/userguide/struts-html.html] Bean: struts-bean.tld, manipulación de Java Beans análogo a los JSTL. [http://struts.apache.org/1.2.7/userguide/dev_bean.html] Logic: struts-logic.tld, manejo dinámico de condiciones análogo a los JSTL. [http://struts.apache.org/1.2.7/userguide/dev_logic.html]

Grupos de etiquetas Tiles: struts-tiles.tld, etiquetas especializadas en el manejo de plantillas. [http://struts.apache.org/1.2.7/userguide/dev_tiles.html] Nested: struts-nested.tld, extensión utilitaria de las etiquetas anteriores. [ http://struts.apache.org/1.2.7/userguide/dev_nested.html]

Ejemplo clásico de errores <%@ taglib prefix="html" uri="/struts-html.tld" %> <%@ taglib uri= /WEB-INF/struts-html.tld prefix= html > <html> <body> <html:form action= registro.do > </html:form> </body> </html> <!--Imprimir solo los errores de login--> <!--La propiedad username en insertada--> <!--al adjuntar el error en el ActionForm--> <div align="center"> <html:errors property= username /> </div> Login: <html:text property= username /> <br/> Password: <html:password property= password1 /> <br/> Confirme su password: <html:password property= password1 /> <br/> <html:submit value= Registro />

...un último paso Para que los errores salgan en la página del formulario que la originó, no es necesario tener un forward asociado: <struts-config> <form-beans> <form-bean name= registroform type= RegistroForm /> </form-beans> <action-mappings> <action path= /registro name= registroform type= RegistroAction input= /registro.jsp > <forward name= exito path= /exito.html /> </action> </action-mappings> </struts-config>

Ejemplo clásico de errores <%@ taglib prefix="html" uri="/struts-html.tld" %> <%@ taglib uri= /WEB-INF/struts-html.tld prefix= html > <html> <body> <!--Imprimir todos los errores --> <div align="center"> <html:errors/> </div> <html:form action= registro.do > </html:form> </body> </html> Login: <html:text property= username /> <br/> Password: <html:password property= password1 /> <br/> Confirme su password: <html:password property= password1 /> <br/> <html:submit value= Registro />

Módulo 4 Ejercicios propuestos

A fin de obtener una mayor experticia en el marco de trabajo Struts, se recomienda llevar a cabo los siguientes retos: Crear una aplicación basada en Struts que imprima en una página JSP una lista de objetos colocados en la sesión por un Action y sus errores, con la menor cantidad de código posible utilizando Expression Language, JSTL y Struts Tag Libraries. Modificar el idioma del site por medio de Struts una vez que un usuario seleccione su idioma de una lista sin depender del idioma del browser Realizar un request en Ajax a un url esperado por el ActionServlet de Struts Realizar una solicitud de información en un dispositivo móvil por medio de un HttpConnection a un ActionServlet Retos

Módulo 5 Struts + XDoclet

DRY DRY Don t Repeat Yourself Principio de diseño Java EE posee graves problemas sobre este principio Struts no escapa del problema Programar los Action y ActionForm es repetitivo Los tags xml del archivo de configuración de Struts son repetitivos Al crear un Action o un ActionForm hay que alterar el archivo de configuración, por lo que la información está en dos lugares El Action no sabe el flujo a recorrer, él consulta el archivo de configuración xml

XDoclet Motor de plantilla de metadatos [programación orientada a atributos] Originalmente creado para solventar el problema de DRY en los EJB Opera como tareas de Ant [similar a make ] que facilita la ejecución de tareas rutinarias Sitio web: http://www.xdoclet.org/ En los últimos años ha extendido su comportamiento en pro de facilitar el desarrollo de diversos componentes, entre ellos Struts

Problema Qué pasa si eliminamos un Action o un ActionForm? Hay que eliminar a mano los tags correspondientes del archivo de configuración Qué pasa si olvidamos eliminar los tags en el archivo de configuración? Error Este proceso es frecuente y depende mucho del ser humano, del desarrollador

XDoclet provee un mecanismo simple para la generación del archivo de configuración y la consolidación de información en un solo lugar: la clase correspondiente De esta forma la clase contiene toda la información pertinente a ella y solo a ella Al ser eliminada la clase, también es eliminada toda información relativa a ella puesto que no se generará de nuevo el archivo de configuración con la información que ella provee Solución

XDoclet provee un mecanismo simple para la generación del archivo de configuración y la consolidación de información en un solo lugar: la clase correspondiente De esta forma la clase contiene toda la información pertinente a ella y solo a ella Al ser eliminada la clase, también es eliminada toda información relativa a ella puesto que no se generará de nuevo el archivo de configuración con la información que ella provee Solución

Ejemplo - build.xml <!--archivo de ant build.xml--> <target name="webdoclet" depends="init"> <taskdef name="webdoclet" classname="xdoclet.modules.web.webdoclettask"> <classpath> <path refid="xdoclet.classpath" /> </classpath> </taskdef> <!--correr con "-Dxdoclet.force=true" para forzar la creacion de arch.--> <webdoclet destdir="${build.web.dir}/web-inf" force="${xdoclet.force}" mergedir="metadata"> <fileset dir="src" /> <strutsconfigxml version="1.1" xmlencoding="iso-8859-1" validatexml="true" templatefile="metadata/struts/struts_config_xml.xdt" mergedir="metadata/struts" /> <strutsvalidationxml /> </webdoclet> </target>

Ejemplo - build.xml <!--archivo de ant build.xml--> <target name="webdoclet" depends="init"> <taskdef name="webdoclet" classname="xdoclet.modules.web.webdoclettask"> <classpath> <path refid="xdoclet.classpath" /> Localización de los archivos.jar </classpath> </taskdef> <!--correr con "-Dxdoclet.force=true" para forzar la creacion de arch.--> <webdoclet destdir="${build.web.dir}/web-inf" force="${xdoclet.force}" mergedir="metadata"> Directorio destino <fileset dir="src" /> Directorio fuente <strutsconfigxml version="1.1" xmlencoding="iso-8859-1" validatexml="true" templatefile="metadata/struts/struts_config_xml.xdt" mergedir="metadata/struts" /> <strutsvalidationxml /> </webdoclet> </target> Directorio de archivos a incluir en el struts-config.xml Genera el archivo validate.xml

Merge <strutsconfigxml version="1.1" xmlencoding="iso-8859-1" validatexml="true" templatefile="metadata/struts/struts_config_xml.xdt" mergedir="metadata/struts" /> El directorio indicado por mergedir es la fuente de los tags xml que no serán mantenidos por XDoclet Los archivos que contiene son: struts-data-sources.xml struts-forms.xml global-exceptions.xml global-forwards.xml struts-actions.xml struts-controller.xml struts-message-resources.xml struts-plugins.xml

Action /** * @struts.action name="registroform" path="/registro" * scope="request" validate="true" input="/registro.jsp" * * @struts.action-forward name="exito" path="/exito.html" * * @struts.action-forward name="fracaso" path="/fracaso.html" */ import org.apache.struts.action.*; import javax.servlet.http.*; public class RegistroAction extends Action{ public ActionForward execute(actionmapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response){ RegistroForm rf = (RegistroForm) form; String username = rf.getusername(); String password1 = rf.getpassword1(); } } UserDirectory.getInstance().setUser(username, password1); return mapping.findforward( exito );

ActionForm /** * @struts.form name="registroform" */ import javax.servlet.http.*; import org.apache.struts.action.*; public class RegistroForm extends ActionForm{ protected String username; //... public String getusername() {return this.username;} //... public void setusername(string username) {this.username = username;} //... } public ActionErrors validate (ActionMapping mapping, HttpServletRequest request){ ActionErrors errors = new ActionErrors(); if((username == null) (username.trim().equals( )){ ActionMessage error = new ActionMessage( username.requerido ); errors.add( username, error); } return errors; }

Validación en el ActionForm <struts-config> <form-beans> <form-bean name= registroform type= RegistroForm /> </form-beans> <action-mappings> <action path= /registro name= registroform type= RegistroAction input= /registro.jsp validate= true > <forward name= exito path= /exito.html /> <forward name= fracaso path= /fracaso.html /> </action> </action-mappings> </struts-config>

Ant 1.5 en adelante Requerimientos e instalación tools.jar debe estar en <directorio jdk>/lib para manipular del jdk