Les Intercepteurs - ESISA.pdf

11
Par N. Chenfour 5.1 Principe de base Avant d’expliquer le principe des Intercepteurs (Interceptors), il faut comprendre le cycle de vie d’une action qui se déroule en six étapes : 1. La requête est tout d’abord reçue par le framework, à l’aide de « FilterDispatcher » du package « org.apache.struts2.dispatcher » ou encore StrutsPrepareAndExecuteFilter du package « org.apache.struts2.dispatcher.ng.filter » (puisque la classe «FilterDispatcher» est devenue « deprecated »). Le framework détermine les composantes reliées à la requête : Interceptors, action et results. Et ce conformément au contenu du fichier « struts.xml » ou aux décisions prises par la Convention Plugin. Les Interceptor Results : Pages JSP Action FilterDispatcher Chapitre 5. Les Intercepteurs

Transcript of Les Intercepteurs - ESISA.pdf

  • Par N. Chenfour

    5.1 Principe de base

    Avant dexpliquer le principe des Intercepteurs (Interceptors), il faut

    comprendre le cycle de vie dune action qui se droule en six tapes :

    1. La requte est tout dabord reue par le framework, laide de FilterDispatcher du package org.apache.struts2.dispatcher

    ou encore StrutsPrepareAndExecuteFilter du package

    org.apache.struts2.dispatcher.ng.filter (puisque la classe

    FilterDispatcher est devenue deprecated ). Le framework

    dtermine les composantes relies la requte : Interceptors,

    action et results. Et ce conformment au contenu du fichier

    struts.xml ou aux dcisions prises par la Convention Plugin. Les

    Interceptor

    Results : Pages JSP

    Action

    FilterDispatcher

    Chapitre 5. Les Intercepteurs

  • N. Chenfour 2

    interceptors sont crs une fois pour toutes au niveau session, alors

    que laction est instancie ce stade mme et chaque nouvelle

    requte une nouvelle instance est cre.

    2. La requte passe ensuite par une srie dintercepteurs qui sont programms pour fournir une liste de prtraitements avant que la

    requte narrive finalement laction.

    3. Laction est ensuite invoque par lintermdiaire de lune de ses mthodes daction.

    4. Le vue est enfin appele. Elle pourra accder laction pour rcuprer des donnes calcules par celle-ci.

    5. La requte passe de nouveau par la liste des intercepteurs pour offrir la possibilit dappliquer un post-traitement ou tout traitement

    de nettoyage pouvant tre programm en ce niveau.

    6. en fin la rponse HTML est retourne au client final.

    5.2 Liste dintercepteurs prdfinis

    Ci-dessous une liste dintercepteurs issus directement de la classe

    AbstractInterceptor ; Mais, il existe bien dautres qui sont des classes

    filles des classes suivantes :

    ActionAutowiringInterceptor

    AliasInterceptor

    AnnotationParameterFilterIntereptor

    ChainingInterceptor

    ClearSessionInterceptor

    ConversionErrorInterceptor

    CookieInterceptor

    CreateSessionInterceptor

    ExceptionMappingInterceptor

    FileUploadInterceptor

    I18nInterceptor

    LoggingInterceptor

  • N. Chenfour 3

    MethodFilterInterceptor ParametersInterceptor ModelDrivenInterceptor ParameterFilterInterceptor

    ParameterRemoverInterceptor

    ProfilingActivationInterceptor

    RolesInterceptor

    ScopedModelDrivenInterceptor

    ScopeInterceptor

    ServletConfigInterceptor StaticParametersInterceptor

    TimerInterceptor

    5.3 Intercepteur avec Injection de Dpendances

    5.3.1 Injection des paramtres de formulaire

    Nous avons dj vue (fin du chapitre 3) que les paramtres dun

    formulaire sont injects dans laction laide de setters appropris quil

    faut prvoir dans la classe daction. Le composant qui se charge dappeler

    ces setters est un intercepteur qui fait donc lopration en prtraitement

    avant que la mthode daction ne soit excute. Lintercepteur en question

    est le ParametersInterceptor .

    5.3.2 Injection base sur les interfaces Interface Injection

    Lintercepteur ServletConfigInterceptor est conu pour injecter

    toutes les proprits dont une action peut avoir besoin, condition quelle

    en soit consciente (aware), cd quelle doit implmenter linterface

    approprie. On site :

  • N. Chenfour 4

    - ServletContextAware

    - ServletRequestAware

    - ServletResponseAware

    - ParameterAware

    - RequestAware

    - SessionAware

    - ApplicationAware

    - PrincipalAware

    Par la suite quelques exemples dinjections utiles bases sur cet

    intercepteur :

    Injection dun objet HttpServeletRequest

    - Interface : ServletRequestAware

    - Mthode implementer :

    public void setServletRequest(HttpServletRequest request)

    Exemple :

    public class UneAction implements ServletRequestAware {

    private HttpServletRequest request;

    public void setServletRequest(HttpServletRequest request) {

    this.request = request;

    }

    public String execute() throws Exception {

    return success;

    }

    }

  • N. Chenfour 5

    Injection dun objet HttpServletResponse

    - Interface : ServletResponseAware

    - Mthode implmenter :

    void setServletResponse(HttpServletResponse response)

    Injection dun object ServletContext

    - Interface : ServletContextAware

    - Mthode implmenter :

    void setServletContext(ServletContext context)

    Injection des attributs dune Session

    - Interface : SessionAware

    - Mthode implmenter :

    void setSession(Map session)

    Injection des paramtres (autre solution)

    - Interface : ParameterAware

    - Mthode implmenter :

    void setParameters(Map parameters)

  • N. Chenfour 6

    5.4 Le ModelDrivenIntercepteur

    Injection dans le modle rcupr par lintercepteur

    public class Produit { private String id,

    private String name; private double price; private double amount; ... }

    Id : Desig : PU : QS :

    public class ProduitAction implements ModelDriven { private Produit produit; public ProduitAction() { produit = new Produit(); } public Produit getModel() { return produit; } ... }

  • N. Chenfour 7

    5.5 Ralisation de nouveaux intercepteurs

    La ralisation dun intercepteur exige le passage par les tapes suivantes :

    1. Raliser la classe intercepteur qui devrait implmenter linterface

    Interceptor du package

    com.opensymphony.xwork2.interceptor :

    public interface Interceptor {

    public void init();

    public void destroy();

    public String intercept(ActionInvocation a);

    }

    Ceci peut tre ralis par extension de la classe abstraite

    AbstractInterceptor du mme package qui implmente

    linterface Interceptor en fournissant une implmentation vide

    des deux mthodes init() et destroy().

    2. Fournir une implmentation de la mthode intercept(). Son

    paramtre ActionInvocation donne accs aussi bien laction

    quau rsultat (la vue). Les deux mthodes suivantes sont

    disponibles :

    - getAction() : Object

    - getResult() : Result

    Il est alors possible de communiquer la donne quon veut laction

    une fois rcupre.

  • N. Chenfour 8

    Exemple 1 :

    package com.acs.lab.struts2; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class TestInterceptor extends AbstractInterceptor { public String intercept(ActionInvocation invocation) throws Exception { Action1 a = (Action1)invocation.getAction(); a.setData(); return invocation.invoke(); } }

    En supposant que lon dispose dune action qui sappelle Action1 qui

    offre une mthode setData().

    3. Configuration : lintercepteur doit ensuite tre configur dans le

    fichier struts.xml

    /result.jsp

  • N. Chenfour 9

    Remarque :

    Lextension du package struts-default permet de charger les

    intercepteurs par dfaut.

    Exemple 2 : Code de lintercepteur : Un intercepteur qui gre une base de donnes stock en communicant une rfrence sur celle-ci laction : package com.acs.lab.struts2; import java.util.HashMap; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class StockInterceptor extends AbstractInterceptor { private HashMap stock; public StockInterceptor() { stock = new HashMap(); } public String intercept(ActionInvocation invocation) throws Exception

    { ProduitAction action = (ProduitAction)invocation.getAction(); action.setStock(stock); return invocation.invoke(); } }

  • N. Chenfour 10

    Code de laction : Celle-ci fourni 3 mthodes daction :

    - insert - select - list

    public class ProduitAction implements ModelDriven { private HashMap stock; private Produit produit; private Collection produits = new Vector(); public ProduitAction() { produit = new Produit(); } public String insert() { stock.put(produit.getId(), produit); return "success"; } public String select() { String id = produit.getId(); produit = stock.get(id); if (produit==null) return "error"; else return "success"; } public String list() { produits = stock.values(); return "success"; } public Produit getModel() { return produit; } public Produit getProduit() { return produit; } public Collection getProduits() { return produits; } public HashMap getStock() { return stock; } public void setStock(HashMap stock) { this.stock = stock; } }

  • N. Chenfour 11

    Configuration :

    /insererResponse.jsp

    /selectResponse.jsp

    /errorSelect.jsp

    /lister.jsp