Dans notre précédent article, nous avons exploré la manière dont les Actions Struts2 reçoivent des paramètres. Aujourd'hui, nous allons nous pencher sur les quatre types de résultats Result dans Struts2 : dispatcher (redirection côté serveur), redirect (redirection côté client), chain (chaîne d'actions) et redirectAction (redirection d'action côté client). Bien que d'autres types existent, nous nous concentrerons sur ces quatre fondamentaux. Examinons leur mise en œuvre pratique à travers des exemples de configuration :
<package name="gestionResultats" namespace="/gestionResultats" extends="struts-default">
<!-- http://localhost:8080/Struts/gestionResultats/default -->
<action name="default" class="com.formation.action.GestionResultats">
<result name="success">/default.jsp</result>
</action>
<!-- http://localhost:8080/Struts/gestionResultats/dispatcher -->
<action name="dispatcher" class="com.formation.action.GestionResultats" method="Dispatcher">
<result name="success" type="dispatcher">/dispatcher.jsp</result>
</action>
<!-- http://localhost:8080/Struts/gestionResultats/redirect -->
<action name="redirect" class="com.formation.action.GestionResultats" method="Redirect">
<result name="success" type="redirect">/redirect.jsp</result>
</action>
<!-- http://localhost:8080/Struts/gestionResultats/chain -->
<action name="chain" class="com.formation.action.GestionResultats" method="Chain">
<result name="success" type="chain">suiviChain</result>
</action>
<action name="suiviChain" class="com.formation.action.GestionResultats" method="Chain">
<result name="success">/chain.jsp</result>
</action>
<!-- http://localhost:8080/Struts/gestionResultats/redirectAction -->
<action name="redirectAction" class="com.formation.action.GestionResultats" method="RedirectAction">
<result name="success" type="redirectAction">
<param name="namespace">/redirectionAction</param>
<param name="actionName">default</param>
</result>
</action>
<!-- Redirection avec paramètre unique -->
<action name="redirectAction" class="com.formation.action.GestionResultats" method="RedirectAction">
<result name="success" type="redirectAction">
<param name="namespace">/redirectionAction</param>
<param name="actionName">default?parametre1=${parametre1}</param>
</result>
</action>
<!-- Redirection avec multiples paramètres -->
<action name="redirectAction" class="com.formation.action.GestionResultats" method="RedirectAction">
<result name="success" type="redirectAction">
<param name="namespace">/redirectionAction</param>
<param name="actionName">default</param>
<param name="parametre1">${parametre1}</param>
<param name="parametre2">${parametre2}</param>
</result>
</action>
</package>
<package name="redirectionAction" namespace="/redirectionAction" extends="struts-default">
<action name="default" class="com.formation.action.GestionResultats">
<result name="success">/redirectionAction.jsp</result>
</action>
</package>
Pour l'action par défaut, nous n'avons pas spécifié de type de résultat, le système utilise donc automatiquement le type dispatcher. Le dispatcher ne permet de rediriger que vers des pages, tout comme redirect. La distinction réside dans le fait que dispatcher effectue une redirection côté serveur (l'URL dans la barre d'adresse ne change pas), tandis que redirect effectue une redirection côté client (l'URL est mise à jour). Le type chain permet une redirection en chaîne dynamique, ce qui signifie que nous pouvons toujours accéder aux paramètres passés à la première action dans la seconde action. Nous pouvons ajouter <s:debug></s:debug> dans nos pages pour examiner les détails. Le type redirectAction est assez explicite dans sa configuration et ne nécessite pas d'explication supplémentaire. Examinons maintenant la redirection en chaîne dynamique :
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String chemin = request.getContextPath();
String baseChemin = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+chemin+"/";
%>
<%@taglib uri="/struts-tags" prefix="s"%>
<html>
<head>
<base href="<%=baseChemin%>">
<title>Redirection par types de résultats</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="motcle1,motcle2,motcle3">
<meta http-equiv="description" content="Page de redirection">
</head>
<body>
Redirection de type chain
<s:debug></s:debug>
</body>
</html>
En exécutent notre application et en consultant le débogueur, nous obtenons une meilleure compréhension de la redirection en chaîne dynamique. Pour plus d'informations détaillées, veuillez consulter : http://blog.csdn.net/randomnet/article/details/8656759
Passons maintenant à la configuration des résultats globaux (global-results). Voici un exemple de configuration :
<?xml version="1.0" encoding="UTF-8" ?>
<struts>
<package name="parDefaut" namespace="/" extends="struts-default">
<!-- http://localhost:8080/Struts13/connexion?nom=3 -->
<global-results>
<result name="autre">/autre.jsp</result>
</global-results>
<action name="connexion" class="com.formation.action.Connexion">
<!-- http://localhost:8080/Struts13/connexion?nom=1 -->
<result name="success">/succes.jsp</result>
<!-- http://localhost:8080/Struts13/connexion?nom=2 -->
<result name="error">/erreur.jsp</result>
</action>
</package>
</struts>
Examinons maintenant la classe Action correspondante :
public class Connexion extends ActionSupport implements ModelDriven<Utilisateur>{
private Utilisateur utilisateur = new Utilisateur();
@Override
public String execute() throws Exception {
if(utilisateur.getNom() == 1){
return SUCCESS;
} else if(utilisateur.getNom() == 2){
return ERROR;
} else {
return "autre";
}
}
public Utilisateur getModel() {
return utilisateur;
}
}
Nous remarquons que lorsque la valeur du nom est 1 ou 2, l'Action retourne "autre". En consultant le fichier de configuration, nous constatons que l'Action "connexion" ne contient pas de résultat pour le type "autre". Comment est géré ce cas ? La réponse se trouve dans la configuration des résultats globaux :
<global-results>
<result name="autre">/autre.jsp</result>
</global-results>
Les global-results permettent de définir des résultats qui s'appliquent à toutes les actions du package. Ainsi, lorsque l'Action retourne "autre", ce résultat est traité par la configuration globale.
Intéressons-nous maintenant aux résultats dynamiques. Voici une classe Action qui illustre ce concept :
public class ResultatJsp extends ActionSupport implements ModelDriven<Utilisateur>{
private Utilisateur utilisateur = new Utilisateur();
private String resultatJsp;
public String getResultatJsp() {
return resultatJsp;
}
public void setResultatJsp(String resultatJsp) {
this.resultatJsp = resultatJsp;
}
@Override
public String execute() throws Exception {
if(utilisateur.getNom() == 1){
resultatJsp = "succes.jsp";
} else {
resultatJsp = "erreur.jsp";
}
return SUCCESS;
}
public Utilisateur getModel() {
return utilisateur;
}
}
Lorsque la valeur de nom est 1, nous définissons resultatJsp sur "succes.jsp". Comment le fichier de configuration gère-t-il ce résultat dynamique ? Examinons la configuration :
<?xml version="1.0" encoding="UTF-8" ?>
<struts>
<package name="parDefaut" namespace="/" extends="struts-default">
<default-action-ref name="index"></default-action-ref>
<!-- http://localhost:8080/Struts/connexion?nom=1 -->
<action name="connexion" class="com.formation.action.ResultatJsp">
<result>${resultatJsp}</result>
</action>
</package>
</struts>
Nous utilisons ${resultatJsp} pour définir dynamiquement la page de redirection. Par défaut, sans spécification de type, le résultat utilise le type dispatcher (redirection côté serveur).
Passons maintenant au passage de paramètres dynamiques. Lorsqu'une Action est traitée, nous pouvons transmettre des paramètres à la page de destination. Voici un exemple d'Action :
public class PassageParametres extends ActionSupport{
private String nom;
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
Et la configuration correspondente pour passser ce paramètre dynamiquement :
<?xml version="1.0" encoding="UTF-8" ?>
<struts>
<package name="parDefaut" namespace="/" extends="struts-default">
<default-action-ref name="index"></default-action-ref>
<!-- http://localhost:8080/Struts/connexion?nom=1 -->
<action name="connexion" class="com.formation.action.PassageParametres">
<result name="success" type="redirect">/succes.jsp?n=${nom}</result>
</action>
</package>
</struts>
Nous utilisons ici le type redirect pour que les paramètres soient visibles dans la barre d'adresse du navigateur, ce qui facilite le débogage.
Enfin, abordons une question concernant les résultats globaux : si une action ne définit pas de résultat pour une valeur de retour donnée, Struts2 recherche dans les résultats globaux. Si aucun résultat n'est trouvé dans les globaux non plus, une page d'erreur standard est affichée.
Ceci conclut notre exploration des résultats dans Struts2. Notre prochain sujet portera sur les expressions OGNL, avec d'autres contenus à suivre.