17 jun 2017

Struts 2 - Start project (Maven)

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

Share This!



No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.