Struts 2 - Actions

Actionssont au cœur du framework Struts2, comme ils le sont pour tout framework MVC (Model View Controller). Chaque URL est mappée à une action spécifique, qui fournit la logique de traitement nécessaire pour traiter la demande de l'utilisateur.

Mais l'action sert également dans deux autres capacités importantes. Premièrement, l'action joue un rôle important dans le transfert des données de la requête à la vue, qu'il s'agisse d'une JSP ou d'un autre type de résultat. Deuxièmement, l'action doit aider le cadre à déterminer quel résultat doit rendre la vue qui sera renvoyée dans la réponse à la demande.

Créer une action

La seule exigence pour les actions dans Struts2est qu'il doit y avoir une méthode noargument qui renvoie un objet String ou Result et doit être un POJO. Si la méthode sans argument n'est pas spécifiée, le comportement par défaut est d'utiliser la méthode execute ().

En option, vous pouvez étendre le ActionSupport classe qui implémente six interfaces dont Actioninterface. L'interface Action est la suivante -

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

Jetons un coup d'œil à la méthode d'action dans l'exemple 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;
   }
}

Pour illustrer le fait que la méthode d'action contrôle la vue, apportons la modification suivante à la execute et étendez la classe ActionSupport comme suit -

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

Dans cet exemple, nous avons une certaine logique dans la méthode d'exécution pour examiner l'attribut name. Si l'attribut est égal à la chaîne"SECRET", nous retournons SUCCESS comme résultat sinon nous retournons ERRORcomme résultat. Parce que nous avons étendu ActionSupport, nous pouvons donc utiliser des constantes StringSUCCESSet ERREUR. Maintenant, modifions notre fichier struts.xml 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">
         <result name = "success">/HelloWorld.jsp</result>
         <result name = "error">/AccessDenied.jsp</result>
      </action>
   </package>
</struts>

Créer une vue

Créons le fichier jsp ci-dessous HelloWorld.jspdans le dossier WebContent de votre projet eclipse. Pour ce faire, faites un clic droit sur le dossier WebContent dans l'explorateur de projet et sélectionnezNew >JSP File. Ce fichier sera appelé dans le cas où le résultat du retour est SUCCESS qui est une constante String "success" telle que définie dans l'interface Action -

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

Voici le fichier qui sera appelé par le framework dans le cas où le résultat de l'action est ERROR qui est égal à la constante String "error". Voici le contenu 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>

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

Voilà, il n'y a pas de changement requis pour le fichier web.xml, alors utilisons le même web.xml que nous avions créé dans Exampleschapitre. Maintenant, nous sommes prêts à exécuter notreHello World application utilisant le framework Struts 2.

Exécutez l'application

Faites un clic droit sur le nom du projet et cliquez sur Export > WARFichier pour 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 vous donnera l'écran suivant -

Laissez-nous entrer un mot comme "SECRET" et vous devriez voir la page suivante -

Entrez maintenant un mot autre que "SECRET" et vous devriez voir la page suivante -

Créer plusieurs actions

Vous définirez fréquemment plus d'une action pour gérer différentes demandes et pour fournir différentes URL aux utilisateurs, en conséquence, vous définirez différentes classes comme défini ci-dessous -

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

Vous allez configurer ces actions dans le fichier struts.xml 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.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>

Comme vous pouvez le voir dans l'exemple hypothétique ci-dessus, l'action résulte SUCCESS et ERROR’s sont dupliqués.

Pour contourner ce problème, il est suggéré de créer une classe contenant les résultats des résultats.