Tutorial de Struts para Principiantes

Bienvenido al Tutorial de Struts para Principiantes. Struts es uno de los frameworks más antiguos para construir Aplicaciones Web Java.

Tutorial de Struts

Struts fue la implementación inicial del patrón de diseño MVC y ha evolucionado mucho junto con las últimas mejoras en las tecnologías Java y Java EE. El artículo del tutorial de Struts tiene como objetivo proporcionar detalles básicos de Struts 2 y cómo podemos crear nuestra primera aplicación “Hola Mundo” con Struts 2.

Struts 2

Apache Struts 2 es un framework de código abierto, estándar de la industria, flexible y extensible para construir aplicaciones web Java EE. Struts 2 se basa en el framework OpenSymphony WebWork. Struts 2 es muy flexible en cuanto al desarrollo y configuraciones, y veremos lo fácil que es desarrollar una aplicación web utilizando el framework Struts 2.

Diagrama de Arquitectura de Struts 2

El diagrama siguiente muestra los diferentes componentes de Struts 2 en una aplicación web.

Interceptores de Struts 2

Los Interceptores de Struts son como los Filtros Servlet que se ejecutan antes y después de que se procese la solicitud. Se utilizan para realizar operaciones comunes en diferentes acciones. Por ejemplo, registro, validación de sesión, añadir encabezados comunes a la respuesta, etc.

ValueStack y OGNL de Struts 2

ValueStack es el área de almacenamiento donde los datos de la aplicación son guardados por Struts 2 para procesar una solicitud del cliente. Los datos se almacenan en objetos ActionContext que utilizan ThreadLocal para tener valores específicos para el hilo de solicitud particular. Object-Graph Navigation Language (OGNL) es un potente Lenguaje de Expresión que se utiliza para manipular datos almacenados en el ValueStack. Como se puede ver en el diagrama de arquitectura, tanto los interceptores como las páginas de resultados pueden acceder a los datos almacenados en ValueStack utilizando OGNL.

Acción de Struts 2

Los componentes de Acción de Struts 2 manejan las solicitudes del cliente. Struts 2 proporciona diferentes formas de crear clases de Acción.

  1. Al implementar la interfaz com.opensymphony.xwork2.Action.
  2. Al extender la clase com.opensymphony.xwork2.ActionSupport. Usualmente se utiliza para crear clases de acción vacías para reenviar la solicitud a otro recurso.
  3. Al anotar una clase con la anotación @Action o @Actions.
  4. Siguiendo la convención de nombres para clases, el nombre debe terminar con Action y debe tener el método execute().

Resultado de Struts 2

Los componentes de resultado suelen ser páginas JSP o HTML para crear la vista de la respuesta del cliente. Struts 2 proporciona sus propias etiquetas que podemos usar en páginas JSP para crear la respuesta. Las etiquetas de Struts son un gran ejemplo de Etiquetas Personalizadas de JSP.

Arquitectura y Conexión Declarativa de Struts 2

Struts 2 proporciona dos formas de configurar nuestra aplicación para clases de acción y páginas de resultado.

  1. Archivo XML de Struts: Tenemos el archivo struts.xml en el directorio WEB-INF/classes donde podemos configurar las clases de acción y las páginas de resultado de nuestra aplicación.
  2. Anotación: Podemos usar Anotaciones Java para proporcionar información de metadatos sobre una clase. El complemento de convención de Struts 2 se puede utilizar para anotar clases Java con las anotaciones @Action y @Result para crear clases de acción y páginas de resultado asociadas.

De cualquier manera que usemos para configurar nuestra aplicación, el resultado final siempre será el mismo.

Tutorial de Struts – Aplicación Hola Mundo basada en XML

Veamos cómo podemos crear nuestra primera aplicación Struts 2 Hello World. Lo primero que necesitamos son los archivos jar de Struts 2, la forma más sencilla es descargarlos desde la página de descargas oficial de Struts 2. Pero cuando revises las bibliotecas en el archivo descargado, verás muchos archivos jar que no necesitamos para nuestra aplicación simple. Así que crearé un proyecto Maven y agregaré solo la dependencia de struts-core, todos los demás archivos jar de dependencias transitivas se descargarán automáticamente y se agregarán a la aplicación. La estructura final de nuestro proyecto será como la imagen a continuación. Crea un nuevo Proyecto Web Dinámico Struts2XMLHelloWorld en Eclipse y luego conviértelo en un proyecto Maven como se muestra en la imagen a continuación. Notarás que se ha agregado el archivo pom.xml en el directorio raíz del proyecto. Nuestra configuración del proyecto en Eclipse está lista, veamos los diferentes componentes en orden.

pom.xml

Abre el archivo pom.xml y agrega la dependencia de struts core, el pom.xml final se verá así.

<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>Struts2XMLHelloWorld</groupId>
	<artifactId>Struts2XMLHelloWorld</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>

	<dependencies>
		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-core</artifactId>
			<version>2.3.15.1</version>
		</dependency>
	</dependencies>
	<build>
		<sourceDirectory>src</sourceDirectory>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.1</version>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
				</configuration>
			</plugin>
			<plugin>
				<artifactId>maven-war-plugin</artifactId>
				<version>2.3</version>
				<configuration>
					<warSourceDirectory>WebContent</warSourceDirectory>
					<failOnMissingWebXml>false</failOnMissingWebXml>
				</configuration>
			</plugin>
		</plugins>
		<finalName>${project.artifactId}</finalName>
	</build>
</project>

Ten en cuenta que he anulado el elemento finalName para evitar que se agregue el número de versión en el archivo WAR cuando hacemos la construcción con Maven. Otras partes son añadidas por Eclipse mismo, la única dependencia que necesitamos es struts2-core cuya versión actual es 2.3.15.1 (a partir del 10 de septiembre de 2013). Simplemente realiza la construcción con Maven de la aplicación y verás que se añaden muchas bibliotecas al directorio lib de la aplicación y se muestran en la sección Dependencias de Maven del proyecto como en la siguiente imagen.

Configuración de web.xml de Struts 2

Necesitamos agregar el filtro org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter a la aplicación web y proporcionar el patrón de URL donde queremos que Struts se encargue de la solicitud del cliente. Nuestro web.xml se ve así;

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
	xmlns="https://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	version="3.0">
	<display-name>Struts2XMLHelloWorld</display-name>
	
	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>

Para versiones de Struts 2 inferiores a 2.1.3, la clase de filtro era org.apache.struts2.dispatcher.FilterDispatcher.

Tutorial de Struts – Páginas de resultado

Tenemos tres páginas JSP que serán utilizadas por la aplicación, estamos utilizando etiquetas Struts 2 para crear nuestras páginas JSP. `login.jsp`

<%@ page language="java" contentType="text/html; charset=US-ASCII"
    pageEncoding="US-ASCII"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<%-- Using Struts2 Tags in JSP --%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Login Page</title>
</head>
<body>
<h3>Welcome User, please login below</h3>
<s:form action="login">
	<s:textfield name="name" label="User Name"></s:textfield>
	<s:textfield name="pwd" label="Password" type="password"></s:textfield>
	<s:submit value="Login"></s:submit>
</s:form>
</body>
</html>

Observa que los nombres de los campos del formulario son name y pwd, veremos cómo se utilizan en las clases Action. `welcome.jsp`

<%@ page language="java" contentType="text/html; charset=US-ASCII"
    pageEncoding="US-ASCII"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Welcome Page</title>
</head>
<body>
<h3>Welcome <s:property value="name"></s:property></h3>
</body>
</html>

Observa la etiqueta Struts `s:property` que podemos usar para obtener atributos de solicitud, el nombre es el mismo que en login.jsp. `error.jsp`

<%@ page language="java" contentType="text/html; charset=US-ASCII"
    pageEncoding="US-ASCII"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Error Page</title>
</head>
<body>
<h4>User Name or Password is wrong</h4>
<s:include value="login.jsp"></s:include>
</body>
</html>

Esta es una página JSP simple donde estamos agregando un mensaje de error e incluyendo la página de inicio de sesión en la respuesta.

Tutorial de Struts – Clases Action

Nuestra aplicación tiene solo una clase Action donde estamos implementando la interfaz Action de Struts 2. `LoginAction.java`

package com.journaldev.struts2.action;

import com.opensymphony.xwork2.Action;

public class LoginAction implements Action {
	
	@Override
	public String execute() throws Exception {
		if("pankaj".equals(getName()) && "admin".equals(getPwd()))
		return "SUCCESS";
		else return "ERROR";
	}
	
	// Bean Java para contener los parámetros del formulario
	private String name;
	private String pwd;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	
}

Observa que la clase de acción también es un bean Java con las mismas variables que login.jsp y sus métodos getter y setter. Struts se encargará de mapear los parámetros de solicitud a las variables de la clase de acción.

Tutorial de Struts – Archivo de Configuración

Desde que estamos utilizando configuración basada en XML para conectar nuestra aplicación, necesitamos crear un archivo de configuración de Struts que debería llamarse struts.xml y ubicarlo dentro del directorio WEB-INF/classes. struts.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"https://struts.apache.org/dtds/struts-2.3.dtd">
<struts>

<package name="user" namespace="/User" extends="struts-default">
	<action name="home">
		<result>/login.jsp</result>
	</action>
	<action name="login" class="com.journaldev.struts2.action.LoginAction">
	<result name="SUCCESS">/welcome.jsp</result>
	<result name="ERROR">/error.jsp</result>
	</action>

</package>

</struts>

Para la acción “home”, no hay una clase de acción y solo hay un resultado, por lo que la solicitud se reenviará a la página login.jsp. Para la acción “login”, LoginAction es la clase de acción y si el método execute() devuelve “SUCCESS”, la solicitud se procesará en welcome.jsp y para “ERROR” se reenviará a la página error.jsp. namespace=”/User” es importante y se utiliza en la URL para acceder a las clases de acción, se proporciona para crear diferentes módulos. Así podemos acceder a nuestra aplicación con la URL https://localhost:8080/Struts2XMLHelloWorld/User/home.action. Observa que la URL termina con .action, que es el sufijo predeterminado para las acciones de Struts 2, al igual que .do para Struts 1.

Struts Tutorial – Struts 2 Hello World Test

Cuando ejecutamos nuestra aplicación, obtenemos las siguientes páginas de respuesta.

Descargar el Proyecto de Ejemplo de Hola Mundo de Struts2

Eso es todo para el tutorial para principiantes de Struts 2, echa un vistazo al siguiente artículo en el que usamos anotaciones para crear Aplicaciones Web Struts 2 sin usar el archivo de configuración struts.xml.

Source:
https://www.digitalocean.com/community/tutorials/struts-tutorial-for-beginners