Tutoriel Struts2 – Réaliser un formulaire de login avec session en utilisant MVC 2. A l’issue de ce tutoriel vous saurez manipuler un modèle et utiliser les ONGL (pour ObjectGraph Navigation Language) dans la couche vue.
Ce tutoriel implique que vous maîtrisiez déja l’environnement struts 2 tels que décrit ici.
Nous allons réalisé un simple formulaire de login en utilisant struts 2 et en respectant le modele MVC. Vous trouverez le code source java de l’application en bas de cette page.
Couche vue – Couche Action (controlleur) – couche modèle – Couche Données
1 – Création des beans et des classes Action
Commençons par créer un premier package dans notre répertoire source (src) que nous nommerons beans.
Dans ce package nous codons notre première classe que nous appellerons Utilisateur.
Utilisateur.java
package bean; /** * @author Olivier Guillou * 2009 février * * Bean simpleUtilisateur. */ public class Utilisateur { /* * Attributs */ /** * L'identifiant */ String identifiant; /** * Le mot de passe */ String mdp; /* * Constructeurs */ /** * Constructeur vide */ public Utilisateur() { // vide } /** * Constructeur qualifié * @param identifiant * @param mdp */ public Utilisateur(String identifiant, String mdp) { super(); this.identifiant = identifiant; this.mdp = mdp; } /* * Getters et setters */ /** * @return identifiant */ public String getIdentifiant() { return identifiant; } /** * @param identifiant */ public void setIdentifiant(String identifiant) { this.identifiant = identifiant; } /** * @return mdp */ public String getMdp() { return mdp; } /** * @param mdp */ public void setMdp(String mdp) { this.mdp = mdp; } } |
Nous allons maintenant créer un package beanAction et une classe UtilisateurAction
package beanAction; import java.util.Map; import javax.servlet.http.HttpServletRequest; import model.UtilisateurModel; import bean.Utilisateur; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; /** * @author Guillou Olivier * * JEE Tutoriel 2009-2010 * * Action Classe : UtilisateurAction */ public class UtilisateurAction extends ActionSupport { //------------------------------------------------------------- // Properties //------------------------------------------------------------- /** * Description : * long serialVersionUID */ private static final long serialVersionUID = 1L; // Objets private Utilisateur utilisateur; /** * utilisateur identifié ? */ private boolean identificationUtilisateur; //------------------------------------------------------------- // Getters et setters //------------------------------------------------------------- /** * Accesseur * @return the utilisateur */ public Utilisateur getUtilisateur() { return utilisateur; } /** * Mutateur * @param utilisateur the utilisateur to set */ public void setUtilisateur(Utilisateur utilisateur) { this.utilisateur = utilisateur; } /* (non-Javadoc) * @see org.apache.struts2.interceptor.ServletRequestAware#setServletRequest(javax.servlet.http.HttpServletRequest) */ public void setServletRequest(HttpServletRequest arg0) { // TODO Auto-generated method stub } //------------------------------------------------------------- // Others methods //------------------------------------------------------------- /** * Methode * Description : Permet d'identifier un utilisateur en fonction de son mot de passe et login. * @return @struts Error or SUCCESS */ public String identifierUtilisateurs() { // on créé un nouveau model UtilisateurModel utilisateurModel = new UtilisateurModel(); // on récupère les données du formulaire String loginForm = utilisateur.getIdentifiant(); String passwordForm = utilisateur.getMdp(); // on interroge le model identificationUtilisateur = utilisateurModel.isIdentifier(loginForm, passwordForm); // test métier si l'identification est ok if (identificationUtilisateur == true) { // on récupère la session courante Map session = ActionContext.getContext().getSession(); // on renseigne la session session.put("authentification","true"); session.put("nomUtilisateur",utilisateur.getIdentifiant()); session.put("erreur", "noErreur"); System.out.println("Vous êtes loggué avec succès enjoy :)"); return SUCCESS; } return ERROR; } } |
Nous allons maintenant créer un package model et une classe UtilisateurModel
package model; import java.util.List; import Bdd.TableUtilisateur; import bean.Utilisateur; /** * @author Olivier Guillou * 2009 février * * Model Utilisateur. */ public class UtilisateurModel { //------------------------------------------------------------- // Methodes du model //------------------------------------------------------------- /** * Methode d'identifiacation de l'utilisateur * @param loginForm * @param passwordForm * @return */ public boolean isIdentifier(String loginForm, String passwordForm) { // on récupère la liste dans la base de donnée (ici en dur) TableUtilisateur currentListe = new TableUtilisateur(); List malist = currentListe.creationList(); //on parcour la liste et on teste les entrées du formulaire. for (int i = 0; i < malist.size(); i++) { if(loginForm.equalsIgnoreCase(malist.get(i).getIdentifiant()) & passwordForm.equalsIgnoreCase(malist.get(i).getMdp())) { return true; } } return false; } } |
Nous allons maintenant créer un package nommé bdd et une classe TableUtilisateur
package Bdd; import java.util.ArrayList; import java.util.List; import bean.Utilisateur; /** * @author Olivier Guillou * 2009 février * * Table Utilisateurs. */ public class TableUtilisateur { /** * On créé une lise d'utilisateur. * @return * @return malist */ public List<utilisateur /> creationList() { List<utilisateur /> malist = new ArrayList<utilisateur />(); Utilisateur a = new Utilisateur("olivier", "pass"); Utilisateur b = new Utilisateur("jérome", "pass2"); Utilisateur c = new Utilisateur("admin", "admin"); Utilisateur d = new Utilisateur("user", "user"); malist.add(a); malist.add(b); malist.add(c); malist.add(d); return malist; } } |
2 – Création de la couche vue JSP et css
Dans le répertoire WebContent de votre application :
Nous allons créer une première page JSP contenant le formulaire de login que nous appellerons index.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> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <link rel="stylesheet" type="text/css" href="<s:url value="styles.css"/>" media="all" /> <title>Formulaire de login</title> </meta></head> <body> <s :form action="identificationUtilisateur" method="post" theme="simple" cssClass="formulaireLogin"> <p><s :textfield name="utilisateur.identifiant" value="Nom d'utilisateur" size="20" cssClass="inputs" /> <s :textfield name="utilisateur.mdp" value="Mot de passe" size="20" cssClass="inputs" /> <s :submit value="Login" align="center" cssClass="boutonLogin" /></p> </s> </body> </html> |
Nous allons créer une seconde page JSP indiquant à l’utilisateur qu’il est bien identifié. Nous la nommerons success.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> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <link rel="stylesheet" type="text/css" href="<s:url value="styles.css"/>" media="all" /> <title>Formulaire de login</title> </meta></head> <body> <s :form action="identificationUtilisateur" method="post" theme="simple" cssClass="formulaireLogin"> </s><s :if test="#session.authentification = 'true'"> <h3>Vous êtes identifié : <span><s :property value="#session.nomUtilisateur" /></span></h3> </s> </body> </html> |
et pour finir cette couche vue nous allons mettre en forme nos pages JSP grâce à une feuille de style nommée styles.css
@CHARSET "ISO-8859-1"; /* reset */ body,ul { margin: 0px; padding: 0px; } .formulaireLogin { font-family: Verdana, Arial, Helvetica, sans-serif; border: 1px solid #ccc; width: 200px; margin: auto; margin-top: 100px; text-align: center; -moz-border-radius: 70px 10px; padding: 10px; } .inputs { display: block; margin: auto; margin-bottom: 5px; border: 1px solid #ccc; color: #333; } .boutonLogin { margin: auto; margin-top: 15px; border: 1px solid #ccc; } .formulaireLogin span { display: block; color: #cccc00; font-family: Verdana, Arial, Helvetica, sans-serif; border: 1px solid #ccc; margin: auto; margin-top: 10px; text-align: center; -moz-border-radius: 70px 10px; padding: 10px; } |
3 – Création de la couche XML, les fichiers struts.xml et web.xml
Voici le contenu de notre fichier web.xml (rien de très particulier).
< ?xml version="1.0" encoding="UTF-8"?> <web -app> <display -name>Application</display> <!-- Les welcomes Files --> <welcome -file-list> </welcome><welcome -file>index.html</welcome> <welcome -file>index.htm</welcome> <welcome -file>index.jsp</welcome> <!-- Le filtre de struts --> <filter> </filter><filter -name>struts2</filter> <filter -class>org.apache.struts2.dispatcher.FilterDispatcher</filter> <filter -mapping> </filter><filter -name>struts2</filter> <url -pattern>/*</url> <context -param> <param -name>toto</param> <param -value>Un Parametre</param> </context> </web> |
Et voici le contenu de notre fichier struts.xml
< ?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.enable.DynamicMethodInvocation" value="true" /> <constant name="struts.devMode" value="true" /> <constant name="struts.custom.i18n.resources" value="package" /> <package name="frontoffice" namespace="/" extends="struts-default"> <default -action-ref name="index" /> <!-- Ident rules --> <action name="identificationUtilisateur" class="beanAction.UtilisateurAction" method="identifierUtilisateurs"> <result name="success">success.jsp</result> <result name="error">index.jsp</result> </action> </package> </struts> |
La structure de votre projet doit ressembler à ceci :
Lancez la page index.jsp et testez le résultat : mot de passe : admin, identifiant : admin
Nous allons maintenant décortiquer tous ces fichiers.
4 – Analyses et explications
4.1 – Création des beans, des classes Action et des classes Model
4.2 – Création de la couche vue JSP et css
4.3 – Création de la couche Controller
Il s’agit ici de notre fichier struts.xml qui mappe nos actions et applique des règle de redirection ou de chainage.
Décortiquons :
<action name="identificationUtilisateur" class="beanAction.UtilisateurAction" method="identifierUtilisateurs"> <result name="success">success.jsp</result> <result name="error">index.jsp</result> </action> |

Nous avons défini une action nommée identificationUtilisateur. Cette action est appelée lorsque l’on soumet le formulaire présent sur la page index.jsp.
A cette action nous associons une classe d’action ici beanAction.UtilisateurAction.
Cette classAction va réaliser le traitement en appelent notre classeModel et renvoyer un result. Nous définissons donc les règles de redirection en cas de result=Success ou result=error vers les pages jsp correspondantes.
Vous pouvez télécharger le projet complet au format war ici
En cas d’erreur au démarrage du filtre struts 2 il faut passer le dev.mode dans le struts.xml à false.

avril 14th, 2010 at 4 h 40 min
[...] Ce billet était mentionné sur Twitter par altenide et Lionel LOKO, Mathieu Breton. Mathieu Breton a dit: Apprendre #Struts2 http://bit.ly/cAd6ut , http://bit.ly/aIfxGw , http://bit.ly/a3eWjK #Tutoriel #Debutant [...]