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] [FAQ] controller de session


Sujet :

Struts 1 Java

  1. #1
    Membre averti
    Inscrit en
    Août 2002
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 30
    Par défaut [struts] [FAQ] controller de session
    Bonjour,

    J'essaye de faire un filtre pour struts, j'ai trouvé le post de Sniper37 sur Comment vérifier si la session utilisateur a expiré?

    J'ai bien ecrite ma classe qui etend org.apache.struts.action.RequestProcessor.
    J'ai un probleme, deja dans le struts-config il ne veut pas de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <controller>
            <set-property property="processorClass"     value="net.developpez.faq.struts.FaqRequestProcessor"/>
    D'apres la dtd il faut ecrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <controller processorClass="Processor"/>
    Cependant j'ai une erreur
    Servlet error: TilesPlugin : Specified RequestProcessor not compatible with TilesRequestProcessor

    Et c'est vrai que j'ai deja
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <controller processorClass="org.apache.struts.tiles.TilesRequestProcessor"/>
    dans mon fichier struts-config.xml


    Comment me sortir de ce probleme? Il y a t'il une autre facon de faire un filtre? J'ai du mal a trouver des informations sur les filtres


    Merci d'avance

  2. #2
    Invité de passage
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 1
    Par défaut
    Une technique serait de dérivé ta calsse directement de org.apache.struts.tiles.TilesRequestProcessor. Mais cela demande quelques aménagements.

    Si ça ne te convien pas, il y a une technique un peu plus lourde. L'idée étant d'avoir une classe de base type BaseAction qui dérive de org.apache.struts.action.Action. Dans cette classe, qui est une action standard, dans la méthode execute tu fait ton traitement de filtrage et tu défini une méthode abstraite process.
    Toutes tes autres actions utilisant la methode process de la même façon que la methode execute.
    Mais un petite exemple étant toujours plus parlant qu'un long discour :

    pour la classe de base :
    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
     
    public abstract class BaseAction extends Action {
     
        public ActionForward execute(ActionMapping mapping, ActionForm form,
                HttpServletRequest request, 
                HttpServletResponse response) throws Exception
    	{
     
            //Action de filtrage
     
            ActionForward forward = this.process(mapping, form, request, response);
     
            return (forward);
        }
     
        protected abstract ActionForward process(ActionMapping mapping,
                ActionForm form, HttpServletRequest request,
                HttpServletResponse response) throws Exception;
    }
    pour une classe d'action :
    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
    21
    22
     
    public class EmptyAction extends BaseAction {
     
        public ActionForward process(ActionMapping mapping, 
                                     ActionForm form,
                                     HttpServletRequest request,
                                     HttpServletResponse response)
        {
     
            String target       = "success";
            HttpSession session = request.getSession();
     
    		try {
                //try a action
            } catch (Exception e){
                e.printStackTrace();
    			target = "error";
            }
     
            return (mapping.findForward(target));
        }
    }
    Mais cette technique est passablement lourde à metre en place sur une application déjà existante.


    En espérant avoir pu t'aider, bon codage

  3. #3
    Membre averti
    Inscrit en
    Août 2002
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 30
    Par défaut
    Salut, merci de ta proposition. C'est vrai que c'est un peu lourd comme solution. Personne a une idée plus simple? De plus, il faudrait que ce filtre marche aussi pour les forward simple où je n'ai pas besoin de créer des actions spécifiques.. C'est pour ca que je pensais aux filtres.

  4. #4
    Membre émérite
    Avatar de yolepro
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 918
    Par défaut
    Fait une recherche sur les Filter et tu devrais trouver ta réponse.

    Le but étant d'implémenter une classe qui étend Filter et de la déclarer dans ton web.xml

    A chaque appelle de ta servelt cette classe sera appeler. Il te suffit simplement ensuite de faire les tests de request ou session que tu veux.

    C'est très utiliser pour vérifier l'etat de la session et afficher une page d'erreur.

  5. #5
    Membre averti
    Inscrit en
    Août 2002
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 30
    Par défaut
    J'ai finalement utilisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     <controller processorClass="Processor"/>
    et j'ai viré
    <controller processorClass="org.apache.struts.tiles.TilesRequestProcessor"/>
    Par contre il me reste un petit probleme, j'ai dans mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ActionMessages messages = new ActionMessages();
                if (isOK(request)) {
                    return true;
                } else {
                    messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("login.session"));
            request.setAttribute(ActionMessages.GLOBAL_MESSAGE,messages);
                }
     
        request.getRequestDispatcher 
                            ("/welcome.do").forward(request,response);
        return false;
    Je veux afficher l'erreur login.session grace aux balises
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <html:messages id="message" message="true">
                    <b><bean:write name="message"/></b>
                </html:messages>
    de ma page jsp ou est redirigé l'utilisateur en cas de non login.

    Mais ca ne marche pas, je pense qu'il manque ce que fait la methode
    "saveMessages(request,messages);" dans mes classes d'action.

    Comment puis je reproduire cette methode en dehors d'une classe d'action?
    j'ai mis "request.setAttribute(ActionMessages.GLOBAL_MESSAGE,messages);" a la place mais ca ne semble pas etre ca

  6. #6
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    salut,

    Il peut s'averer utile de définir une méthode processError dans votre RequestProcessor ..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    protected void processError(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping, ActionMessages messages) throws IOException, ServletException {
            if (request != null && mapping != null && messages != null && !messages.isEmpty()) {
                request.setAttribute(Globals.ERROR_KEY, messages);
                final ActionForward _forward = mapping.findForward("FORWARD");
                processForwardConfig(request, response, _forward);
            }
        }

    et pour enregistrer le message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // création du message ..peut etre dans une méthode generique ..
    final ActionMessages _messages =  new ActionMessages();
     
    _messages.add(ActionMessages.GLOBAL_MESSAGE, new   
     
     ActionMessage("erreurs.permission.denied"));

  7. #7
    Membre averti
    Inscrit en
    Août 2002
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 30
    Par défaut
    Salut sniper37, tout d'abord merci de tes lumieres sur struts!

    Bon j'ai recopié ta methode processError et ta facon de declarer une erreur mais cependant je pense qu'il manque un lien entre juste le fait de faire un new ActionMessages(), de lui ajouter un message avec add et apres de ne plus y toucher.
    processError prend bien un objet de type ActionMessages d'apres la signature mais d'ou le sort il?
    La ca ne marche pas qu'avec ca.
    J'ai laissé mon
    request.setAttribute(ActionMessages.GLOBAL_MESSAGE,messages);
    dans ma methode processRoles, mais ce n'est pas ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        final ActionMessages messages =  new ActionMessages();
                if (isOK(request)) {
                    return true;
                } else {
                    messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("login.session"));
                    request.setAttribute(ActionMessages.GLOBAL_MESSAGE,messages);
                }
     
        request.getRequestDispatcher 
                            ("/welcome.do").forward(request,response);
    J'ai pas trop la vision des deroulement des choses en interne dans struts, peut etre j'oublie quelque chose qui te semble evident pour toi!


    Dans ma JSP d'ecriture de message (qui sert aussi pour des messages dans des classes Actions et dont le systeme fonctionne) j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <html:messages id="message" message="true">
                    <b><bean:write name="message"/></b>
                </html:messages>

  8. #8
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    désolè, processError n'est pas une méthode de RequestProcessor. normalement il suffit de sauvegarder le message dans la request :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     request.setAttribute(Globals.ERROR_KEY, messages);
    pour qu'il soit pris en compte en message d'erreur il suffit alors dans la jsp de faire:
    peut etre je n'ai pas bien saisi ta question .. si ce n'est pas ça expliques ce qui ne fonctionne pas !!

  9. #9
    Membre averti
    Inscrit en
    Août 2002
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 30
    Par défaut
    Non, c'etait bien ca la question, en tout cas le probleme. Je voulais reutiliser les messages comme dans les classes d'actions avec donc
    <html:messages id="message" message="true">
    <b><bean:write name="message"/></b>
    </html:messages>

    comme je l'avais deja pour une autre utilisation dans ma page JSP. Mais tant pis je vais mettre aussi <html:errors/>.
    Je voulais un truc nikel c'est pour ca, mais je ne sais pas si on peut simuler la methode saveMessages(request,erreurs); qu'on a dans les classes d'action.
    request.setAttribute(Globals.ERROR_KEY, messages); marche en tout cas.

    Merci bien, c'est tres pratique ce filtre au niveau struts.

    dans la FAQ il y a juste la mauvaise declaration du controller dans le struts-config qu'il faut peut etre rectifier?

  10. #10
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Citation Envoyé par emeline
    Non, c'etait bien ca la question, en tout cas le probleme. Je voulais reutiliser les messages comme dans les classes d'actions avec donc
    <html:messages id="message" message="true">
    <b><bean:write name="message"/></b>
    </html:messages>

    comme je l'avais deja pour une autre utilisation dans ma page JSP. Mais tant pis je vais mettre aussi <html:errors/>.
    Je voulais un truc nikel c'est pour ca, mais je ne sais pas si on peut simuler la methode saveMessages(request,erreurs); qu'on a dans les classes d'action.
    request.setAttribute(Globals.ERROR_KEY, messages); marche en tout cas.

    Merci bien, c'est tres pratique ce filtre au niveau struts.

    dans la FAQ il y a juste la mauvaise declaration du controller dans le struts-config qu'il faut peut etre rectifier?
    pour les messages, il faut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    request.setAttribute(Globals.MESSAGE_KEY, messages);
    Je viens de verifier la declaration du controller, j'ai exactement la meme chose et ça tourne ...

  11. #11
    Membre averti
    Inscrit en
    Août 2002
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 30
    Par défaut
    ok c'est bon avec Globals.MESSAGE_KEY


    Moi il en veut pas de la declaration du controller que tu as faites. Peut etre une difference de version?

    Je suis en struts-1.2.8

  12. #12
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Citation Envoyé par emeline
    ok c'est bon avec Globals.MESSAGE_KEY


    Moi il en veut pas de la declaration du controller que tu as faites. Peut etre une difference de version?

    Je suis en struts-1.2.8
    j'ai utilisé la 1.2.4

    c'est peut etre parceque tu avais déjà
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <controller processorClass="org.apache.struts.tiles.TilesRequestProcessor"/>

    ce qui est equivalent à ce que j'ai fait, sauf que moi j'avais besoin d'avoir 'nocache=true'. c'est pour cela qu'il ya le setProperty ..

Discussions similaires

  1. Upload fichier struts faq
    Par nicolas.p dans le forum Struts 1
    Réponses: 5
    Dernier message: 28/05/2007, 13h42
  2. [Struts][JSP]gestion des session en JSP
    Par zola dans le forum Struts 1
    Réponses: 6
    Dernier message: 27/04/2006, 16h23
  3. [Sécurité] Contrôle de session avec header
    Par ruty dans le forum Langage
    Réponses: 2
    Dernier message: 17/04/2006, 22h43
  4. [Struts] Affichage variable de session
    Par cirdec dans le forum Struts 1
    Réponses: 3
    Dernier message: 17/03/2006, 11h18
  5. [struts][jsp] récupérer objet session dans ActionForm
    Par mlequim dans le forum Struts 1
    Réponses: 24
    Dernier message: 02/11/2005, 16h32

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