Struts 2 - Acciones

Actionsson el núcleo del marco Struts2, como lo son para cualquier marco MVC (Model View Controller). Cada URL se asigna a una acción específica, que proporciona la lógica de procesamiento necesaria para atender la solicitud del usuario.

Pero la acción también sirve en otras dos capacidades importantes. En primer lugar, la acción juega un papel importante en la transferencia de datos desde la solicitud hasta la vista, ya sea una JSP u otro tipo de resultado. En segundo lugar, la acción debe ayudar al marco a determinar qué resultado debe ofrecer la vista que se devolverá en la respuesta a la solicitud.

Crear acción

El único requisito para las acciones en Struts2es que debe haber un método sin argumento que devuelva un objeto String o Result y debe ser un POJO. Si no se especifica el método sin argumentos, el comportamiento predeterminado es utilizar el método execute ().

Opcionalmente puede extender el ActionSupport clase que implementa seis interfaces que incluyen Actioninterfaz. La interfaz de acción es la siguiente:

public interface Action {
   public static final String SUCCESS = "success";
   public static final String NONE = "none";
   public static final String ERROR = "error";
   public static final String INPUT = "input";
   public static final String LOGIN = "login";
   public String execute() throws Exception;
}

Echemos un vistazo al método de acción en el ejemplo de Hello World:

package com.tutorialspoint.struts2;

public class HelloWorldAction {
   private String name;

   public String execute() throws Exception {
      return "success";
   }
   
   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
}

Para ilustrar el punto de que el método de acción controla la vista, hagamos el siguiente cambio a la execute y amplíe la clase ActionSupport de la siguiente manera:

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport {
   private String name;

   public String execute() throws Exception {
      if ("SECRET".equals(name)) {
         return SUCCESS;
      } else {
         return ERROR;  
      }
   }
   
   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
}

En este ejemplo, tenemos algo de lógica en el método de ejecución para ver el atributo de nombre. Si el atributo es igual a la cadena"SECRET", regresamos SUCCESS como resultado de lo contrario volvemos ERRORcomo el resultado. Debido a que tenemos ActionSupport extendido, podemos usar constantes de cadenaSUCCESSy ERROR. Ahora, modifiquemos nuestro archivo struts.xml de la siguiente manera:

<?xml version = "1.0" Encoding = "UTF-8"?>
<!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.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">
      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorldAction"
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
         <result name = "error">/AccessDenied.jsp</result>
      </action>
   </package>
</struts>

Crear una vista

Creemos el siguiente archivo jsp HelloWorld.jspen la carpeta WebContent de su proyecto de eclipse. Para hacer esto, haga clic derecho en la carpeta WebContent en el explorador de proyectos y seleccioneNew >JSP File. Este archivo se llamará en caso de que el resultado devuelto sea SUCCESS, que es una constante de cadena "éxito" como se define en la interfaz de acción -

<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>

<html>
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      Hello World, <s:property value = "name"/>
   </body>
</html>

A continuación se muestra el archivo que será invocado por el marco en caso de que el resultado de la acción sea ERROR, que es igual a la constante de cadena "error". A continuación se muestra el contenido deAccessDenied.jsp

<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>

<html>  
   <head>
      <title>Access Denied</title>
   </head>
   
   <body>
      You are not authorized to view this page.
   </body>
</html>

También necesitamos crear index.jspen la carpeta WebContent. Este archivo servirá como la URL de acción inicial donde el usuario puede hacer clic para decirle al marco Struts 2 que llame alexecutede la clase HelloWorldAction y renderice la vista HelloWorld.jsp.

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
   <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>  
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      <h1>Hello World From Struts2</h1>
      <form action = "hello">
         <label for = "name">Please enter your name</label><br/>
         <input type = "text" name = "name"/>
         <input type = "submit" value = "Say Hello"/>
      </form>
   </body>
</html>

Eso es todo, no se requieren cambios para el archivo web.xml, así que usemos el mismo web.xml que habíamos creado en Examplescapítulo. Ahora, estamos listos para ejecutar nuestroHello World aplicación utilizando el marco Struts 2.

Ejecutar la aplicación

Haga clic derecho en el nombre del proyecto y haga clic en Export > WARArchivo para crear un archivo War. Luego, implemente este WAR en el directorio de aplicaciones web de Tomcat. Finalmente, inicie el servidor Tomcat e intente acceder a la URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. Esto le dará la siguiente pantalla:

Ingresemos una palabra como "SECRETO" y debería ver la siguiente página:

Ahora ingrese cualquier palabra que no sea "SECRETO" y debería ver la siguiente página:

Crear múltiples acciones

Con frecuencia, definirá más de una acción para manejar diferentes solicitudes y proporcionar diferentes URL a los usuarios, por lo que definirá diferentes clases como se define a continuación:

package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;

class MyAction extends ActionSupport {
   public static String GOOD = SUCCESS;
   public static String BAD = ERROR;
}

public class HelloWorld extends ActionSupport {
   ...
   public String execute() {
      if ("SECRET".equals(name)) return MyAction.GOOD;
      return MyAction.BAD;
   }
   ...
}

public class SomeOtherClass extends ActionSupport {
   ...
   public String execute() {
      return MyAction.GOOD;
   }
   ...
}

Configurará estas acciones en el archivo struts.xml de la siguiente manera:

<?xml version = "1.0" Encoding = "UTF-8"?>
<!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.devMode" value = "true" />
   
   <package name = "helloworld" extends = "struts-default">
      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorld" 
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
         <result name = "error">/AccessDenied.jsp</result>
      </action>
      
      <action name = "something" 
         class = "com.tutorialspoint.struts2.SomeOtherClass" 
         method = "execute">
         <result name = "success">/Something.jsp</result>
         <result name = "error">/AccessDenied.jsp</result>
      </action>
   </package>
</struts>

Como puede ver en el ejemplo hipotético anterior, la acción resulta SUCCESS y ERROR’s están duplicados.

Para solucionar este problema, se sugiere que cree una clase que contenga los resultados de los resultados.