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 :

Cycle de vie des classes Action ?


Sujet :

Struts 1 Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 22
    Par défaut Cycle de vie des classes Action ?
    Bonjour, ma question concerne les classes Action; j'ai une classe TotoAction qui hérite de Action, classique, et ma classe TotoAction contient une variable d'instance toto qui pointe vers un objet qui fait des traitements métiers.

    J'aimerais éviter que ma variable toto soit instanciée à chaque appel de la méthode execute() de la classe TotoAction, et que ce soit toujours la même qui soit utilisée.

    Aussi je me demandais si, une fois que le controller a appelé une classe Action, est-ce qu'il la garde en mémoire même une fois la méthode execute() terminée en prévision d'un éventuel futur appel; ou bien est-ce qu'il "détruit" la classe TotoAction si bien qu'au prochain appel elle est réinstanciée.

    Sinon je peux créer une factory qui contiendrait ma classe métier mais j'aimerais éviter.

    Meric pour vos réponses.

  2. #2
    Membre expérimenté Avatar de jibbi
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 165
    Par défaut
    Salut
    ma question concerne les classes Action
    est-ce que tu parle de l'interface Action ou ActionListener ?
    il y a une classe ActionEvent aussi.

    Citation Envoyé par guillaume06 Voir le message
    J'aimerais éviter que ma variable toto soit instanciée à chaque appel de la méthode execute() de la classe TotoAction, et que ce soit toujours la même qui soit utilisée.
    Déclare toto à l'extérieur de la méthode, genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class TotoAction {
    Toto toto = new Toto(); 
     
    public void execute(){
    // ce sera toujours la même instance pour toto ici
    }
     
    }
    est-ce qu'il "détruit" la classe TotoAction si bien qu'au prochain appel elle est réinstanciée
    Fait le test.
    Dans le constructeur de TotoAction ajoute quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public TotoAction(){
    system.out.println("une instace de TotoAction à été crée");
    }
    Mais je suis pas certain de bien comprendre ta question.
    la méthode execute() appartient à la classe TotoAction.
    A l'appel de execute() on ne peu pas changer l'instance en cours de TotoAction.

    Faudrais un peu de code...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Maroc

    Informations forums :
    Inscription : Avril 2007
    Messages : 55
    Par défaut
    slt je me demande si j ai bien compris
    mais si tu veux que ta variable soit la méme pour tous les classes actions tu peut utiliser une variable statique

    public static Toto toto;
    static{
    //bout de code pour l instanciation de toto
    }

    bien sur le bout de code de l instancation ne sera executé q'une seule fois loars du chargement par le ClassLoader

  4. #4
    Expert confirmé

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Par défaut
    Une Action Struts est instanciée une seule fois et répond à toutes les requêtes utilisateurs.
    Donc, lorsqu'on déclare une variable d'instance dans une Action, celle-ci est automatiquement partagée par tous les utilisateurs.
    Une Action ne doit donc pas contenir de variables d'instance sauf dans le cas où la variable peut être partagée.

    Ceci est écrit dans la doc Struts, au chapitre 4.4.1 :
    Write code for a multi-threaded environment - Our controller servlet creates only one instance of your Action class, and uses this one instance to service all requests. Thus, you need to write thread-safe Action classes. Follow the same guidelines you would use to write thread-safe Servlets. Here are two general guidelines that will help you write scalable, thread-safe Action classes:
    Only Use Local Variables - The most important principle that aids in thread-safe coding is to use only local variables, not instance variables , in your Action class. Local variables are created on a stack that is assigned (by your JVM) to each request thread, so there is no need to worry about sharing them. An Action can be factored into several local methods, so long as all variables needed are passed as method parameters. This assures thread safety, as the JVM handles such variables internally using the call stack which is associated with a single Thread.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/06/2012, 12h08
  2. Réponses: 17
    Dernier message: 13/09/2011, 15h53
  3. Réponses: 0
    Dernier message: 19/04/2011, 10h56
  4. Cycles de vie des AppDomains et MBRO en local (interprocessus)
    Par DonQuiche dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 06/04/2011, 08h07
  5. ASP.Net : Cycle de vie des données affichées
    Par chaillom dans le forum Développement Web avec .NET
    Réponses: 3
    Dernier message: 16/03/2010, 13h17

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