Struts 2 - Interceptores

Los interceptores son conceptualmente los mismos que los filtros de servlets o la clase de proxy JDK. Los interceptores permiten que la funcionalidad transversal se implemente por separado de la acción y del marco. Puede lograr lo siguiente utilizando interceptores:

  • Proporcionar lógica de preprocesamiento antes de que se llame a la acción.

  • Proporcionar lógica de posprocesamiento después de llamar a la acción.

  • Captura de excepciones para que se pueda realizar un procesamiento alternativo.

Muchas de las funciones proporcionadas en el Struts2 el marco se implementa utilizando interceptores;

Examples incluyen manejo de excepciones, carga de archivos, devoluciones de llamada de ciclo de vida, etc. De hecho, como Struts2 enfatiza gran parte de su funcionalidad en interceptores, no es probable que tenga 7 u 8 interceptores asignados por acción.

Interceptores de estructura Struts2

El marco Struts 2 proporciona una buena lista de interceptores listos para usar que vienen preconfigurados y listos para usar. Algunos de los interceptores importantes se enumeran a continuación:

No Señor Interceptor y descripción
1

alias

Permite que los parámetros tengan diferentes alias de nombres en las solicitudes.

2

checkbox

Ayuda a administrar las casillas de verificación agregando un valor de parámetro falso para las casillas de verificación que no están marcadas.

3

conversionError

Coloca la información de error de convertir cadenas a tipos de parámetros en los errores de campo de la acción.

4

createSession

Crea automáticamente una sesión HTTP si aún no existe una.

5

debugging

Proporciona varias pantallas de depuración diferentes al desarrollador.

6

execAndWait

Envía al usuario a una página de espera intermedia mientras la acción se ejecuta en segundo plano.

7

exception

Asigna las excepciones que se lanzan de una acción a un resultado, lo que permite el manejo automático de excepciones mediante la redirección.

8

fileUpload

Facilita la carga de archivos fácil.

9

i18n

Realiza un seguimiento de la configuración regional seleccionada durante la sesión de un usuario.

10

logger

Proporciona un registro simple al mostrar el nombre de la acción que se está ejecutando.

11

params

Establece los parámetros de solicitud en la acción.

12

prepare

Suele utilizarse para realizar trabajos de preprocesamiento, como configurar conexiones de bases de datos.

13

profile

Permite que se registre información de perfil simple para acciones.

14

scope

Almacena y recupera el estado de la acción en el ámbito de la sesión o la aplicación.

15

ServletConfig

Proporciona a la acción acceso a diversa información basada en servlets.

dieciséis

timer

Proporciona información de creación de perfiles sencilla en forma de cuánto tarda en ejecutarse la acción.

17

token

Comprueba la acción de un token válido para evitar el envío de formularios duplicados.

18

validation

Proporciona soporte de validación para acciones.

Consulte la documentación de Struts 2 para obtener detalles completos sobre los interceptores mencionados anteriormente. Pero te mostraré cómo usar un interceptor en general en tu aplicación Struts.

¿Cómo utilizar los interceptores?

Veamos cómo usar un interceptor ya existente para nuestro programa "Hello World". Usaremos eltimerinterceptor cuyo propósito es medir cuánto tiempo se tardó en ejecutar un método de acción. Al mismo tiempo, estoy usandoparamsinterceptor cuyo propósito es enviar los parámetros de solicitud a la acción. Puede probar su ejemplo sin usar este interceptor y encontrará quename La propiedad no se está configurando porque el parámetro no puede llegar a la acción.

Mantendremos los archivos HelloWorldAction.java, web.xml, HelloWorld.jsp e index.jsp tal y como se han creado en Examples capítulo, pero modifiquemos el struts.xml archivo para agregar un interceptor 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">
         <interceptor-ref name = "params"/>
         <interceptor-ref name = "timer" />
         <result name = "success">/HelloWorld.jsp</result>
      </action>
   </package>
</struts>

Haga clic derecho en el nombre del proyecto y haga clic en Export > WAR Filepara 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 producirá la siguiente pantalla:

Ahora ingrese cualquier palabra en el cuadro de texto dado y haga clic en el botón Diga Hola para ejecutar la acción definida. Ahora, si comprueba el registro generado, encontrará el siguiente texto:

INFO: Server startup in 3539 ms
27/08/2011 8:40:53 PM 
com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
INFO: Executed action [//hello!execute] took 109 ms.

Aquí el resultado final se genera debido a timer interceptor que dice que la acción tomó un total de 109 ms para ejecutarse.

Crear interceptores personalizados

El uso de interceptores personalizados en su aplicación es una forma elegante de proporcionar funciones de aplicaciones transversales. Crear un interceptor personalizado es fácil; la interfaz que debe ampliarse es la siguienteInterceptor interfaz -

public interface Interceptor extends Serializable {
   void destroy();
   void init();
   String intercept(ActionInvocation invocation)
   throws Exception;
}

Como sugieren los nombres, el método init () proporciona una forma de inicializar el interceptor, y el método destroy () proporciona una función para la limpieza del interceptor. A diferencia de las acciones, los interceptores se reutilizan en las solicitudes y deben ser seguros para los subprocesos, especialmente el método intercept ().

los ActionInvocationEl objeto proporciona acceso al entorno de ejecución. Permite el acceso a la acción en sí y los métodos para invocar la acción y determinar si la acción ya ha sido invocada.

Si no necesita un código de inicialización o limpieza, el AbstractInterceptorla clase se puede ampliar. Esto proporciona una implementación predeterminada sin operación de los métodos init () y destroy ().

Crear clase de interceptor

Creemos el siguiente MyInterceptor.java en Java Resources > src carpeta -

package com.tutorialspoint.struts2;

import java.util.*;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class MyInterceptor extends AbstractInterceptor {

   public String intercept(ActionInvocation invocation)throws Exception {

      /* let us do some pre-processing */
      String output = "Pre-Processing"; 
      System.out.println(output);

      /* let us call action or next interceptor */
      String result = invocation.invoke();

      /* let us do some post-processing */
      output = "Post-Processing"; 
      System.out.println(output);

      return result;
   }
}

Como puede observar, la acción real se ejecutará utilizando el interceptor por invocation.invoke()llamada. Por lo tanto, puede realizar un preprocesamiento y un posprocesamiento según sus requisitos.

El marco en sí mismo inicia el proceso haciendo la primera llamada al invoke () del objeto ActionInvocation. Cada vezinvoke()se llama, ActionInvocation consulta su estado y ejecuta el interceptor que venga a continuación. Cuando se hayan invocado todos los interceptores configurados, el método invoke () hará que se ejecute la acción en sí.

El siguiente diagrama muestra el mismo concepto a través de un flujo de solicitud:

Crear clase de acción

Creemos un archivo Java HelloWorldAction.java en Java Resources > src con un nombre de paquete com.tutorialspoint.struts2 con el contenido que se indica a continuación.

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport {
   private String name;

   public String execute() throws Exception {
      System.out.println("Inside action....");
      return "success";
   }  

   public String getName() {
      return name;
   }

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

Esta es una misma clase que hemos visto en ejemplos anteriores. Tenemos métodos getters y setter estándar para la propiedad "name" y un método de ejecución que devuelve la cadena "success".

Crear una vista

Creemos el siguiente archivo jsp HelloWorld.jsp en la carpeta WebContent de su proyecto eclipse.

<%@ 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>

Crear página principal

También necesitamos crear index.jspen la carpeta WebContent. Este archivo servirá como la URL de acción inicial donde un usuario puede hacer clic para decirle al marco Struts 2 que llame al método definido de la clase HelloWorldAction y muestre 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>

los hello La acción definida en el archivo de vista anterior se asignará a la clase HelloWorldAction y su método de ejecución mediante el archivo struts.xml.

Archivos de configuración

Ahora, necesitamos registrar nuestro interceptor y luego llamarlo como habíamos llamado el interceptor predeterminado en el ejemplo anterior. Para registrar un interceptor recién definido, las etiquetas <interceptors> ... </interceptors> se colocan directamente debajo de la etiqueta <package> insstruts.xmlarchivo. Puede omitir este paso para los interceptores predeterminados como hicimos en nuestro ejemplo anterior. Pero aquí vamos a registrarnos y usarlo 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">

      <interceptors>
         <interceptor name = "myinterceptor"
            class = "com.tutorialspoint.struts2.MyInterceptor" />
      </interceptors>

      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorldAction" 
         method = "execute">
         <interceptor-ref name = "params"/>
         <interceptor-ref name = "myinterceptor" />
         <result name = "success">/HelloWorld.jsp</result>
      </action>

   </package>
</struts>

Cabe señalar que puede registrar más de un interceptor dentro <package> etiqueta y al mismo tiempo puede llamar a más de un interceptores dentro del <action>etiqueta. Puede llamar al mismo interceptor con las diferentes acciones.

El archivo web.xml debe crearse en la carpeta WEB-INF en WebContent de la siguiente manera:

<?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" 
   xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee 
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id = "WebApp_ID" version = "3.0">
   
   <display-name>Struts 2</display-name>
   
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
   
   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>

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

Haga clic derecho en el nombre del proyecto y haga clic en Export > WAR Filepara 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 producirá la siguiente pantalla:

Ahora ingrese cualquier palabra en el cuadro de texto dado y haga clic en el botón Diga Hola para ejecutar la acción definida. Ahora, si revisa el registro generado, encontrará el siguiente texto en la parte inferior:

Pre-Processing
Inside action....
Post-Processing

Apilamiento de múltiples interceptores

Como puede imaginar, tener que configurar varios interceptores para cada acción rápidamente se volvería extremadamente inmanejable. Por esta razón, los interceptores se gestionan con pilas de interceptores. Aquí hay un ejemplo, directamente del archivo strutsdefault.xml:

<interceptor-stack name = "basicStack">
   <interceptor-ref name = "exception"/>
   <interceptor-ref name = "servlet-config"/>
   <interceptor-ref name = "prepare"/>
   <interceptor-ref name = "checkbox"/>
   <interceptor-ref name = "params"/>
   <interceptor-ref name = "conversionError"/>
</interceptor-stack>

La apuesta anterior se llama basicStacky se puede utilizar en su configuración como se muestra a continuación. Este nodo de configuración se coloca debajo del nodo <paquete ... />. Cada etiqueta <interceptor-ref ... /> hace referencia a un interceptor o una pila de interceptores que se ha configurado antes que la pila de interceptores actual. Por lo tanto, es muy importante asegurarse de que el nombre sea único en todas las configuraciones de interceptores y pilas de interceptores al configurar los interceptores iniciales y las pilas de interceptores.

Ya hemos visto cómo aplicar interceptor a la acción, la aplicación de pilas de interceptor no es diferente. De hecho, usamos exactamente la misma etiqueta:

<action name = "hello" class = "com.tutorialspoint.struts2.MyAction">
   <interceptor-ref name = "basicStack"/>
   <result>view.jsp</result>
</action

El registro anterior de "basicStack" registrará la participación completa de los seis interceptores con acción de saludo. Cabe señalar que los interceptores se ejecutan en el orden en el que se han configurado. Por ejemplo, en el caso anterior, la excepción se ejecutará primero, la segunda será servlet-config y así sucesivamente.