Comprendiendo Struts2 [Parte 1]


Que es Struts?

Struts es un framework para el desarrollo de aplicaciones Web bajo el patrón MVC en la plataforma Java EE. Su carácter de «software libre» y su compatibilidad con todas las plataformas en las que Java Entreprise está disponible lo convierten en una herramienta altamente disponible. La versión 2 del framework introdujo algunas mejoras sobre la primera versión, de cara a simplificar las tareas más comunes en el desarrollo de aplicaciones web, así como mejorar su integración con AJAX, etc.

Funcionamiento General

Struts se basa en el patrón de diseño MVC el cual separa tres secciones diferenciadas llamadas Modelo, Vista y Controlador. Esto busca separar el modelo de datos, las interfaces de usuario y la lógica de negocios en tres componentes diferentes.

El Modelo es básicamente los datos de la aplicación y las reglas de negocio, que serían los Actions en Struts 2.

La Vista puede ser cualquier tecnología  de vista como los JSP, entre otros. Estos son el medio por el cual el usuario podrá interactuar con la aplicación.  En Struts 2, son los Results.

El Controlador es el intermediario entre la Vista y el Modelo, ante las peticiones generadas por el Cliente en la Vista.  Así, éste se encarga de invocar al Modelo cualquier cambio en los datos de la aplicación, para que pueda ser devuelta a la Vista, como respuesta ante la petición del usuario.  En Struts 2, esta tarea la realiza el FilterDispatcher.

Esto se explicará en detalle mas adelante, de momento es importante comprender la arquitectura MVC que implementa este framework.

Modelo-Vista-Controlador en Struts2Fig. 1: Modelo-Vista-Controlador en Struts2

Requisitos

Antes de comenzar a programar con struts2 necesitamos algunas herramientas para su funcionamiento.

Entorno de Desarrollo (IDE): recomiendo usar Eclipse con el plugin WTP (Web Tools Plataform) para desarrollo Web mas los plugin de Galileo (Web, XML, and Java EE Development) para el manejo de archivos XML, integrar servidores, entre otras características, sin embargo Netbeans también aplica como un buen IDE para trabajar sobre struts2, pero en lo personal prefiero eclipse, bueno es cosa de gustos.

Servidor Web: Como servidor web se usará Apache Tomcat

Librerías de Struts2: Librerias del Framework necesarias.

Las versiones usadas por mi son:

  • Eclipse: Eclipse Galileo 3.5.2
  • WTP: Web Tools Platform SDK (WTP SDK) 3.1.2
  • Apache Tomcat: Apache Tomcat 6.0.26
  • Struts2: Struts 2.1.8.1 (Full Distribution)

Puesta en marcha

Suponiendo que se ha instalado todo correctamente, comenzamos con configurar nuestro proyecto struts2 en eclipse.

Configurar Servidor Tomcat en Eclipse

Lo primero que hacemos es configurar nuestro servidor Tomcat en eclipse. Para ello nos vamos a:

Windows -> Preferences -> Server -> Runtime Environments -> Add

Aquí seleccionamos «Apache Tomcat v6.0» y configuramos la ruta donde está instalado el servidor.

Luego agregamos el servidor a nuestra vista:

Windows -> Show View -> Other… -> Server -> Servers

Con esto se nos muestra una nueva pestaña en la parte inferior de la pantalla llamada «Servers». En esta región agregamos nuestro servidor.

Click Derecho -> New -> Server

Y seleccionamos «Tomcat v6.0 Server», asignamos algún nombre y Finalizar.

Con esto ya tenemos integrado nuestro servidor Tomcat para el desarrollo de proyectos Web.

Creación de un proyecto Web

Ahora debemos crear un proyecto web, para esto hacemos:

File -> New -> Other… -> Web -> Dynamic Web Project

Aquí asignamos el nombre de nuestro proyecto, en este caso «teststruts2», y vemos que los campos de «Target Runtime» y «Configuration» ya están configurados con la información de nuestro servidor Tomcat. Finalmente apretamos en «Finalizar» y se crea nuestro proyecto. Es destacable en este punto que eclipse nos propondrá cambiar la perspectiva a «Java EE» lo cual es necesario para continuar trabajando. Las perspectivas de eclipse se pueden cambiar facilmente despues en:

Windows -> Open Perspective

Configurar Struts2 [forma manual]

Ahora que nuestro proyecto esta creado y nuestro servidor esta configurado, solo falta configurar struts2.

Agregar Librerias

Lo primero que debemos hacer es incluir las librerias en nuetro proyecto.

Recordar que bajamos «struts-2.1.8.1-all.zip» de http://struts.apache.org/download.cgi. Si descomprimimos nos encontramos con la carpeta «Lib», donde se encuentran todas las librerías de struts2, para nuestro ejemplo solo necesitamos las siguientes:

  • struts2-core-2.1.6.jar
  • xwork-2.1.2.jar
  • ognl-2.6.11.jar
  • freemarker-2.3.13.jar
  • commons-logging-1.0.4.jar
  • commons-fileupload-1.2.1.jar

NOTA: Dentro de la misma carpeta se encuentran muchas mas librerías que se pueden incorporar a medida que las vamos requiriendo. Ademas en el paquete que bajamos se encuentra la documentación oficial, aplicaciones de ejemplos y el código fuente.

Estas librerías las agregamos a nuestro proyecto simplemente arrastrándolas a:

teststruts2 -> WebContent -> WEB-INF -> Lib

Modificar web.xml

El proyecto posee un archivo descriptor encargado de la configuración de la aplicación Web, este es el archivo web.xml. Debemos modificar este archivo agregando el filtro que gestiona las peticiones a Struts2.

El archivo se encuentra en:

teststruts2 -> WebContent -> WEB-INF

y debemos agregar las siguientes lineas:

<filter>
   <filter-name>struts2</filter-name>
   <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
   <filter-name>struts2</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

Con esto lo que estamos haciendo es indicar a Apache Tomcat que toda petición debe ser interceptada y gestionada por el filtro «FilterDispatcher», el cual es el controlador de nuestra aplicación.

Crear struts.xml

struts.xml es uno de los archivos mas importantes en el framework, ya que es el archivo de configuración de Struts2. Este se debe crear en:

teststruts2 -> Java Resources: src

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
   <constant name="struts.enable.DynamicMethodInvocation" value="false" />
   <constant name="struts.devMode" value="false" />

   <package name="default" namespace="/" extends="struts-default">

   //Declaracion de Acciones

   </package>
</struts>

En este archivo se definen las Acciones de Struts2 definiendo así el mapping de la aplicación, con esto la aplicación sabe a que pagina redirigir en respuesta a una acción y que clase se encarga de realizar la acción. Esto se detallará mas adelante, ahora es necesario saber solo que en este archivo se configura nuestra aplicación.

Configurar Struts2 [usando struts2-blank-2.1.8.1.war]

Otra forma de configurar struts2 es usando «struts2-blank-2.1.8.1.war» que es una aplicacion de ejemplo que viene en el paquete «struts-2.1.8.1-all.zip». Al descomprimir, esta aplicación  se encuentra en:

struts-2.1.8.1 -> apps

Para crear nuestro proyecto simplemente importamos este archivo en:

File -> Import… -> Web -> WAR file

Ahora en «WAR file» seleccionamos el archivo «struts2-blank-2.1.8.1.war», y en «Web project» damos el nombre de nuestro proyecto, en nuestro caso «teststruts2_forma2».

Con esto creamos el proyecto «teststruts2_forma2» que viene ya configurado para comenzar a programar.

Fig. 2: Eclipse con Struts2

En la Figura 2 se ve que el proyecto ya contiene los archivos web.xml y struts.xml configurados, ademas este viene con el clásico «Hello Word» implementado.

Acciones

Las acciones son las encargadas de definir cual será la clase que se encargará de procesar la petición solicitada y cual será la respuesta dependiendo del resultado. Estas acciones se registran dentro de struts.xml.

La estructura básica de una acción es la siguiente:

<action name="Nombre_Accion" class="Paquete.Nombre_Clase">
   <result name="error">/pagina_error.jsp</result>
   <result name="success">/pagina_exito.jsp</result>
</action>

Nombre_Accion: identificador por el cual se llama a la accion desde la «Vista» (archivos JSP).

Paquete.Nombre_Clase: Controlador encargado de realizar la logica de la accion. Es una clase java, ubicada en algun paquete.

pagina_exito.jsp/pagina_error.jps: Son jsp’s que dependiendo si la respuesta del controlador es éxito o error serán visualizados.

Entonces, la logica desde el punto de vista de las acciones es la siguiente:

  • Se llama una acción (desde algún jps a struts.xml)
  • Se realiza la lógica (en alguna Clase)
  • La clase entrega un resultado (desde la Clase a struts.xml)
  • En función del resultado, se visualiza el jsp. ( desde struts.xml a jsp)

Esta lógica esta simplificada para comprender la dinámica de las acciones en el funcionamiento de strust2.

La lógica general se puede resumirse en el siguiente esquema:

Fig. 3: Funcionamiento general de struts2

Una buena descripción puede encontrarse en el siguiente link:

http://www.epidataconsulting.com/tikiwiki/tiki-index.php?page=Struts2#Put_it_all_toguether

Clases

Ya vimos como el framework mapea la aplicación mediante entradas Action en struts.xml. Ahora veremos como funcionan las clases de la aplicación, o sea el encargado de ejecutar la lógica requerida por la acción.

detallar….

Vista

Detallar…

Notas

Post en proceso de edición…

Continuará…

Acerca de Joel

Ingeniero Civil Informático y Emprendedor.
Esta entrada fue publicada en Programación y etiquetada , , , , . Guarda el enlace permanente.

15 respuestas a Comprendiendo Struts2 [Parte 1]

  1. gabriel dijo:

    ta wena, pa ke sirve ?

    xD

  2. Sergio "el wallas" Hernandez dijo:

    Ke onda joel:

    ke buena explicacion acerca de struts 2 y tomcat joel, pero la verdad es ke me interesa mucho aprender esta tecnología y s se peude ke pongas la segunda parte del mismo pues ke mas ke excelente o si puedes mandarme material a mi mail, el cual ya te anexe sino pues ahi te va de nuevo mispelos@hotmail.com, es real mi mail no es broma…

    te agradeceria mushisisismo si envia smaterial o si posteas la segunda parte de struts 2…

    saludos y graciassssssss ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡

  3. Nicolas dijo:

    Muy bueno y claro este tutorial, te felicito. Me gustaria como comento «El Wallas» si me pondrias mandar una segunda parte mas en profundidad ya que este framework lo necesito para el trabajo y ademas me interesa muchisimo… espero puedas postear algo o enviarmelo por mail, me seria de mucha ayuda tu forma de explicar.

    Abrazo del gol, y buenos dias.

    Nicolas.

  4. CPJ dijo:

    La clase org.apache.struts2.dispatcher.FilterDispatcher no está Deprecated desde la versión 2.1.3 de struts? . ¿No habría que usar org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter?
    Gracias!!

  5. Pingback: Los números de 2010 | El Blog del Joel

  6. Ricardo dijo:

    Hola , gracias por la explicación !!!.

    Tengo una duda en mi aplicacion Struts2, es la siguiente,
    A mi me gustaria configurar la aplicacion antes de pintar el home.

    Entonces he pensado dos maneras;

    – 1º Configurarando Struts para que al iniciar, en vez de cargar una vista, llevarle a un action. Es posible ??. Cuyo action siempre ejecute una clase por ejemplo config.java ,, cuya clase al ser ejecutada, me lleve struts.xml y este al home !!

    – 2º Metiendo un Servet, configuar un servlet que este escuchando en / , que configure el site, y haga un transfer al home.

    Otra opcion en meter un include en el home, que me cargue un fichero de configuracion , lo que me obligaria a meter un jsp con codigo java , que es precisamente lo que se trata de evitar en struts2 . jejeje

    • Joel dijo:

      Hola Ricardo,
      no entiendo muy bien que quieres decir con «configurar la aplicacion antes de pintar el home». Si puedes me lo explicas en mas detalle.

      Por lo de comenzar la aplicación con un «Action» el camino que utilizo es:
      Primero seteo la pagina de bienvenida en web.xml:
      Agregando:

              <welcome-file-list>
      	      <welcome-file>index.jsp</welcome-file>
              </welcome-file-list>
      

      Luego creas el archivo index.jsp en WebContent (Directorio web raíz):
      Contenido index.jsp:

      <% response.sendRedirect("Inicio.action"); %>
      

      Esto redirecciona a tu accion inicial. Esta accion debe estar registrada en struts.xml de la siguiente forma:
      Agregar a struts.xml:

      	
             <action name="Inicio" class="paquete.Inicio">
                     <result name="success">/inicio.jsp</result>
             </action>
      

      Aquí la acción es manejada por la clase «Inicio.java» ubicada en «/paquete» en el directorio src. Esto en caso de éxito muestra la vista de inicio.jsp previamente procesada por Inicio.java.
      Espero esto pueda ayudarte, si encuentras alguna otra manera te agradecería compartirla acá :).

      Muchos saludos…

  7. Ricardo dijo:

    Hola Joel , Muchas gracias por la premura en tu respuesta !!
    Me sirve lo que has indicado en el comentario !!

    Paso a explicar un poco mas lo que te queria decir con «configurar la aplicacion» !

    La cuestion es que antes de cargar el home, me gustaria guardar una serie de variables en el contexto de la pagina, las cuales usare despues en mis clases. Entonces habia pensado en ejecutar un action como inicio de la aplicacion, pero segun tu respuesta , el inicio de la aplicacion debe ir a un jsp , el cual ejecuta un redirect al action !
    El tema es que no queria meter codigo java en las jsp, pero bueno !!

    Se me ocurre otra soluccion , crear un servlet que inicialice las variables y redirija al home una vez termine.

  8. Ricardo dijo:

    Perdon, para que se entienda mejor la pregunta,

    se podria configurar el web.xml asi ??

    index.action

    • Joel dijo:

      Otra forma de llamar un Action al inicio es mediante un jsp con el siguiente contenido:

      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      <%@ taglib prefix="s" uri="/struts-tags" %>  
      <s:action name="Inicio" namespace="/" executeResult="true" />  
      
  9. enrique dijo:

    Hola estimado,
    antes que nada muchas gracias por tu post
    tengo una dudad que quizá me la puedas aclarar, se puede crear actions variables? , es decir si yo retorno una lista de enlaces con diferentes href(desde la BD), una solucion no muy aceptable es que tenga mapeados estaticamente todos los actions posibles. pero existe otra forma ? gracias

  10. Ivan Carrillo dijo:

    Algún ejemplo de como usar radiobotones para un grid hecho con display:table con sus respectivos display:column???…. he buscado en muchos lados, y no me han funcionado los ejemplos, y es que el detalle es que a esos radiobotones no les necesito pasar un list (puesto que es para seleccionar 1 solo de todos mis registros, no para mostrar una lista), y es ahí donde me atoré.

    Gracias por su ayuda.

Replica a Joel Cancelar la respuesta