Struts 2 - Intercepteurs

Les intercepteurs sont conceptuellement les mêmes que les filtres de servlet ou la classe JDK Proxy. Les intercepteurs permettent de mettre en œuvre des fonctionnalités transversales séparément de l'action ainsi que du cadre. Vous pouvez réaliser ce qui suit en utilisant des intercepteurs -

  • Fournir une logique de prétraitement avant que l'action ne soit appelée.

  • Fournir une logique de post-traitement après l'appel de l'action.

  • Attraper des exceptions afin qu'un autre traitement puisse être effectué.

De nombreuses fonctionnalités fournies dans le Struts2 le cadre est implémenté à l'aide d'intercepteurs;

Examples incluent la gestion des exceptions, le téléchargement de fichiers, les rappels de cycle de vie, etc. En fait, comme Struts2 met l'accent sur une grande partie de ses fonctionnalités sur les intercepteurs, il est peu probable que 7 ou 8 intercepteurs soient attribués par action.

Intercepteurs de structure Struts2

Le framework Struts 2 fournit une bonne liste d'intercepteurs prêts à l'emploi qui sont préconfigurés et prêts à l'emploi. Peu des intercepteurs importants sont énumérés ci-dessous -

Sr. Non Intercepteur et description
1

alias

Permet aux paramètres d'avoir des alias de nom différents selon les demandes.

2

checkbox

Aide à gérer les cases à cocher en ajoutant une valeur de paramètre false pour les cases à cocher non cochées.

3

conversionError

Place les informations d'erreur de la conversion des chaînes en types de paramètres dans les erreurs de champ de l'action.

4

createSession

Crée automatiquement une session HTTP s'il n'en existe pas déjà une.

5

debugging

Fournit plusieurs écrans de débogage différents au développeur.

6

execAndWait

Envoie l'utilisateur vers une page d'attente intermédiaire pendant que l'action s'exécute en arrière-plan.

sept

exception

Mappe les exceptions qui sont levées d'une action à un résultat, permettant la gestion automatique des exceptions via la redirection.

8

fileUpload

Facilite le téléchargement facile des fichiers.

9

i18n

Garde une trace des paramètres régionaux sélectionnés pendant la session d'un utilisateur.

dix

logger

Fournit une journalisation simple en affichant le nom de l'action en cours d'exécution.

11

params

Définit les paramètres de demande sur l'action.

12

prepare

Ceci est généralement utilisé pour effectuer des travaux de prétraitement, tels que la configuration des connexions à la base de données.

13

profile

Permet de consigner des informations de profilage simples pour les actions.

14

scope

Stocke et récupère l'état de l'action dans la portée de la session ou de l'application.

15

ServletConfig

Fournit à l'action un accès à diverses informations basées sur les servlets.

16

timer

Fournit des informations de profilage simples sous la forme de la durée d'exécution de l'action.

17

token

Vérifie l'action pour un jeton valide pour éviter la soumission de formulaires en double.

18

validation

Fournit un support de validation pour les actions

Veuillez consulter la documentation de Struts 2 pour plus de détails sur les intercepteurs mentionnés ci-dessus. Mais je vais vous montrer comment utiliser un intercepteur en général dans votre application Struts.

Comment utiliser les intercepteurs?

Voyons comment utiliser un intercepteur déjà existant dans notre programme "Hello World". Nous utiliserons letimerintercepteur dont le but est de mesurer combien de temps il a fallu pour exécuter une méthode d'action. En même temps, j'utiliseparamsintercepteur dont le but est d'envoyer les paramètres de la requête à l'action. Vous pouvez essayer votre exemple sans utiliser cet intercepteur et vous constaterez quename La propriété n'est pas définie car le paramètre ne peut pas accéder à l'action.

Nous conserverons les fichiers HelloWorldAction.java, web.xml, HelloWorld.jsp et index.jsp tels qu'ils ont été créés dans Examples chapitre mais modifions le struts.xml fichier pour ajouter un intercepteur comme suit -

<?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>

Faites un clic droit sur le nom du projet et cliquez sur Export > WAR Filepour créer un fichier War. Déployez ensuite ce WAR dans le répertoire webapps de Tomcat. Enfin, démarrez le serveur Tomcat et essayez d'accéder à l'URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. Cela produira l'écran suivant -

Maintenant, entrez n'importe quel mot dans la zone de texte donnée et cliquez sur le bouton Say Hello pour exécuter l'action définie. Maintenant, si vous vérifiez le journal généré, vous trouverez le texte suivant -

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.

Ici, la ligne du bas est générée en raison de timer l'intercepteur qui dit que l'action a pris au total 109 ms pour être exécutée.

Créer des intercepteurs personnalisés

L'utilisation d'intercepteurs personnalisés dans votre application est un moyen élégant de fournir des fonctionnalités d'application transversales. La création d'un intercepteur personnalisé est facile; l'interface à étendre est la suivanteInterceptor interface -

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

Comme son nom l'indique, la méthode init () fournit un moyen d'initialiser l'intercepteur, et la méthode destroy () fournit une fonction de nettoyage de l'intercepteur. Contrairement aux actions, les intercepteurs sont réutilisés à travers les requêtes et doivent être threadsafe, en particulier la méthode intercept ().

le ActionInvocationobjet donne accès à l'environnement d'exécution. Il permet d'accéder à l'action elle-même et aux méthodes d'appeler l'action et de déterminer si l'action a déjà été appelée.

Si vous n'avez pas besoin de code d'initialisation ou de nettoyage, le AbstractInterceptorla classe peut être étendue. Ceci fournit une implémentation par défaut nooperation des méthodes init () et destroy ().

Créer une classe d'intercepteur

Créons le MyInterceptor.java suivant dans Java Resources > src dossier -

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;
   }
}

Comme vous le remarquez, l'action réelle sera exécutée à l'aide de l'intercepteur par invocation.invoke()appel. Vous pouvez donc effectuer un pré-traitement et un post-traitement en fonction de vos besoins.

Le framework lui-même démarre le processus en effectuant le premier appel à invoke () de l'objet ActionInvocation. Chaque foisinvoke()est appelée, ActionInvocation consulte son état et exécute l'intercepteur suivant. Lorsque tous les intercepteurs configurés ont été invoqués, la méthode invoke () provoquera l'exécution de l'action elle-même.

Le diagramme suivant montre le même concept à travers un flux de demande -

Créer une classe d'action

Créons un fichier java HelloWorldAction.java sous Java Resources > src avec un nom de package com.tutorialspoint.struts2 avec le contenu donné ci-dessous.

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;
   }
}

C'est une même classe que nous avons vue dans les exemples précédents. Nous avons des getters et des méthodes de définition standard pour la propriété "name" et une méthode d'exécution qui renvoie la chaîne "success".

Créer une vue

Créons le fichier jsp ci-dessous HelloWorld.jsp dans le dossier WebContent de votre projet 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>

Créer une page principale

Nous devons également créer index.jspdans le dossier WebContent. Ce fichier servira d'URL d'action initiale où un utilisateur peut cliquer pour indiquer au framework Struts 2 d'appeler la méthode définie de la classe HelloWorldAction et de restituer la vue 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>

le hello l'action définie dans le fichier de vue ci-dessus sera mappée à la classe HelloWorldAction et à sa méthode d'exécution à l'aide du fichier struts.xml.

Fichiers de configuration

Maintenant, nous devons enregistrer notre intercepteur, puis l'appeler comme nous l'avions appelé l'intercepteur par défaut dans l'exemple précédent. Pour enregistrer un intercepteur nouvellement défini, les balises <interceptors> ... </interceptors> sont placées directement sous la balise <package> insstruts.xmlfichier. Vous pouvez ignorer cette étape pour les intercepteurs par défaut comme nous l'avons fait dans notre exemple précédent. Mais ici, enregistrons-le et utilisons-le comme suit -

<?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>

Il est à noter que vous pouvez enregistrer plus d'un intercepteur à l'intérieur <package> et en même temps, vous pouvez appeler plus d'un intercepteur à l'intérieur du <action>marque. Vous pouvez appeler le même intercepteur avec les différentes actions.

Le fichier web.xml doit être créé dans le dossier WEB-INF sous WebContent comme suit -

<?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>

Faites un clic droit sur le nom du projet et cliquez sur Export > WAR Filepour créer un fichier War. Déployez ensuite ce WAR dans le répertoire webapps de Tomcat. Enfin, démarrez le serveur Tomcat et essayez d'accéder à l'URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. Cela produira l'écran suivant -

Maintenant, entrez n'importe quel mot dans la zone de texte donnée et cliquez sur le bouton Say Hello pour exécuter l'action définie. Maintenant, si vous vérifiez le journal généré, vous trouverez le texte suivant en bas -

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

Empiler plusieurs intercepteurs

Comme vous pouvez l'imaginer, devoir configurer plusieurs intercepteurs pour chaque action deviendrait rapidement extrêmement ingérable. Pour cette raison, les intercepteurs sont gérés avec des piles d'intercepteurs. Voici un exemple, directement à partir du fichier 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>

L'enjeu ci-dessus est appelé basicStacket peut être utilisé dans votre configuration comme indiqué ci-dessous. Ce nœud de configuration est placé sous le nœud <package ... />. Chaque balise <interceptor-ref ... /> fait référence à un intercepteur ou à une pile d'intercepteurs qui a été configurée avant la pile d'intercepteurs actuelle. Il est donc très important de s'assurer que le nom est unique dans toutes les configurations d'intercepteurs et de piles d'intercepteurs lors de la configuration des intercepteurs initiaux et des piles d'intercepteurs.

Nous avons déjà vu comment appliquer l'intercepteur à l'action, appliquer des piles d'intercepteurs n'est pas différent. En fait, nous utilisons exactement la même balise -

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

L'enregistrement ci-dessus de "basicStack" enregistrera la mise complète des six intercepteurs avec l'action bonjour. Il convient de noter que les intercepteurs sont exécutés dans l'ordre dans lequel ils ont été configurés. Par exemple, dans le cas ci-dessus, l'exception sera exécutée en premier, la seconde sera servlet-config et ainsi de suite.