Skip to content

1. Introducción

El PDF del documento está disponible |AQUÍ|.

Los ejemplos del documento están disponibles |AQUÍ|.

En este artículo nos proponemos presentar, mediante ejemplos, los conceptos importantes de Struts 2. Struts 2 es un marco de trabajo web que proporciona:

  • una serie de bibliotecas en formato JAR
  • un marco de desarrollo: Struts 2 influye en la forma de desarrollar una aplicación web.

Los requisitos previos necesarios para comprender los ejemplos son los siguientes:

  • conocimientos básicos del lenguaje Java
  • conocimientos básicos de desarrollo web, en particular del lenguaje HTML.

En el sitio web [http://developpez.com] se pueden encontrar todos los recursos necesarios para cumplir estos requisitos previos. He escrito algunos de ellos, que se pueden encontrar en el sitio web [http://tahe.developpez.com].

Los ejemplos de este documento están disponibles en la URL [http://tahe.developpez.com/java/struts2].

Para profundizar en Struts 2, se pueden utilizar las siguientes referencias:

  • [ref1]: la documentación de Struts 2, que se puede encontrar en el sitio web de Struts
  • [ref2]: el libro «Struts 2 in Action», escrito por Donald Brown, Chad Michael Davis y Scott Stanlick, publicado por Manning. Este libro es especialmente didáctico.

En ocasiones haremos referencia a [ref2] para indicar al lector que puede profundizar en un tema con este libro.

El documento se ha redactado de tal manera que pueda leerse sin necesidad de tener un ordenador a mano. Por ello, se incluyen numerosas capturas de pantalla.

1.1. El papel de Struts 2 en una aplicación web

En primer lugar, situemos Struts 2 en el desarrollo de una aplicación web. En la mayoría de los casos, esta se construirá sobre una arquitectura multicapa como la siguiente:

  • La capa [web] es la capa en contacto con el usuario de la aplicación web. Este interactúa con la aplicación web a través de páginas web visualizadas por un navegador. Es en esta capa donde se sitúa Struts 2 y únicamente en esta capa.
  • La capa [metier] implementa las reglas de gestión de la aplicación, como el cálculo de un salario o de una factura. Esta capa utiliza datos procedentes del usuario a través de la capa [web] y del SGBD a través de la capa [dao].
  • La capa [dao] (Data Access Objects), la capa [jpa] (Java Persistence API) y el controlador JDBC gestionan el acceso a los datos del SGBD. La capa [jpa] actúa como ORM (Object Relational Mapper). Sirve de puente entre los objetos manipulados por la capa [dao] y las filas y columnas de los datos de una base de datos relacional.
  • La integración de las capas puede realizarse mediante un contenedor Spring o EJB3 (Enterprise Java Bean).

La mayoría de los ejemplos que se ofrecen a continuación utilizarán una sola capa, la capa [web]:

No obstante, este documento concluirá con la creación de una aplicación web multicapa:

El conjunto de capas [metier], [dao] y [jpa/hibernate] se nos proporcionará en forma de archivo jar, de modo que, una vez más, solo tendremos que construir la capa [web].

1.2. El modelo de desarrollo MVC de Struts 2

Struts 2 implementa el modelo de arquitectura denominado MVC (Modelo – Vista – Controlador) de la siguiente manera:

El procesamiento de una solicitud de un cliente se lleva a cabo de la siguiente manera:

Las URL solicitadas tienen el formato http://machine:port/contexte/rep1/rep2/.../Action. La ruta [/rep1/rep2/.../Action] debe corresponder a una acción definida en un archivo de configuración de Struts 2; de lo contrario, se rechaza. Una acción se define en un archivo XML con el siguiente formato:

1
2
3
4
5
6
<package name="actions" namespace="/actions" extends="struts-default">
    <action name="Action1" class="actions.Action1">
      <result name="page1">/vues/Page1.jsp</result>
      <result name="page2">/vues/Page2.jsp</result>
    </action>
</package>

En el ejemplo anterior, supongamos que se solicita la URL [ http://machine:port/contexte/actions/Action1]. A continuación, se ejecutan los siguientes pasos:

  1. solicitud: el navegador del cliente realiza una solicitud al controlador [FilterDispatcher]. Este recibe todas las solicitudes de los clientes. Es la puerta de entrada de la aplicación. Es la C de MVC.
  2. procesamiento
  • el controlador C consulta su archivo de configuración y descubre que existe la acción actions/Action1. El namespace (línea 1) concatenado con el nombre de la acción (atributo name de la línea 2) define la acción actions/Action1.
  • El controlador C instancia [2a], una clase de tipo [actions.Action1] (atributo class de la línea 2). El nombre y el paquete de esta clase pueden ser cualesquiera.
  • Si la URL solicitada va acompañada de parámetros de tipo [param1=val1&param2=val2&...], entonces el controlador C asigna estos parámetros a la clase [actions.Action1] de la siguiente manera:
[actions.Action1].setParami(valeuri) ;

Por lo tanto, la clase [actions.Action1] debe tener estos métodos setParami para cada uno de los parámetros parami esperados.

  • El controlador C solicita que se ejecute el método de firma [String execute()] de la clase [actions.Action1]. Este puede entonces utilizar los parámetros parami que la clase ha recuperado. Al procesar la solicitud del usuario, puede necesitar la capa [metier] [2b]. Una vez procesada la solicitud del cliente, esta puede generar diversas respuestas. Un ejemplo clásico es:
  • una página de errores si la solicitud no se ha podido procesar correctamente
  • una página de confirmación en caso contrario

El método execute devuelve al controlador C un resultado de tipo cadena de caracteres denominado clave de navegación. En el ejemplo anterior, [actions.Action1].execute puede generar dos claves de navegación: «page1» (línea 3) y «page2» (línea 4). El método [actions.Action1].execute también actualizará la plantilla M [2c] que utilizará la página JSP, la cual se enviará como respuesta al usuario. Esta plantilla puede incluir elementos de:

  • la clase [actions.Action1] instanciada
  • la sesión del usuario
  • datos de ámbito de la aplicación
  • ...
  1. respuesta: el controlador C solicita que se muestre la página JSP correspondiente a la clave de navegación [3]. Esta es la vista, la V de MVC. La página JSP utiliza una plantilla M para inicializar las partes dinámicas de la respuesta que debe enviar al cliente.

Ahora, precisemos la relación entre la arquitectura web MVC y la arquitectura por capas. De hecho, se trata de dos conceptos diferentes que a veces se confunden. Tomemos una aplicación web Struts 2 de una sola capa:

Si implementamos la capa [web] con Struts 2, tendremos una arquitectura web MVC, pero no una arquitectura multicapa. En este caso, la capa [web] se encargará de todo: presentación, lógica de negocio y acceso a los datos. Con Struts 2, serán las clases de tipo [Action] las que realizarán esta tarea.

Ahora, consideremos una arquitectura web multicapa:

La capa [web] puede implementarse sin marco de trabajo y sin seguir el modelo MVC. Entonces tenemos una arquitectura multicapa, pero la capa web no implementa el modelo MVC.

En MVC, dijimos que el modelo M era el de la vista V, c.a.d. El conjunto de datos mostrados por la vista V. A veces (a menudo), se da otra definición del modelo M de MVC:

Muchos autores consideran que lo que se encuentra a la derecha de la capa [web] forma el modelo M del MVC. Para evitar ambigüedades, se puede hablar:

  • del modelo del dominio cuando nos referimos a todo lo que se encuentra a la derecha de la capa [présentation]
  • del modelo de la vista cuando nos referimos a los datos mostrados por una vista V

En lo sucesivo, el término «modelo M» se referirá exclusivamente al modelo de una vista V.

1.3. Las herramientas utilizadas

En lo sucesivo, utilizamos (diciembre de 2011)

  • NetBeans 7.01, disponible en la URL IDE
  • el plugin Struts 2 para NetBeans 7.01, disponible en la URL [http://plugins.netbeans.org/plugin/39218]
  • la versión 2.2.3 de Struts 2, disponible en la URL [http://struts.apache.org/]

Cabe señalar que solo las bibliotecas de Struts 2 disponibles en la URL [http://struts.apache.org/] son imprescindibles para desarrollar los ejemplos que siguen a continuación. NetBeans puede sustituirse por otro IDE (Eclipse, JDeveloper, IntelliJ, etc.) y el complemento Struts 2 solo sirve para facilitar el trabajo del desarrollador. Tampoco es imprescindible.

1.3.1. IDE NetBeans

En la página de descargas de NetBeans, elegimos la versión Java EE:

Image

1.3.2. Plugin Struts 2

Dependiendo de las versiones de NetBeans, este plugin no siempre ha estado disponible. En diciembre de 2011, se encuentra en la URL [http://plugins.netbeans.org]. Esta URL permite conocer los diferentes plugins disponibles para NetBeans. Se puede filtrar lo que se busca. En [1], se solicitan los complementos que contienen la palabra «struts» en su nombre.

  • seguimos el enlace [2]

Descargamos el plugin y lo descomprimimos [2]. Para integrarlo en NetBeans, podemos proceder de la siguiente manera:

  • Inicie NetBeans
  • en [1], selecciona el menú Tools/Plugins
  • en la pestaña [2], utilizar el botón [3]
  • en [4], seleccionar los archivos .nbm de los complementos descargados. Aquí, seleccionamos las bibliotecas de Struts versión 2.2.3 en lugar de las de Struts 2.0.14
  • De vuelta en la pestaña [2], instalamos los complementos seleccionados con el botón [5].

La instalación de los complementos suele requerir reiniciar NetBeans.

1.3.3. Las bibliotecas de Struts 2

Si hemos descargado el complemento de Struts 2 para NetBeans, disponemos de las principales bibliotecas de Struts, pero no de todas. A continuación, necesitaremos algunas bibliotecas disponibles en el sitio web de Struts 2 [http://struts.apache.org/].

Seguimos el enlace [1] y luego el enlace [2] para descargar el archivo zip de la distribución 2.2.3.1. Una vez descomprimida la distribución, las bibliotecas necesarias para Struts se encuentran en la carpeta [lib] [3] de la distribución. Hay varias decenas y surge entonces la pregunta de cuáles son imprescindibles. Ahí es donde nos ayudará el plugin de Struts.