Struts – Indroduccion y arranque de proyecto
¿Que es Struts2?
Uno de los principales frameworks de Java utilizados por gran
parte de los ingenieros de software más modernos es el sucesor de
Apache Struts 1, su versión número dos.
*Mención aparte están otros framewroks como SpringMVC y Spring
Boot.
Este framework es todo un hallazgo para los desarrolladores que
construyen nuevas aplicaciones web con Java EE . Apache ha entregado
a estos un conjunto enorme de herramientas para crear aplicaciones
web orientadas a empresas optimizando el proceso de desarrollo desde
el inicio hasta el final y el mantenimiento posterior a la entrada en
funcionamiento. Struts 2 es la elección correcta si la web va a
tener una carga alta de datos, como puede ser una web de broadcast.
Pros y contras
Es un lujo no tener que implementar la clase Action, ya que está
ya incorporada. El código para configurar repeticiones ya no es
necesario porque los interceptores se ocupan de ello .
Sin embargo, es posible que no te decantes por este framework por
una razón: muchos desarrolladores no lo consideran suficientemente
ágil para trabajar con él (habría que ver que desarrollo en JEE es
suficientemente ágil ;) )
Arquitectura Struts2
Struts 2 Interceptores
Struts Interceptors son como los Servlet Filters que se ejecutan
antes y después de que la solicitud que está siendo procesada. Se
utilizan para realizar operaciones comunes para diferentes acciones.
Ejemplo, registro, validación de sesión, agregando encabezados
comunes a la respuesta, etc.
Struts 2 ValueStack y OGNL
ValueStack es el área de almacenamiento donde los datos de la
aplicación son almacenados por Struts 2 para procesar una solicitud
de cliente. Los datos se almacenan en ActionContext (objetos
ActionContext) que utilizan ThreadLocal para tener valores
específicos para el subproceso particular de una solicitud.
El lenguaje de navegación de objetos gráficos (OGNL) es un
potente lenguaje de expresiones que se utiliza para manipular los
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
usando OGNL.
Struts 2 Action
Los componentes de Action de Struts 2 controlan las solicitudes
del cliente. Struts 2 proporciona diferentes formas de crear clases
Action.
-
Implementando la interfaz com.opensymphony.xwork2.Action.
-
Al extender la clase com.opensymphony.xwork2.ActionSupport
. Normalmente se utiliza para crear clases de acción vacías para
enviar la solicitud a otro recurso.
-
Anotaciones en una clase con anotación @Action o @Actions.
-
Después de la convención de nomenclatura para las clases,
el nombre debe terminar con Acción y debe tener el método execute
().
Struts 2 Resultado
Los componentes que muestran el resultado suelen ser páginas JSP
o HTML para crear una vista para la respuesta del cliente (podríamos
hacer otras aproximaciones para la mejora de la usabilidad del
cliente).
Struts 2 proporciona sus propias etiquetas que podemos utilizar en
las páginas JSP para crear respuestas. Las etiquetas de Struts son
un gran ejemplo de las etiquetas personalizadas de JSP .
Struts 2 Declarative Architecture and Wiring
Struts 2 proporciona dos maneras de configurar nuestra aplicación
para clases de acción y páginas de resultados.
-
Archivo XML : Tenemos el archivo struts.xml en el
directorio WEB-INF / classes donde podemos configurar nuestras
clases de acción de aplicación y páginas de resultados.
-
Anotaciones : Podemos usar Anotaciones Java para
proporcionar información de metadatos sobre una clase. El
complemento de convenciones Struts 2 se puede utilizar para anotar
clases java con anotaciones @Action y @Result y así crear clases de
acciones de configuración y páginas de resultados asociadas.
Independientemente de la forma que utilicemos para configurar
nuestra aplicación, el resultado final será siempre el mismo.
Manos a la obra
Veamos cómo podemos crear nuestra primera aplicación Struts 2.
Será solamente una intro, para poder arrancar un proyecto.
Requisitos
En primer lugar necesitamos archivos Struts2.jar, la forma más
fácil es descargarlo desde la página de descargas oficiales de
Struts 2 (cuestión de gustos, yo prefiero usar Maven). Cuando
revises las librerías en el archivo descargado, verás una gran
cantidad de archivos jar que no necesitamos para una primera
aplicación.
Así que voy a crear un proyecto Maven y añadir solo las
dependencias necesarias.
Empezamos con struts-core, todos los demás jars de dependencias
serán descargados automáticamente y agregados a la aplicación.
Paso 1.
Nuevo proyecto Web dinámico en Eclipse y luego convertirlo en
proyecto maven. Entiendo que es algo sencillo y no voy a entrar mucho
al detalle.
Al final nos deben crear 2 ficheros importantes:
WEB-INF/web.xml
pom.xml
*Importante, que luego da problemas de dependencias que no
sabes que sucede (la mayor parte de las veces son “las bondades”
de Eclipse).
Revisa el Build Path y las carpetas de los fuentes.
Revisa que añades un server Tomcat (v7 en mi caso)
Revisa los permisos en directorios y demás, para poder
desplegar.
Paso 2.
Modificamos el POM.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>MiApp</groupId>
<artifactId>MiApp</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>
Tener en cuenta que he modificado el finalName para evitar quese agregue el número de versión en el archivo WAR cuandoconstruimos con maven.
Otras piezas serán añadidas por Eclipse, la única dependencia que necesitamos es struts2-core cuya versión actual es 2.3.15.1 (a partir del 10-Sep-2013).
En el menú contextual, hacemos un
UPDATE del menú de MAVEN (ALT + F5) y se ha descargado todo.
Paso 3.
Configuración Struts2 - web.xml
Agrega el filtro
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
a la aplicación web y asi proporciona el patrón de URL en el que
queremos que Struts se encargue de la solicitud del cliente.
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>MiApp</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 la versión de Struts 2 por debajo de 2.1.3, la clase filtro
era org.apache.struts2.dispatcher.FilterDispatcher.Hasta aquí ya tenemos preparado todo para añadir código.
Páginas de resultados
login.jsp
<%@ page language="java" contentType="text/html; charset=US-ASCII"
pageEncoding="US-ASCII"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://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>
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" "http://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>
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" "http://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>
Action Classes
LoginAction.java
package com.mr.knight.struts2.action;
import com.opensymphony.xwork2.Action;
public class LoginAction implements Action {
@Override
public String execute() throws Exception {
if("admin".equals(getName()) && "admin123".equals(getPwd()))
return "SUCCESS";
else return "ERROR";
}
//Java Bean to hold the form parameters
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;
}
}
Configuration File
struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://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.mr.knight.struts2.action.LoginAction">
<result name="SUCCESS">/welcome.jsp</result>
<result name="ERROR">/error.jsp</result>
</action>
</package>
</struts>
Dado que estamos utilizando la configuración basada en XML para el
enlazado de nuestra aplicación, tenemos que crear el archivo de
configuración de Struts que debe ser nombrado como struts.xml y
dentro del directorio WEB-INF / classes .
(Si habeis creado el proyecto Maven
correctamente podrías tenerlo como veis en la imagen)
Para que podamos acceder a nuestra aplicación con URL http://localhost:8080/MiApp/User/home.action . Observe que la URL está terminando con .action que es el sufijo predeterminado para la acción de Struts 2 como es .do para Struts 1.
Hasta aquí, esta primera sesion de struts2
No hay comentarios:
Publicar un comentario
Nota: solo los miembros de este blog pueden publicar comentarios.