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 :

[Validator] Message d'alerte et plusieurs resource bundle [FAQ]


Sujet :

Struts 1 Java

  1. #1
    Membre averti
    Inscrit en
    Juillet 2002
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 58
    Par défaut [Validator] Message d'alerte et plusieurs resource bundle
    Bonjour,

    J'ai un petit souci pour afficher mes messages d'erreur lors de la validation de mon formulaire. Mon appli possède 2 fichiers properties (resource bundle). J'ai défini mes messages d'erreurs dans l'un d'eux. Le problème (apparement) est que le mécanisme du validator charge un seul fichier properties.
    Au final, il m'affiche une fenêtre d'alerte sans message. Si je défini ces messages d'erreur dans le 2ème fichier properties, les messages s'affichent bien.

    Est-il donc possible de définir le fichier properties dans lequel se trouve les messages d'erreur et l'associer au formulaire ?

    j'utilise struts 1.1 et validator 1.0.1

    merci.


    --
    Bicnic.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Par défaut
    Aller, encore une astuce pour Struts alors :

    Comment charger plusieurs fichiers de ressources sous un seul bundle Struts:
    Le principe consiste à fusionner les resources-bundles au chargement.

    Voici la classe qui se charge de lefaire :

    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
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    package bla.bla.bla.struts;
     
    import java.io.InputStream;
    import java.util.Enumeration;
    import java.util.Properties;
     
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.apache.struts.util.MessageResourcesFactory;
    import org.apache.struts.util.PropertyMessageResources;
     
    public class MultiPropertyMessageResources extends PropertyMessageResources
    {
     
        protected static final Log log;
     
        public MultiPropertyMessageResources(MessageResourcesFactory factory, String config)
        {
            super(factory, config);
            log.info("Initializing, config='" + config + "'");
        }
     
        public MultiPropertyMessageResources(MessageResourcesFactory factory, String config, boolean returnNull)
        {
            super(factory, config, returnNull);
            log.info("Initializing, config='" + config + "', returnNull=" + returnNull);
        }
     
        protected void loadLocale(String localeKey)
        {
    label0:
            {
                if(log.isTraceEnabled())
                    log.trace("loadLocale(" + localeKey + ")");
                synchronized(locales)
                {
                    if(locales.get(localeKey) == null)
                        break label0;
                }
                return;
            }
            locales.put(localeKey, localeKey);
     
            String configFiles[] = config.split(",");
            for(int i = 0; i < configFiles.length; i++)
            {
                String name = configFiles[i].trim().replace('.', '/');
                if(localeKey.length() > 0)
                    name = name + "_" + localeKey;
                name = name + ".properties";
                InputStream is = null;
                Properties props = new Properties();
                try
                {
                    if(log.isTraceEnabled())
                        log.trace("  Loading resource '" + name + "'");
                    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
                    if(classLoader == null)
                        classLoader = getClass().getClassLoader();
                    is = classLoader.getResourceAsStream(name);
                    if(is != null)
                    {
                        props.load(is);
                        is.close();
                    }
                    if(log.isTraceEnabled())
                        log.trace("  Loading resource completed");
                }
                catch(Throwable t)
                {
                    log.error("loadLocale()", t);
                    if(is != null)
                        try
                        {
                            is.close();
                        }
                        catch(Throwable u) { }
                }
                if(props.size() < 1)
                    return;
                synchronized(messages)
                {
                    String key;
                    for(Enumeration names = props.keys(); names.hasMoreElements(); messages.put(messageKey(localeKey, key), props.getProperty(key)))
                    {
                        key = (String)names.nextElement();
                        if(log.isTraceEnabled())
                            log.trace("  Saving message key '" + messageKey(localeKey, key));
                    }
     
                }
            }
     
            return;
        }
     
     
        static 
        {
            log = LogFactory.getLog(MultiPropertyMessageResources.class);
        }
    }
    Il faut ensuite écrire un Factory pour Struts :

    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
    package bla.bla.bla.struts;
     
    import org.apache.struts.util.MessageResources;
    import org.apache.struts.util.PropertyMessageResourcesFactory;
     
     
    public class MultiPropertyMessageResourcesFactory extends PropertyMessageResourcesFactory
    {
     
        public MultiPropertyMessageResourcesFactory()
        {
        }
     
        public MessageResources createResources(String config)
        {
            return new MultiPropertyMessageResources(this, config, returnNull);
        }
    }
    Quand à son utilisation...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <message-resources parameter="fichier1,fichier2,fichier3" factory="bla.bla.bla.struts.MultiPropertyMessageResourcesFactory" />
    Problème résolu pour le validator et toutes les ressources utilisées par Struts.

    A la FAQ

  3. #3
    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 : 46
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 918
    Par défaut
    Alwin t'es trop fort

  4. #4
    Membre averti
    Inscrit en
    Juillet 2002
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 58
    Par défaut
    Merci beaucoup pour ton astuce.

    Le problème est que j'ai 2 fichiers struts-config. Chacun de ces fichiers défini son propre fichier de ressources. Je ne peux donc pas les définir dans un même struts-config, séparé par des virgules...
    J'ai tout de même essayé ton astuce, mais malheureusement, la Factory n'est appelé qu'une seule fois, et elle possède la config d'un seul fichier ressource.
    Merci.

    --
    Bicnic.

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Par défaut
    Citation Envoyé par Bicnic
    ...Le problème est que j'ai 2 fichiers struts-config...
    Il serait bon de donner l'intégralité de l'énoncé en une seule fois

  6. #6
    Membre averti
    Inscrit en
    Avril 2002
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 44
    Par défaut
    Bonjour,

    J'ai vu la réponse d'Alwin dans la FAQ Struts mais celle-ci me gêne un peu dans le sens où il y a un "goto" avec "label0"...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        protected void loadLocale(String localeKey)
        {
    label0:
            {
                if(log.isTraceEnabled())
                    log.trace("loadLocale(" + localeKey + ")");
                synchronized(locales)
                {
                    if(locales.get(localeKey) == null)
                        break label0;
                }
                return;
            }
            locales.put(localeKey, localeKey);
    Est-ce qu'il n'existe pas une solution plus "propre" pour charger plusieurs fichiers de ressources ?

    Merci de votre aide.

  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
    Si tu as une version Struts 1.1 ou supérieure, tu peux définir plusieurs fichiers de ressources dans le struts-config.xml comme indiqué dans la FAQ Struts ici.

    Ensuite, dans le fichier xml de validation, dans la balise msg, tu ajoutes l'attribut bundle et tu y mets la valeur que tu as codé dans l'attribut key de la balise message-resources.

  8. #8
    Membre averti
    Inscrit en
    Avril 2002
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 44
    Par défaut
    Merci pour ta réponse c_nvy mais je me suis peut-être mal expliqué. En fait, oui je sais qu'il est possible de paramétrer plusieurs resources bundles dans le fichier struts-config.xml. La FAQ Struts donne une autre solution "sexy" (voir ici) qui permet de charger en mémoire plusieurs fichiers de ressources en une fois histoire et ne pas avoir à spécifier le bundle à chaque utilisation de clé.

    Le fond est bien mais c'est la forme qui m'embête avec l'utilisation d'un GOTO au début... Alwin, le rédacteur de cette solution dans la FAQ, a remis cette solution dans ce sujet donc je rebondis pour savoir si quelqu'un a une idée sur la façon d'éviter de faire ce GOTO et surtout à quoi il sert car ce n'est pas très propre comme solution (enfin, on m'a toujours dit, quelque soit le langage de développement, qu'il ne fallait jamais utiliser les GOTO car c'est dangereux...).

    Donc, si quelqu'un a une idée, je suis preneur.

    Merci.

  9. #9
    Membre chevronné


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 855
    Par défaut
    Où vois tu un goto ?
    Moi je ne vois qu'un break qui dit de sortir de la portée définie par label0.

Discussions similaires

  1. Définir plusieurs resources bundle sur un report
    Par ladine35 dans le forum iReport
    Réponses: 2
    Dernier message: 01/12/2013, 19h57
  2. pb validator message-resources
    Par Tanebisse dans le forum Struts 1
    Réponses: 8
    Dernier message: 22/04/2008, 10h34
  3. Message alert sur plusieurs lignes
    Par jo281 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 18/01/2006, 16h56
  4. Réponses: 9
    Dernier message: 24/03/2004, 12h15

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