IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Struts 1 Java Discussion :

[Struts] Partage d'application


Sujet :

Struts 1 Java

  1. #1
    Membre éclairé
    Inscrit en
    Mai 2004
    Messages
    297
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 297
    Par défaut [Struts] Partage d'application
    Bonjour,

    Lorsque je partage deux contexts je perds les variables en session lors d'un deuxième appel d'une action Struts.

    Je suis dans le context A je me redirige par l'intermediaire d'une servlet vers mon context B qui lance une action struts et me créé une variable de session (un javabean).
    Jusque la tout va bien mon Bean est bien récupérer dans ma JSP.

    Maitenant sur cette même page je clique sur un bouton qui me lance une action struts et la j'essaye de récupérer mon Bean et plus rien le Bean n'est plus en session ...

    Voici des morceaux de code :
    server.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     <Context path="/A" docBase="web" debug="0"
                     reloadable="true" crossContext="true">
     
     <Context path="/B" docBase="ces" debug="0"
                     reloadable="true" crossContext="true">
    Ma redirection servlet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    RequestDispatcher dispatcher = getServletContext().getContext(request.getParameter("CONTEXT")).getRequestDispatcher(ReqURL);
     
    dispatcher.forward( request , response );
    Ma premier action Struts dans un DispatchAction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    public ActionForward creerActif(ActionMapping mapping,
    			ActionForm form, HttpServletRequest request,
    			HttpServletResponse reponse) throws Exception {
     
    HashMap hashMapDisplayParam = new HashMap();
     
    // ActionErrors errors = new ActionErrors();
    CreerActifForm creerActifForm = (CreerActifForm) form;
     
    hashMapDisplayParam = InitDisplayParamBean("OMCRE1");
    InitValue(creerActifForm, hashMapDisplayParam);
    InitDefaultExtendedValue(creerActifForm, request);
     
    //CREATION DE MON BEAN EN SESSION
    request.getSession().setAttribute("DisplayParam", hashMapDisplayParam);
     
    return mapping.findForward("success");
     
    }
    Deuxième action Struts de mon dispatchAction qui ne retrouve plus mon Bean
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    public ActionForward fonctionTrigger(ActionMapping mapping,
    			ActionForm form, HttpServletRequest request,
    			HttpServletResponse reponse) throws Exception {
     
    // HashMap du bean en session
    HashMap myMap = new HashMap();
    // Récupération du Form
    CreerActifForm creerActifActiviteLocaliseForm = (CreerActifForm) form;
    // Récupération de mon bean de ma session
    myMap = (HashMap) request.getSession().getAttribute("DisplayParam");
     
    Trigger.fonctionTrigger(myMap, creerActifActiviteLocaliseForm);
     
    return mapping.findForward("success");
    }
    Si je lance directement mon application de manière autonome tout marche parfaitement.

    Je désespère ....

    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 106
    Par défaut
    le principe de la sandbox fait que la session n'est pas partagée entre 2 contexts.

    C'est une des forces de J2EE. Dans le cas contraire, on pourrait avoir deux applications déclarant les memes variables dans la session....aie aie aie...

    C'est comme les variables globales dans d'autres langages comme C ou php..

    Vive l'encapsulation

    Fo revoir ton architecture

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 106
    Par défaut
    ma réponse n'est pas complete...DSL

    En fait lors du premier call de A vers B, en faisant
    //CREATION DE MON BEAN EN SESSION
    request.getSession().setAttribute("DisplayParam", hashMapDisplayParam);
    tu récupère la session rattachée a une requete provenant de A

    La deuxième fois, en faisant
    // Récupération de mon bean de ma session
    myMap = (HashMap) request.getSession().getAttribute("DisplayParam");
    récupère un objet session différent puisque l'objet requete est rataché au context B

    J'imagine que tu dois avoir un objet encore plus global que la session. L'equivalent de l'objt Application dans .NET par exemple

  4. #4
    Membre éclairé
    Inscrit en
    Mai 2004
    Messages
    297
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 297
    Par défaut
    Salut,

    Je te remercie pour t'être penché sur mon problème.

    En fait je pense qu'il faudrait lire les variables de la session A comme actuellement et au moment du passage de ma servlet non pas réutiliser la session en cours (A) mais forcer la création du deuxième session en parallèle. Le problème c'est que je ne sais pas commment faire ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    // Création de la session utilisateur s'il elle n'existe pas
    // Si on provient de D7i alors on utilise la session ouverte par
    // Extended
    // Si on provient d'une appli externe ou que l'on lance directement
    // l'appli
    // on crée alors une nouvelle session utilisateur
    HttpSession session = null;
    if (request.isRequestedSessionIdValid()) {
        System.out.println("DEBUG - isRequestedSessionIdValid : VRAI "
        + request.getRequestedSessionId());
        = request.getSession(false);
    } 
    else {System.out.println("DEBUG - isRequestedSessionIdValid : FAUX  - Session créée");
    session = request.getSession(true);
    }
    Merci

Discussions similaires

  1. Réponses: 7
    Dernier message: 10/02/2010, 09h23
  2. Réponses: 5
    Dernier message: 10/05/2007, 19h04
  3. [VB.Net]Comment "partager" son application?
    Par eultartuffe dans le forum Windows Forms
    Réponses: 1
    Dernier message: 16/05/2006, 11h27
  4. Partage d'application entre Linux et windows
    Par slc dans le forum Administration système
    Réponses: 2
    Dernier message: 30/11/2005, 11h00
  5. [Struts] Exemples d'application type PetShop ?
    Par 1cado dans le forum Struts 1
    Réponses: 2
    Dernier message: 24/09/2004, 19h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo