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 :

Création d'un menu de manière "dynamique"


Sujet :

Struts 1 Java

  1. #1
    Membre habitué Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Points : 182
    Points
    182
    Par défaut Création d'un menu de manière "dynamique"
    Bonjour à tous,

    Dans le cadre du développement d'une application, pour laquelle on m'a conseillé d'utiliser le système de jsp et struts, je suis déjà dans une impasse, et ne sais pas comment m'en sortir.

    Lors de la connexion d'un utilisateur, je vérifie si ce dernier est connu du système, et récupère la liste des modules de l'application auquel il pourra avoir accès. Cette liste de module se trouve dans une LinkedList<String>. Les modules sont codés de manière à respecter un formalisme prédéfini.

    Dans le but de rendre l'application "internationalisable" (je vois peut être un peu grand pour le début, mais cela facilitera les choses par la suite), j'ai donc créé un fichier messages.properties contenant les clé=valeur pour les messages à afficher.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # Texte des Menus
    menus.COURR=Courrier
    menus.PATRI=Patrimoine
    menus.HELP=Aide
    menus.LOGOUT=Se déconnecter
    Pour l'affichage de la liste des modules, et donc la création du menu, je procède comme ceci :
    Code JSP : 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
    <%@page import="java.util.LinkedList"%>
    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags"%>
    <!DOCTYPE html>
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <link rel="stylesheet" type="text/css" href="/ServeurAGMD/style/Styles.css">
            <title></title>
        </head>
        <body>
            <div class="menuhorizontal">
                <ul>
                <%
                    LinkedList<String> ll = (LinkedList<String>)session.getAttribute("modules");
                    java.util.Iterator<String> iter = ll.iterator();
                    while(iter.hasNext()){
                        out.println("<li><s:property key=\"menus."+iter.next()+"\" /></li>");
                    }
                %>
                </ul>
            </div>
            <h1>Welcome <s:property value="#session['username']" />!</h1>
        </body>
    </html>

    Je remarque dès lors la chose au niveau du code généré :
    Code HTML : 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
    <!DOCTYPE html>
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <link rel="stylesheet" type="text/css" href="/ServeurAGMD/style/Styles.css">
            <title></title>
        </head>
        <body>
            <div class="menuhorizontal">
                <ul>
                <li><s:property key="menus.COURR" /></li>
    <li><s:property key="menus.HELP" /></li>
    <li><s:property key="menus.LOGOUT" /></li>
     
                </ul>
            </div>
            <h1>Welcome rthreis!</h1>
        </body>
    </html>
    Ce qui n'est pas ce que j'attend

    Pourriez-vous me dire comment procéder pour obtenir la valeur se trouvant dans mon fichier properties ?

    En vous remerciant tous pour l'aide que vous pourrez m'apporter.

  2. #2
    Membre habitué Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Points : 182
    Points
    182
    Par défaut
    De manière beaucoup plus simple.

    J'ai un fichier menu.jsp dans un projet. Ce fichier est censé construire le menu de l'application en fonction des droits d'accès donnés à l'utilisateur. Ces droits d'accès sont stockés dans une linkedlist<String>.

    Afin de pouvoir afficher le menu en fonction de la langue du navigateur de l'utilisateur, j'ai créé des fichiers messages.properties, messages_de.properties, ...

    Je souhaiterai à présent savoir, comment je peux remplacer une ligne :
    Code JSP : Sélectionner tout - Visualiser dans une fenêtre à part
    <s:property value="menus.COURR" />

    pour créer le menu de manière dynamique dans mon fichier menu.jsp:

    Code JSP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <ul>
    <%
        java.util.LinkedList<String> ll = (java.util.LinkedList<String>)session.getAttribute("modules");
        java.util.Iterator<String> iter = ll.iterator();
        String temp;
        while(iter.hasNext()){
            temp = iter.next();
            out.println(temp);
            out.println("<li>"+("menus."+temp)+"</li>");  // cette ligne-ci donc
            
        }
    %>
    </ul>

    En vous remerciant pour les réponses que vous pourrez m'apporter.

  3. #3
    Membre actif Avatar de Seb19
    Homme Profil pro
    Concepteur SOA
    Inscrit en
    Septembre 2005
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Concepteur SOA

    Informations forums :
    Inscription : Septembre 2005
    Messages : 217
    Points : 292
    Points
    292
    Par défaut
    Bonjour,

    Il te faut charger le fichier messages.properties dans ta jsp en utilisant le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <%
    private Properties message = new Properties();
    message.load(new FileInputStream(servletContext.getRealPath("/folder/messages.properties")));
    %>
    Puis dans la boucle while, pour chaque itération tu vas récupérer la valeur correspondant à la clé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <%
    while(iter.hasNext()){
            temp = iter.next();
            out.println("<li>"+message.getProperty(temp)+"</li>");   
    }
    %>

  4. #4
    Membre habitué Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Points : 182
    Points
    182
    Par défaut
    Bonjour,

    Désolé pour le retour tardif.

    Alors, je viens de tester ce que tu proposes, mais je coince.

    Le "ServletContext" ne dispose pas d'une méthode getRealPath. En cherchant un peu sur le net, j'ai trouvé que "application" dispose d'une telle méthode.

    J'ai donc modifié de manière suivante :

    Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <%
    java.util.Properties message = new java.util.Properties();
    message.load(new FileInputStream( application.getRealPath("/messages.properties") ));
    while(iter.hasNext()){
            temp = iter.next();
            out.println("<li>"); // ouverture du menu
            out.println(message.getProperty(temp)); // assignation du nom du menu
            out.println("</li>"); // fermeture du menu
    %>
    Je rencontre dès lors une erreur à l'exécution.

    Citation Envoyé par ERREUR
    type Rapport d''exception

    message An exception occurred processing JSP page /app/./../includes/menu.jsp at line 15

    description Le serveur a rencontré une erreur interne qui l''a empêché de satisfaire la requête.

    exception
    org.apache.jasper.JasperException: An exception occurred processing JSP page /app/./../includes/menu.jsp at line 15

    12: <ul class="menu">
    13: <%
    14: Properties message = new Properties();
    15: message.load(new FileInputStream( application.getRealPath("/java/messages.properties") ));
    16: java.util.LinkedList<String> ll = (java.util.LinkedList<String>)session.getAttribute("modules");
    17: java.util.Iterator<String> iter = ll.iterator();
    18: String temp;

    Le fichier message.properties se trouve dans le "<default package>" de mon projet Netbeans, et je ne sais donc pas si il me faut renseigner un chemin complet ou non. J'ai essayé en ajoutant le nom du projet
    Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
    message.load(new FileInputStream( application.getRealPath("/ServeurAGMD/messages.properties") ));
    mais l'erreur est identique.
    Etant tout nouveau dans le concept de développement web, je requiers donc, une fois de plus, l'aide de la communauté.

    En espérant être clair dans ma question, je vous souhaite à tous, une bonne journée.

  5. #5
    Membre habitué Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Points : 182
    Points
    182
    Par défaut
    C'est bon, j'ai trouvé comment lire le fichier properties en question (le chemin d'accès était incorrecte).

    Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <%
        java.util.Properties message = new java.util.Properties();
        message.load(new FileInputStream(application.getRealPath("../../src/java/messages.properties")));
        java.util.LinkedList<String> ll = (java.util.LinkedList<String>)session.getAttribute("modules");
        java.util.Iterator<String> iter = ll.iterator();
        String temp;
        while(iter.hasNext()){
            temp = "menus."+iter.next();
            out.println("<li>"); // ouverture du menu
            out.println(message.getProperty(temp)); // assignation du nom du menu
            out.println("</li>"); // cloture du menu
        }
    %>

    Par contre, chose très embêtante, l'internationalisation ne fonctionne pas.

    A la base, je développe l'application de manière à ce qu'elle dispose de 3 langues, dans un premier temps en tout cas (FR, DE et EN).
    Or, lorsque je change, comme montré dans le cours de M. Tahe, les préférences de langues, il persiste à m'afficher les informations en FR (langue contenue dans le fichier messages.properties).
    Or, moi, je souhaiterai que de manière automatique, il charge le bon fichier de langue.

    Donc, je pense qu'il doit exister une manière plus simple pour réaliser le menu, que de passer par le fichier properties, et par conséquent, risquer de choisir la mauvaise pour l'utilisateur.

    Dans la jsp, on utilise les properties de la manière suivante :

    Code JSP : Sélectionner tout - Visualiser dans une fenêtre à part
    <s:textfield name="username" key="login.username" />

    Est-il possible de faire quelque chose d'aussi simple en pur java ? Ou alors, je me repenche sur les droits et le système utilisé...

  6. #6
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2013
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Dans ton code initial, peux-tu essayer l'adaptation suivante ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <ul>
    <%
        java.util.LinkedList<String> ll =  (java.util.LinkedList<String>)session.getAttribute("modules");
        java.util.Iterator<String> iter = ll.iterator();
        while(iter.hasNext()){
    	%>
            <li><s:property key='menus.<%=iter.next()%>'/></li> 
        <%}%>
    </ul>
    En effet, en faisant un print les basises tagLib ne sont pas interprétées

Discussions similaires

  1. Aide pour la création d'un menu dynamique
    Par manu11 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 11/11/2009, 23h30
  2. Création d'un menu contextuel dynamique.
    Par femfem dans le forum WinDev
    Réponses: 1
    Dernier message: 19/11/2007, 15h43
  3. Création d'un menu (de langue) dynamiquement
    Par neb-toi dans le forum Langage
    Réponses: 7
    Dernier message: 21/11/2005, 15h27

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