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

Spring Web Java Discussion :

[Spring MVC] Inclure une Servlet | Creation de menu web dynamique


Sujet :

Spring Web Java

  1. #1
    Invité
    Invité(e)
    Par défaut [Spring MVC] Inclure une Servlet | Creation de menu web dynamique
    Bonjour,

    Dans un développement Web, j'ai une barre de menu conséquente. Cette barre se charge en fonction du profil de l'utilisateur.
    Actuellement j'ai une seule page JSP dont je fais un 'include' en haute de chaque page.

    Pour obtenir une barre de menu "dynamique" en fonction du profil, je pense me créer une classe "MenuFactory" qui serais chargée de me créer mon menu et de me le rendre dans une String.

    Pour que cela sois bien propre je pense écrire une Servlet qui étendrais ou contiendrais "MenuFactory" et que j'incluerais à la place de ma JSP actuelle.

    Mais je ne sais pas si il est possible d'inclure une Servlet. J'ai bien tenté d'utiliser les mamppings de mon dispatcher mais cela ne semble pas fonctionner (ce qui me semble normal).



    Avez-vous une idée de comment inclure une Servlet via l'instruction "<%@ include file="../includes/menu.inc.jsp"%>" ou sur une autre façon de gérer le menu ?


    Merci


    Edit : Il semblerait que faire un include d'un Servlet simple fonctionne : http://www.thescripts.com/forum/thread17106.html mais j'aimerais profiter de Spring..

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 68
    Points : 62
    Points
    62
    Par défaut JSP = servlet
    Une JSP, une fois compilée est une servlet. Donc en toute logique je ne vois pas pourquoi tu ne pourrais pas faire une include de ta servlet...

    As-tu essayé d'appeller ta servlet dans ton include ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Oui bien sur j'ai essayé mais la servlet n'est jamais trouvée, j'ai essayé avec différents 'pattersn' d'accés à la servlet dans mon web.xml mais le serveur ne trouve jamais la Servlet..

    Mon "context" est le suivant.
    Je dois pouvoir faire un include de cette Servlet/Page ou que je sois dans l'application. Pour l'instant je me contentais de faire un <@ include file="../includes/menu.jsp" /> et de changer le chemin d'accès à la jsp en fonction de l'emplacement mais ici il semble que je ne puisse faire l'include qu'en renseignant "/MenuServlet" mais Tomcat ne trouve jamais la ressource

    Mon web.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <servlet>
            <servlet-name>menuServlet</servlet-name>
            <servlet-class>be.me.MenuServlet</servlet-class>
        </servlet>    
        <servlet-mapping>
        	<servlet-name>menuServlet</servlet-name>
        	<url-pattern>/MenuServlet</url-pattern>
        </servlet-mapping>
        <servlet-mapping>
        	<servlet-name>menuServlet</servlet-name>
        	<url-pattern>/*/MenuServlet</url-pattern>
        </servlet-mapping>
    et l'inclusion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <%@ include file="/MenuServlet" %>
    et enfin, la réponse :
    org.apache.jasper.JasperException: /WEB-INF/views/jsp/home.jsp(1,1) /WEB-INF/views/jsp/includes/menu.inc.jsp(2,0) Le fichier "/MenuServlet" n'a pas été trouvé
    org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40)
    org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407)
    org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:88)
    org.apache.jasper.compiler.Parser.processIncludeDirective(Parser.java:334)
    org.apache.jasper.compiler.Parser.parseIncludeDirective(Parser.java:367)
    org.apache.jasper.compiler.Parser.parseDirective(Parser.java:468)
    org.apache.jasper.compiler.Parser.parseElements(Parser.java:1426)
    org.apache.jasper.compiler.Parser.parse(Parser.java:133)
    org.apache.jasper.compiler.ParserController.doParse(ParserController.java:216)
    org.apache.jasper.compiler.ParserController.parse(ParserController.java:103)
    org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:167)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:306)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:286)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:273)
    org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:566)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:167)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:239)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1158)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:900)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:808)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:476)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:431)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    Je soupçonne le /WEB-INF/ de me poser quelques problèmes..
    Dernière modification par Invité ; 10/03/2008 à 14h11.

  4. #4
    Membre régulier Avatar de yostane
    Homme Profil pro
    test
    Inscrit en
    Mars 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : test

    Informations forums :
    Inscription : Mars 2006
    Messages : 84
    Points : 106
    Points
    106
    Par défaut
    bonjour
    moi je te propose de charger le profil à partir du contrôleur, et de l'inclure dans ta vue unique comme modèle.

    au fait, tu pourrais me passer les méthodes que tu utilises pour trouver le profil d'un utilisateur. mon tp porte sue ce sujet (profiling sémantique)

    merci
    yostane

  5. #5
    Invité
    Invité(e)
    Par défaut
    C'est, à terme, ce que je ferais mais je voudrais inclure une servlet dont le rôle serait de générer le menu en fonction du profile..

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 59
    Points : 57
    Points
    57
    Par défaut
    A mon avis le problème que tu rencontres est plutot lié à un mauvais chemin d'accès à ton menu...?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <%@ include file="/WEB-INF/vues/includes/header.jsp" %>
    Voilà typiquement le genre d'inclusion que je fais et je ne recontre pas de problème ... A moins que je n'ai pas bien saisi ton problème....

    Rien ne t'empêche par la suite de gérer ton menu via un Controller et de faire dans tes pages JSP un include de ton menu. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <%@ include file="/WEB-INF/vues/includes/header.jsp" %>
    <%@ include file="/WEB-INF/vues/includes/menu.jsp" %>
    La suite reste une histoire de paramêtrage dans menu.jsp (afficher tel ou tel menu en fonction d'une variable dans le modèle passé en paramètre par ton Controller...

    En poussant le vice, on pourrait même imaginer un Intercepteur :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    package mova.logging.web;
     
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import mova.logging.service.UserManager;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
     
    /**
     *
     * @author Mohicane
     */
    public class UserLoadingInterceptor implements HandlerInterceptor {
     
        private UserManager userManager;
     
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object command) throws Exception {
            return true;
        }
     
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object command, ModelAndView modele) throws Exception {
            modele.addObject("user", userManager.getCurrentUser(request));
        }
     
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object command, Exception error) throws Exception {
        }
     
        public UserManager getUserManager() {
            return userManager;
        }
     
        public void setUserManager(UserManager userManager) {
            this.userManager = userManager;
        }
     
    }
    J'utilise ce dernier parce que dans toute mes pages je veux référencer l'utilisateur courant ... cela me permet par exemple d'afficher dans toute mes page dans le header "Bienvenue {nom de l'utiliseur}"

    Pour la configuration d'intercepteurs c'est pas bien compliquer:
    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
    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
            <property name="interceptors">
                <list>
                    <bean id="userLoadingInterceptor" class="mova.logging.web.UserLoadingInterceptor" autowire="byName" />
                </list>
            </property>
            <property name="mappings">
                <props>
                    <!-- Mapping pour le loggin d'utilisateur -->
                    <prop key="/login.html">loginController</prop>
                    <prop key="/subscribe.html">subscribeController</prop>
                    <prop key="/valider.html">validerInscriptionController</prop>
                    (...)
                </props>
            </property>
        </bean>
    Je pense que tu sauras te débrouiller avec ça?

    Mohicane

  7. #7
    Invité
    Invité(e)
    Par défaut
    Je fais déja comme cela. Ce que je n'aimais pas c'était l'idée de génére le menu depuis une JSP (car il y à plus de code que d'affichage).
    En fait en utilisant l'autre directive d'inclusion, ça fonctionne sans problèmes.

    Pour mas pars je préfèrais placer l'utilisateur en Session et pas via un intercepteur.. Mais dans mon cas que je vais utiliser ACEGI pour la sécurité de mon application, il se charge donc pour moi de cette "gestion" de l'utilisateur.

    Merci

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 59
    Points : 57
    Points
    57
    Par défaut
    Ah tiens tu m'intéresses là ... Tu as chargé l'utilisateur en Session via Acegi?
    Il y a peut être un truc à côté duquel je suis passé alors avec Acegi. Tu peux m'expliquer comment tu t'y es pris?

    Merci d'avance

    Mohicane

  9. #9
    Invité
    Invité(e)
    Par défaut
    Je découvre seulement Acegi mais il semble qu'il mette bien un "utilisateur" en session. Il te suffit de lister les paramètres de la session et tu veras qu'il y à une clef acegi. Je crois qu'il y place à objet à lui (UserCredentials ou quelque chose du genre)

    Personnellement dans toues les applications que j'ai vu et/ou développé on plaçait l' "Utilisateur" en session.

  10. #10
    Invité
    Invité(e)
    Par défaut
    @Mohicanne Voici une réponse à tq question, directement trouvée chez Acegi.
    Last but not least, sometimes you will need to store the SecurityContext between HTTP requests. Other times the principal will re-authenticate on every request, although most of the time it will be stored. The HttpSessionContextIntegrationFilter is responsible for storing a SecurityContext between HTTP requests. As suggested by the name of the class, the HttpSession is used to store this information. You should never interact directly with the HttpSession for security purposes. There is simply no justification for doing so - always use the SecurityContextHolder instead.

Discussions similaires

  1. inclure une servlet dans une page JSF
    Par toure32 dans le forum JSF
    Réponses: 2
    Dernier message: 18/02/2010, 09h41
  2. inclure une servlet dans une page jsp
    Par shawty dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 19/08/2008, 11h16
  3. Réponses: 1
    Dernier message: 18/01/2007, 11h09
  4. [HTML] Inclure une Servlet dans une page HTML
    Par boux2 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 22/11/2006, 14h11
  5. Inclure une servlet dans une JSP
    Par keopsk dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 26/06/2006, 11h44

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