Sei sulla pagina 1di 14

Introduccin al framework Struts

Es un framework1 de la capa de presentacin que implementa el patrn de patrn MVC en Java

Struts 2 est basado en el patrn MVC (Modelo-Vista-Controlador), una arquitectura que busca reducir el acoplamiento dividiendo las responsabilidades en 3 capas claramente diferenciadas: El modelo, que hace referencia a los datos que maneja la aplicacin y las reglas de negocio que operan sobre ellos y que se traducen en Struts 2 en las acciones. La vista, encargada de generar la interfaz con la que la aplicacin interacciona con el usuario. En Struts 2 equivale a los resultados. El controlador, que comunica la vista y el modelo respondiendo a eventos generados por el usuario en la vista, invocando cambios en el modelo, y devolviendo a la vista la informacin del modelo necesaria para que pueda generar la respuesta adecuada para el usuario. El controlador se implementa en Struts 2 mediante el filtro FilterDispatcher.

Ciclo de vida de una peticin 1. Un usario enva una peticin: Un usuario realiza la peticin de un recurso dentro del servidor. 2. El elemento FilterDispatcher determina la accin que deber responder:

El framework dispone de los elementos requeridos para que el dispatcher sea capaz de determinar qu action es el responsable de recibir la peticin y procesarla. Para ello se apoya en el framework para la publicacin del recurso, y para su ejecucin. 3. Se aplican los interceptores definidos: Existen diferentes interceptores que se pueden configurar para que ejecuten diferentes funcionalidades como workflows, validaciones, upload de ficheros, etc. 4. Se ejecuta el Action: Tras la ejecucin de los diferentes interceptores el mtodo especfico del Action es ejecutado, realizndose aquellas operaciones y acciones que se hayan definido. El action termina devolviendo un resultado el cal se utiliza para determiar la pgina a devolver. 5. Se renderiza la salida: Tras la ejecucin del action se determina cul es la pgina que se devuelve y se ejecutan el forward a dicha pgina. 6. Se devuelve la peticin.: Para realizar la devolucin se ejecutan los interceptores que correspondan y se procede a devolver la peticin al cliente. De esta forma es posible aadir lgica externa a los servidores tambin en la devolucin. 7. Se muestra el resultado al cliente final: Finalmente el control es devuelto al cliente quien podr visualizar el resultado en su navegador.

Arquitectura MVC Vista Se encuentra formada por un conjunto de paginas JSP. Struts provee soporte para construir aplicaciones multi-idioma, interaccin con formularios y otras utilidades mediante la utilizacin de Tags especiales (TagLibraries). Es la responsable de la percepcin que tienen los usuarios finales de la aplicacin. Se incluyen las pginas Html, JS, etc, y en general todos los elementos de visualizacin de la aplicacin. Se nutre de la informacin que el controlador ha captado del modelo para pintar las pginas finales. Algunas de las tecnologas que se emplean son Html, JSP, XSLT, templates,etc. Si nos abstraemos de la arquitectura MVC podemos encontrar que la arquitectura de Struts 2 presenta los siguientes elementos que debemos conocer para nuestras aplicaciones: Gestor de Excepciones ste elemento exista en Struts y est pensado para definir procedimientos de gestin de excepciones tanto locales como globales, de tal manera que cuando ocurra un error podamos definir qu se ha de hacer, redirigiendo a pginas genricas de error, etc. Interceptores Los interceptores son clases que se emplean para especificar el ciclo de vida de una peticin, y estn pensadas para aadir funcionalidad extra a las acciones. Podramos decir que un interceptor es parecido a un filtro de J2EE salvo que su uso es ms localizado y se puede hacer depender de actions concretos y no que se ejecute de forma global. Para configurarlos se hace de forma declarativa. Los interceptores se suelen usar para realizar validaciones, workflows, etc, y cuando se definen sobre un action, se ejecutan como los filtros, es decir, de forma consecutiva como una cadena.

Gestin de Configuracin El gestor de la configuracin es el elemento encargado de leer el fichero de control (struts.xml), analizarlo y en el caso de que sea correcto desplegar aquellos elementos que se referencian.

Controlador El Controlador comprende la funcionalidad involucrada desde que un usuario genera un pedido HTTP (click en un link, envo de un formulario, etc.) hasta que se genera la interfaz de respuesta. Entre medio, llamar a los objetos de negocio del Modelo para que resuelvan funcionalidad propia de la lgica de negocio y segn el resultado de la misma ejecutar la JSP que deba generar la interfaz resultante. Struts incluye un servlet que a partir de la configuracin de struts-config.xml recibe las solicitudes del usuario, llama al Action Bean que corresponda y, segn lo que ste retorne, ejecuta una JSP. La clase Action El objetivo de una clase Action es procesar una solicitud, mediante su mtodo perform(), y devolver un objeto ActionForward que identifica dnde se debera reenviar el control (por ejemplo a una JSP) para proporcionar la respuesta apropiada. El archivo struts-config.xml Dentro del archivo <struts-config>, hay dos elementos importantes que son usados para describir nuestras acciones: <form-beans> Esta seccin contiene nuestras definiciones de beans. Usamos un elemento <form-bean> por cada bean de formulario, que tiene los siguientes atributos importantes: name: Un identificador nico para este bean, que ser usado para referenciarlo en los correspondientes mapeos de acciones. Normalmente, es tambin el nombre del atributo de solicitud o sesin bajo el que se almacena este bean de formulario. type: El nombre totalmente cualificado de la clase Java de nuestro bean de formulario. <action-mappings> Esta seccin contiene nuestras definiciones de acciones. Usamos un elemento <action> por cada una de nuestras acciones que queramos definir. Cada elemento action requiere que se definan los siguientes atributos: path: El path a la clase action en relacin al contexto de la aplicacin. type: El nombre totalmente cualificado de la clase Java de nuestra clase Action. name: El nombre de nuestro elemento <form-bean> para usar con esta action.

Modelo El Modelo comprende todos los Objetos de Negocio donde se implementa la lgica de negocio y donde se debe soportar todos los requisitos funcionales del Sistema sin mezclarlo con partes correspondientes al workflow que corresponden al Controlador.

Action Forms Una de las tareas que durante el desarrollo de una aplicacin insume mucho trabajo (aunque en realidad no lo merezcan) es la interaccin con formularios, ya sea para editar u obtener nueva informacin. Las comprobaciones, la gestin de errores, el volver a presentarle el mismo form al usuario con los valores que puso y los mensajes de error y un largo etctera estn soportadas por Struts a fines de hacernos la vida un poco ms fcil. La idea es la siguiente: todo el trabajo de comprobaciones y generacin de mensajes de error se implementa en los ActionForm y todo el trabajo de generacin de interfaz en la/s JSP. Validacin automtica en formularios Struts ofrece una facilidad adicional para validar los campos de entrada que ha recibido. Para utilizar esta caracterstica, sobreesribimos el siguiente mtodo en nuestra clase ActionForm: public ActionErrors validate(ActionMapping mapping, HttpServletRequest request); El mtodo validate() es llamado por el servlet controlador despus de que se hayan rellando las propiedades del bean, pero antes de se llame al mtodo perform() correspondiente de la clase Action. El mtodo validate() tiene las siguientes opciones: Realiza las validaciones apropiadas y no encuentra problemas Devuelve null o ejemplares de ActionErrors de longitud cero, y el servlet controlador proceder a llamar al mtodo perform() de la clase Action apropiada. Realiza las validaciones apropiadas y encuentra problemas. Devuelve un ejemplar de ActionErrors conteniendo ActionError's, que son clases que contienen las claves del mensaje de error que se deberan mostrar. El servlet controlador almacena este array como un atributo de la solicitud disponible para usarse por la etiqueta <html:errors>, y devolver el control al formulario de entrada. Como se mencion anteriormente, esta caracterstica es totalmente opcional. La implementacin por defecto de validate() devuelve null, y el servlet controlador asumir que no se requiere que se haga ninguna validacin por parte de la clase Action. Una aproximacin comn es realizar validaciones iniciales usando el mtodo validate(), y luego manejar la validacin de la "lgica de negocio" desde el objeto Action.

Lo primero que haremos es crear una biblioteca llamada "Struts2". Para esto debemos descargar Struts 2. Podemos descarga cualquiera de los paquetes. Una vez que tengamos el archivo, vamos al NetBeans y nos dirigimos al men "Tools -> Libraries".

En la ventana que se abre presionamos el botn "New Library...":

En esta nueva ventana colocamos como nombre de la biblioteca "Struts2" y como tipo dejamos "Class Libraries":

Ahora que tenemos nuestra biblioteca, presionamos el botn " Add Jar/Folder" para agregar los nuevos archivos que conformarn la biblioteca:

Agregamos los siguientes archivos: commons-fileupload-1.2.2.jar commons-io-2.0.1.jar commons-lang-2.5.jar freemarker-2.3.16.jar javassist-3.11.0.GA.jar ognl-3.0.1.jar struts2-core-2.2.3.jar xwork-core-2.2.3.jar

Lo siguiente es crear un nuevo proyecto web en NetBeans. Para esto vamos al Men "File->New Project...". En la ventana que se abre seleccionamos la categora "Java Web" y en el tipo de proyecto "Web Application":

Le damos una ubicacin y un nombre al proyecto, en mi caso ser " Struts2Configuracion". Presionamos el botn "Next". En la siguiente pantalla deberemos configurar el servidor de aplicaciones que usaremos. (pueden usar tambin la 6 si quieren, solo que en ese caso NetBeans no genera el archivo "web.xml" por default, y tendrn que crearlo luego).

De la misma forma, si quieren pueden modificar el context path de la aplicacin (el context path es la ruta que se colocar en el navegador para acceder a nuestra aplicacin desde nuestro servidor):

Presionamos el botn "Finish", con lo que veremos aparecer la pgina "index.jsp" en nuestro editor.

Ahora agregaremos la biblioteca "Struts2" que creamos hace un momento. Para esto hacemos clic derecho en el nodo "Libraries" del panel de proyectos. En el men que aparece seleccionamos la opcin "Add Library...":

En la ventana que aparece seleccionamos la biblioteca "Struts2" y presionamos "Add Library". Con esto ya tendremos los jars deStruts 2 en nuestro proyecto:

Lo siguiente que debemos hacer es configurar el filtro de Struts 2, para que todas las llamadas que se hagan a nuestra aplicacin web pasen a travs de este filtro. El filtro de Struts 2 es llamado "StrutsPrepareAndExecuteFilter". En versiones anteriores deStruts 2 se usaba un filtro llamado "FilterDispatcher" (es por eso que algunas veces hago referencia a este filtro usando ese nombre), sin embargo este ha sido marcado como deprecated y por lo tanto ya no debe ser usado.

CONTROLADOR WEB.XML modificar el archivo web.xml para que el marco Struts2 est conectado a la aplicacin y permita enrutamiento de todas las solicitudes de URL a travs del Struts2

Si el archivo de configuracin del proyecto no se genero se debe crear. En este archivo debemos inscribir el filtro que gestiona las peticiones de Struts2. 1. Para realizar esta operacin debemos dar click derecho sobre la carpeta WEB-INF y seleccionar la opcin New ->Other

2. En el cuadro de dilogo New File, seleccionar del grupo Web, la opcin Standard Deployment Descriptor (web.xml) y presionar sobre el botn Next.

3. En la pantalla siguiente solo debemos presionar sobre el botn Finish.

Abrimos el archivo de configuracin de nuestra aplicacin web, el deployment descriptor conocido sencillamente como el archivo "web.xml". Para la declaracin del filtro de Struts 2, debemos usar el elemento "<filter>", dentro del cual debemos indicar un nombre para el filtro, por convencin usamos el nombre "struts2", y la clase que implementa dicho filtro, que en nuestro caso es "org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter ". Despus ser necesario indicar qu peticiones pasarn por el filtro de Struts 2. Para eso usamos el elemento "<filtermapping>". Aqu indicamos que queremos que TODAS las peticiones que se hagan al sitio pasen a travs del filtro, usando el patrn de URL "/*".

La declaracin y mapeo del filtro quedan de la siguiente forma:

MODELO CLASE ACTION crear una clase de accin que Manejar solicitud del usuario y lo remitir a la vista apropiada. El valor de retorno (el xito) Indicara el nombre de la vista a la que debe remitirse la solicitud (lleva a cabo la lgica de negocio)

STRUTS.XML crear el archivo de meta datos struts.xml dentro del "Paquete de Fuente". Este archivo mapeara las paginas de resultado

En este archivo se especifica la relacin entre la URL de una peticin, la clase Java que ejecutar la accin de la peticin, y la pgina JSP que se encargar de mostrar la respuesta a la peticin del usuario. Para crear el archivo hacemos clic derecho sobre el nodo "Source Packages" en el panel de proyectos. En el men contextual que nos aparece seleccionamos la opcin " New -> XML Document":

Le damos como nombre del archivo "struts", el wizard se encargar de colocarle la extensin ".xml":

Presionamos el botn "Next" y en la siguiente pantalla seleccionamos la opcin " Well-formed Document". Presionamos el botn "Finish" y tendremos un archivo XML, al cual debemos quitarle todo el contenido. Dentro de este archivo se configuran algunas constantes que modifican, de una manera mnima, el comportamiento del filtro de Struts. Tambin se configuran paquetes, que son conjuntos de acciones que podemos organizar debajo de un mismo namespace. Dentro de los paquetes podemos definir un conjunto de acciones, cada una de las cuales responder a una peticin. Y dentro de las acciones podemos definir resultados, que son las pginas o vistas a las que se enviar al usuario dependiendo del resultado de una accin (como ya habamos dicho: existen muchos tipos de resultados, no solo pginas JSP, por ejemplo podemos hacer que un usuario descargue un archivo, o que visualice un reporte o una grfica; incluso es posible redirigir a un usuario a otra accin). Este archivo de configuracin debe iniciar con el elemento "<struts>":

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> </struts> Dentro de estas etiquetas se configuran los dems elementos. Ahora definimos nuestro primer paquete, usando el elemento " <package>". Los paquetes nos permiten tener una configuracin comn para un conjunto de Actions. Por ejemplo, se pude definir el conjunto de interceptores que se aplican sobre ellos, resultados comunes, manejo de excepciones, etc. Cada uno de los paquetes que declaremos debe tener un nombre y extender de algn otro paquete. Opcionalmente tambin pueden tener un namespace, el cual es un fragmento que deber ser agregado a la URL de la peticin para hacer referencia a ese paquete. Por ejemplo, si definimos un paquete con el namespace " administracion", y dentro de este hay un Action cuyo nombre es "registro", para ejecutar ese Action deberemos hacer una peticin a la siguiente URL: http://servidor:puerto/aplicacion/administracion/registro.action Cuando extendemos de otro paquete heredamos su configuracin (de hecho podemos tener paquetes abstractos con una configuracin general, y hacer que varios paquetes extiendan de estos). Como en este momento no tenemos otro paquete, este debe extender de "struts-default", que es el paquete base para la las aplicaciones de Struts 2. Como nombre de nuestro paquete colocaremos "demo-struts":

<package name="demo-struts" extends="struts-default"> </package> Como podemos ver, no hemos indicado ningn namespace en nuestro paquete. Esto quiere decir que estamos usando el namespace pordefault (o sea ""). Cuando trabajamos con namespaces podemos usar principalmente 3 tipos: el namespace por default (como en este caso), el namespace raz ("/") en cual en la URL de peticin luce exactamente igual al namespace defult, o un namespace propio. Si invocamos un Action usando un namespace distinto al default (como en el ejemplo anterior "adminsitracion/registro.action") y Struts 2 no puede encontrar ningn Action que coincida con nuestra peticin, en ese namespace, lo buscar en el namespace default. O sea, en el ejemplo anterior, si no encuentra el Action "registro" en el namespace "administracion", ir a buscarlo al namespace default. Algo importante que hay que decir sobre los namespaces, es que estos NO se comportar como nombres de directorios. Esto quiere decir que si hacemos una peticin a un Action en el namespace "administracion/usuarios", digamos: "adminsitracion/usuarios/registro.action" y Struts 2 no encuentra el Action "registro" en ese namespace, ir a buscarlo al namespace por default, y no a un namespace " adminsitracion". Ahora mapearemos nuestro primer Action. Para esto usamos el elemento "<action>". Todas las acciones deben tener un nombre quedebe ser nico dentro de un namespace. Las acciones deben estar asociadas con una clase que ser

la que ejecute la accin adecuada. Si no indicamos una clase, Struts 2 usar una clase por default. Esta clase por default lo que hace es regresar siempre un resultado exitoso o "SUCCESS" de su ejecucin. En este caso llamaremos a nuestra accin "index": <action name="index"> </action> Finalmente, debemos indicar el resultado de la ejecucin de esta accin, con el elemento " <result>". Una accin puede tener varios resultados, dependiendo de la ejecucin de la misma. Cada uno de estos resultados debe tener un nombre al que se har referencia dentro de la accin para definir qu vista regresar al usuario. Se puede tener, por ejemplo, un resultado para el caso de una accin exitosa, otro para una situacin de error, otra para cuando el usuario no ha ingresado todos los datos requeridos en un formulario, otra para cuando el usuario que ingresa es un administrador, otro para cuando es un usuario annimo, etc. Definimos que en el caso de una ejecucin exitosa ( success) se debe enviar al usuario a la pgina "index.jsp", de la siguiente forma (noten que la ruta de la pgina debe indicarse a partir de la raz del directorio web): <result name="success">/index.jsp</result> El nombre por default de un result es "success", as que podemos dejar la lnea anterior de la siguiente manera: <result>/index.jsp</result> Normalmente tratamos de usar los nombres de los result que se definen dentro de la interface Action ("success", "error", "input", etc.), para poder hacer uso de estas constantes cuando nos referimos a ellos, pero en realidad podemos darles el nombre que queramos (como "exito"o "fallo") y regresar estos valores en el mtodo "execute". Esto es todo, por lo que nuestro archivo de configuracin queda de la siguiente forma:

VISTA

Funcionamiento

Usuario acceda http://localhost:8080/struts2base/index.action El filtro configurado en web.xml rutea la solicitud a la clase. La clase busca en struts.xml y encuentra a index Struts2 llama al mtodo execute () de la clase. La aplicacion devuelve el valor de "xito". Struts2 busca la asignacin de "xito" en struts.xml y encuentra index.jsp. Index.jsp se ejecuta y su resultado se devuelve al usuario.

Potrebbero piacerti anche