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 Menu] Menu dynamique à l'aide d'un repository


Sujet :

Struts 1 Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    372
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 372
    Par défaut [Struts Menu] Menu dynamique à l'aide d'un repository
    Bonjour!

    Je cherche à créer une appli web. Je voudrais créer des menus dynamiques mais je n'y arrive pas. En fait en fonction de si l'utilisateur est enregistré comme "admin" ou "user" eh ben il n'aura pas les meme items de menu (acces restreint pour le user).

    pour le moment j'ai mis dans un repository (MenuRepository) les labels (cjhaines de caracteres) des menus à afficher . Mais je ne sais pas comment faire pour les récupérer

    j'ai trouvé sur le net qu'il faut mettre l'attribut "repository" dans la balise "menu" mais après......?

    dans la jsp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <menu:useMenuDisplayer name="TabbedMenu" bundle="org.apache.struts.action.MESSAGE">
       <menu:displayMenu name=??????????????/> => faire une boucle???????
    </menu:useMenuDisplayer>
    dans le menu-config.xml
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <MenuConfig>
      <Displayers>
         <Displayer name="TabbedMenu"
                    type="net.sf.navigator.displayer.TabbedMenuDisplayer"/>
         <Displayer name="SubMenu"
    				type="net.sf.navigator.displayer.SimpleMenuDisplayer"/>
         <Displayer name="Simple"
    				type="net.sf.navigator.displayer.SimpleMenuDisplayer"/>
      </Displayers>
      <Menus>
      	   <Menu name="Synoptique" title="Synoptique" location="?Synoptique">
    		</Menu>
    		<Menu name="Alarmes" title="Alarmes" location="?Alarmes">
    		</Menu>
    		<Menu name="RC" title="Recherche et commande" location="?RC">
    		</Menu>
    		<Menu name="Courbes" title="Courbes" location="?Courbes">
    		</Menu>
      </Menus>
    </MenuConfig>
    les valeurs possibles des noms des menus que j'ai mis dans le repository sont :
    "Synoptique","Alarmes","RC", "Courbes"...

    Merci d'avance pour votre aide

    Anne

  2. #2
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    tu peux tout a fait utiliser le tag logic:equal par exemple pour tester si ton utilisateur est habilite a voir tel ou tel menu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <menu:useMenuDisplayer name="TabbedMenu" bundle="org.apache.struts.action.MESSAGE">
    <logic:equal name="<%=user%>" property="role" value="admin">
       <menu:displayMenu name="menu_admin"/> 
    </logic:equal>
    <logic:equal name="<%=user%>" property="role" value="user">
       <menu:displayMenu name="menu_user"/> 
    </logic:equal>
    </menu:useMenuDisplayer>

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    372
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 372
    Par défaut
    En fait je viens de tester le début de ce que j'ai fait et j'ai une erreur :

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    13:43:57,282 ERROR [[jsp]] "Servlet.service()" pour la servlet jsp a lancé une exception
    javax.servlet.jsp.JspException: The menu repository could not be found.
    	at net.sf.navigator.taglib.UseMenuDisplayerTag.doStartTag(UseMenuDisplayerTag.java:140)
    	at org.apache.jsp.jsp.logonSuccess_005fanne_jsp._jspx_meth_menu_005fuseMenuDisplayer_005f0(logonSuccess_005fanne_jsp.java:211)
    	at org.apache.jsp.jsp.logonSuccess_005fanne_jsp._jspService(logonSuccess_005fanne_jsp.java:106)
    	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:384)
    	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
    	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:687)
    	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:469)
    	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:403)
    	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
    	at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1069)
    	at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:455)
    	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:279)
    	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
    	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175)
    	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)
    	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
    	at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:156)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
    	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:624)
    	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
    	at java.lang.Thread.run(Unknown Source)
    13:43:57,282 ERROR [[action]] "Servlet.service()" pour la servlet action a généré une exception
    javax.servlet.jsp.JspException: The menu repository could not be found.
    	at net.sf.navigator.taglib.UseMenuDisplayerTag.doStartTag(UseMenuDisplayerTag.java:140)
    	at org.apache.jsp.jsp.logonSuccess_005fanne_jsp._jspx_meth_menu_005fuseMenuDisplayer_005f0(logonSuccess_005fanne_jsp.java:211)
    	at org.apache.jsp.jsp.logonSuccess_005fanne_jsp._jspService(logonSuccess_005fanne_jsp.java:106)
    	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:384)
    	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
    	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:687)
    	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:469)
    	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:403)
    	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
    	at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1069)
    	at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:455)
    	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:279)
    	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
    	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175)
    	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)
    	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
    	at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:156)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
    	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:624)
    	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
    	at java.lang.Thread.run(Unknown Source)


    D'apres mes recherches sur internet, la seule raison que j'ai pu trouver est qu'il me manquerait une librairie (common-lang) mais celle ci est pourtant présente => je ne vois pas d'ou provient cette erreur.

    voici le code de la ou je set mon repository :
    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
    private void setMenuRepository(ArrayList listMenu, HttpServletRequest request) {
    		//Get the repository from the application
    		MenuRepository repository =(MenuRepository) request.getSession().getServletContext()
    	                                .getAttribute(MenuRepository.MENU_REPOSITORY_KEY);
    		for (int i=0; i < listMenu.size(); i++) {
    			MenuComponent mc = new MenuComponent();
    		    Fonctionnalite row = (Fonctionnalite)listMenu.get(i);
    		    String name = row.getNomFonctionnalite();
    		    mc.setName(name);
    		    System.out.println("nom fonctionnalite :" + name);
     
    		    String title = row.getNomFonctionnalite();
    		    mc.setTitle(title);
    		    repository.addMenu(mc);
    		}
    		request.getSession().getServletContext()
            .setAttribute(MenuRepository.MENU_REPOSITORY_KEY, repository);
     
    	}
    Sachant que Fonctionnalite est un objet à 2 champ : un int (l'idFonvctionnalite) et un String (le nom de la fonctionnalite). La listMenu est constituée de la liste des objets Fonctionnalités qui sont autorisés d'acces à l'utilisateur qui se connecte.

    Une idée du pb stp ?

    Anne

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    372
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 372
    Par défaut
    Citation Envoyé par willoi
    tu peux tout a fait utiliser le tag logic:equal par exemple pour tester si ton utilisateur est habilite a voir tel ou tel menu
    Je ne peux pas faire cela car dans l'appli l'admin a la possibilité d'ajouter, modifier ou supprimer des profils, sachant que au minimum les profils 'user' et 'admin' ne peuvent être ni modifiés ni supprimés...

    Donc moi je pensais faire comme ceci :

    - Je récupere la liste des fonctionnalités auquelles la personne se connectant a acces (les acces dépendant bien evidemment des profils)
    - Je met tous ca dans le repository (puisque apparemment faut obligatoirement passer par la pour faire un menu dynamique)
    - J'affiche tout ca dans ma balise menu.

    Mais apres peut être que je peux faire ca différemment à savoir de mettre les chaines de caracteres dans un tableau ou une List en session et d'afficher le menu en récupérant les labels dans la liste....

    Mais la j'avoue me sentir un peu perdue... et bien sur il n'y a pas sur le net de tutos clair et complet pour que je puisse m'en sortir Donc je suis un peu en galère

    Anne

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    372
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 372
    Par défaut
    Pour mon message d'erreur c'esdt bon, j'ai trouvé comment faire : j'ai mis le "repository" en request :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    request.setAttribute("repository", repository);
    au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    request.getSession().getServletContext().setAttribute(MenuRepository.MENU_REPOSITORY_KEY, repository);
    Et la il trouve le repository.

    Apres j'ai fait cela dans la jsp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <menu:useMenuDisplayer name="TabbedMenu" repository="repository">
         <c:forEach var="menu" items="${repository.topMenus}">
    		<menu:displayMenu name="${menu.name}"/>
    	</c:forEach>
    </menu:useMenuDisplayer>
    ("TabbedMenu" est défini dans le menu-config.xml.)

    L'erreur à l'éxécution est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    16:07:10,026 WARN  [DisplayMenuTag] No menu in repository with name:  ${menu.name}
    16:07:10,026 WARN  [DisplayMenuTag] No menu in repository with name:  ${menu.name}
    16:07:10,026 WARN  [DisplayMenuTag] No menu in repository with name:  ${menu.name}
    16:07:10,026 WARN  [DisplayMenuTag] No menu in repository with name:  ${menu.name}
    16:07:10,026 WARN  [DisplayMenuTag] No menu in repository with name:  ${menu.name}
    16:07:10,026 WARN  [DisplayMenuTag] No menu in repository with name:  ${menu.name}
    16:07:10,026 WARN  [DisplayMenuTag] No menu in repository with name:  ${menu.name}
    sachant que le nombre de fois ou il me met le message d'erreur "No menu in repository with name: ${menu.name}" est le nombre de menus définis en tant que "TopMenu" dans le repository. (donc il fait bien la boucle foreach comme il faut mais il n'arrive pas à valuer "menu.name"....)

    ... une idée de ou est l'astuce? Parce que je ne vois pas vraiment comment résoudre ca....

    Anne

  6. #6
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    il te faudrait pas utiliser un tag jstl de ce style a tout hasard?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <c:out value="${menu.name}"/>

  7. #7
    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
    Essaie avec la tld struts-menu-el.tld comme ceci :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <%@ taglib uri="/WEB-INF/struts-menu-el.tld" prefix="menu-el" %>
     
    <menu:useMenuDisplayer name="TabbedMenu" repository="repository">
       <c:forEach var="menu" items="${repository.topMenus}">
    	<menu-el:displayMenu name="${menu.name}"/>
       </c:forEach>
    </menu:useMenuDisplayer>

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/01/2008, 10h21
  2. menu déroulant dynamique+struts
    Par debut_java dans le forum Struts 1
    Réponses: 2
    Dernier message: 08/06/2007, 14h31
  3. Menu ressource - dynamique
    Par vic_cw dans le forum Windows
    Réponses: 3
    Dernier message: 09/09/2004, 19h29
  4. [VB6] menu contextuel dynamique
    Par da40 dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 15/07/2003, 11h53

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