Voici le code o� j'ajoute mon message � ma page jsp � partir d'une
ExceptionApplicative.
/**
* Met � jour la valeur du message associ� � la page
*
* @param aEx l'exception qui contient le message
*/
protected void ajouterMessage(ExceptionApplicative aEx)
{
List vListeParams = aEx.getParametres();
if (vListeParams == null)
{
message = traduire(aEx.getMessage());
}
else
{
Object[] vParams = new Object[vListeParams.size()];
for (int i = 0; i < vParams.length; i++)
{
Object vParamCour = vListeParams.get(i);
if (vParamCour instanceof String)
{
vParams[i] = traduire(vParamCour.toString());
}
else
{
vParams[i] = vParamCour;
}
}
message = traduire(aEx.getMessage(), vParams);
}
}
et pour racourcir
/**
* M�thode de commodit� qui permet de traduire un message en utilisant
* le traducteur associ� � la page
*
* @param aCle la cl� � traduire
* @return le message traduit
*/
protected String traduire(String aCle)
{
ResourceBundle vBundle = ResourceBundle.getBundle("monfichier",
request.getLocale);
return vBundle.getString(request.getLocale(), aCle);
}
/**
* M�thode de commodit� qui permet de traduire un message avec arguments
* en utilisant le traducteur associ� � la page
*
* @param aCle la cl� � traduire
* @param aArgs les arguments du message � traduire
* @return le message traduit
*/
protected String traduire(String aCle, Object[] aArgs)
{
return MessageFormat.format(traduire(aCle), aArgs);
}
Utilisation
...
ExceptionApplicative aEx = new ExceptionApplicative("message.erreur");
aEx.ajouterParametre(utilisateur.getNom());
aEx.ajouterParametre(application.getNom()); // avec application.getNom() ==
application.toto
Extrait du fichier de ressource monFichier_fr
message.erreur=L'utilisateur {0} n'est pas autoris� � acc�der � l'application
{1}.
application.toto = SuperApplication toto
Voil�, je ne sais pas si l'exemple est clair mais c'est en gros ce que je fais
Seb
Le Lundi 10 Juin 2002 09:39, vous avez �crit :
> > Je crois que l'on ne se comprend pas bien. J'avais bien compris qu'il
>
> fallait
>
> > surcharger la m�thode pour fournir sa propre impl�mentation mais
> > personnellement je ne consid�res pas que la Locale est un param�tre du
> > contexte. La Locale est fournie par la requ�te http. Or, si je veux que
> > ma
> >
> > partie m�tier soit ind�pendante de la partie pr�sentation, mes exceptions
>
> ne
>
> > peuvent avoir connaissance de la requ�te http. Personnellement je ne vois
>
> pas
>
> > de moyen simple de fournir la Locale aux exceptions.
>
> Je pensais que tu localisais au niveau de l'application, en fait tu
> localises au niveau de l'utilisateur.
> Dans ce cas, tes exceptions ont besoin de connaitre le contexte utilisateur
> pour travailler.
> Je pense qu'il est plus interressant de leur fournir un context utilisateur
> qu'un contexte Locale uniquement. Ta conception sera plus ouverte, pour
> trouver par exemple le nom de l'utilisateur.
>
> Maintenant, il est possible de connaitre la localisation sans la
> transmettre
>
>
> 1) r�c�ption d'une requ�te HTTP
> 2) cr�ation d'un Thread T pour traiter la requ�te par une servlet
> 3) la servlet extrait le contexte utilisateur CU (Locale compris)
> 4) la servlet indique au UserManager que le Thread T g�re CU (une simple
> Hastable pour le stockage)
> 5) Traitement
> 5.a) Une exception est lev�e
> 6) La servlet re�oit l'exception et demande le message localis�
> 6.a) L'exception demande � UserManager le contexte utilisateur.
> UserManager le d�termine � partir du Thread et renvoie CU
> 6.b) le message localis� est renvoy�
> 7) Affichage et traitement d'erreur
>
> > Le moyen que je mets en oeuvre est bas� sur les classes ResourceBundle
> > ET MessageFormat...trouv� autre chose qui me convienne.
>
> Excuses moi, mais je n'ai pas bien compris en d�tail ton explication.
> Peux tu fournir un exemple simple :-)
>
> Cordialement,
>
> --------------------------------------------------------------------
> Erik Mazoyer, Chef de projet
> HyperOffice
> 6, rue Jacques Daguerre - 92565 Rueil-Malmaison Cedex
> T�l. 01 41 96 96 76
> Fax 01 41 96 96 77
> M�l [EMAIL PROTECTED]
>
> -----Message d'origine-----
> De: Sebastien Cesbron [mailto:[EMAIL PROTECTED]]
> Date: lundi 10 juin 2002 13:19
> �: [EMAIL PROTECTED]
> Objet: Re: [MTX-SPAM-WARN] Gestion des exceptions et i18n
>
>
> Je crois que l'on ne se comprend pas bien. J'avais bien compris qu'il
> fallait
> surcharger la m�thode pour fournir sa propre impl�mentation mais
> personnellement je ne consid�res pas que la Locale est un param�tre du
> contexte. La Locale est fournie par la requ�te http. Or, si je veux que ma
> partie m�tier soit ind�pendante de la partie pr�sentation, mes exceptions
> ne
>
> peuvent avoir connaissance de la requ�te http. Personnellement je ne vois
> pas
> de moyen simple de fournir la Locale aux exceptions.
>
> Le moyen que je mets en oeuvre est bas� sur les classes ResourceBundle ET
> MessageFormat. Je r�cup�res mon message aupr�s de mon ResourceBundle puis
> je
>
> passe ce message et mon tableau d'Objet � l'instance de MessageFormat.
> Le principe c'est donc d'avoir au niveau de mon constructeur de mes
> exceptions un deuxi�me argument en plus du message qui est le tableau des
> param�tres du message.
> Je fais un "throw new MonException(monMessage, mesParams)"
> Ensuite pour l'utiliser je fais un :
>
> traducteur.getMessage(request.getLocale, monEx.getMessage(),
> monEx.getParams())
>
> avec traducteur qui est une instance d'une classe � moi qui effectue la
> traduction en se basant sur ResourceBundle et MessageFormat.
>
> Le probl�me qui se pose alors concerne des param�tres qui eux m�mes doivent
> �tre traduits avant d'�tre ins�r� dans le message.
> Le moyen que j'ai trouv� pour l'instant mais qui ne me pla�t qu'� moiti�
> c'est de faire un "params[i] = traducteur.getMessage(params[i])" dans le
> cas
>
> o� params[i] est une String et d'avoir la m�thode getMessage qui me
> retourne
>
> la cl� pass�e en param�tre quand elle ne trouve pas de traduction. Ainsi je
> traduits tous mes param�tres de type cha�ne m�me ceux qui n'ont pas � �tre
> traduits. Le probl�me, c'est si un param�tre qui n'a pas � �tre traduit �
> le
>
> m�me nom qu'une cl� de traduction !! C'est pour cela que je voulais savoir
> s'il existait d'autres m�thodes de traduction, mais pour l'instant je n'ai
> pas trouv� autre chose qui me convienne.
>
> Seb
>
> Le Lundi 10 Juin 2002 07:53, vous avez �crit :
> > > Le probl�me de la m�thode getLocalizedMessage c'est qu'elle ne
> > > prend pas de Locale en argument, donc d'apr�s ce que je comprends,
> > > elle retourne pour moi le message convertit dans la Locale par
> > > d�faut du serveur...
> >
> > Elle n'est pas aussi intelligente :
> > Subclasses may override this method in order to produce a locale-specific
> > message
> >
> > > ...Or, sur une appli web on peut avoir plusieurs
> > > clients avec chacun leur Locale.
> >
> > En faite voila le code :
> > public String getLocalizedMessage() {
> > return getMessage();
> > }
> >
> > C'est une proposition d'impl�mentation.
> > Je te conseille donc d'�crire ta classe d'exception qui surcharge
> > getLocalizedMessage.
> > Dans cette surcharge tu r�cup�res la localisation courante de ta Web
> > Application gr�ce
> > � un param�tre de contexte :
> >
> > <context-param>
> > <param-name>localisation</param-name>
> > <param-value>fr_fr</param-value>
> > </context-param>
> >
> > Si tu veux �tre encore plus ouvert, tu d�finis une interface de
> > r�solution de localisation que tu impl�mente � ta guise.
> > Par exemple Locale.getDefault() par d�faut et new
> > Locale(getServletContext().getAttribute("localisation")) dans le cas
> > discut�.
> >
> > > De plus, je voulais pouvoir avoir plusieurs messages associ�s �
> > > IllegalValue, certains avec des param�tres, d'autres sans et dans
> > > ceux qui ont des param�tres, certains de ces param�tres sont
> > > �galement � traduire.
> >
> > Je r�soudrais en ayant soit plusieurs constructeur, soit des sous classes
> > si tu obtiens plusieurs constructeur avec la m�me signature.
> >
> > > Pour r�soudre mon probl�me j'ai donc ajout� � mon exception
> > > un tableau d'objet qui contient les param�tres du message.
> >
> > Je ne vois pas bien comment tu vas trouver la bonne traduction dans ton
> > ResourceBundle avec un tableau en param�tre.
> > Personnellement je pr�f�re plusieurs constructeurs et/ou des sous
> > classes.
> >
> >
> > --------------------------------------------------------------------
> > Erik Mazoyer, Chef de projet
> > HyperOffice
> > 6, rue Jacques Daguerre - 92565 Rueil-Malmaison Cedex
> > T�l. 01 41 96 96 76
> > Fax 01 41 96 96 77
> > M�l [EMAIL PROTECTED]
> >
> > -----Message d'origine-----
> > De: Sebastien Cesbron [mailto:[EMAIL PROTECTED]]
> > Date: lundi 10 juin 2002 11:31
> > �: [EMAIL PROTECTED]
> > Objet: Re: [MTX-SPAM-WARN] Gestion des exceptions et i18n
> >
> >
> > Salut,
> >
> > Le probl�me de la m�thode getLocalizedMessage c'est qu'elle ne prend pas
>
> de
>
> > Locale en argument, donc d'apr�s ce que je comprends, elle retourne pour
> > moi
> >
> > le message convertit dans la Locale par d�faut du serveur. Or, sur une
> > appli
> >
> > web on peut avoir plusieurs clients avec chacun leur Locale.
> > Je pensais donc plut�t cr�er mes exceptions en passant les param�tres au
> > constructeur (throw new illegalValue(9, 4, 7)) comme le conseille Eric
>
> mais
>
> > ensuite je dois avoir une m�thode qui ressemblerait plus �
> > getLocalizedMessage(Locale) pour pouvoir choisir pour quelle Locale je
>
> veux
>
> > avoir le message.
> > De plus, je voulais pouvoir avoir plusieurs messages associ�s �
> > IllegalValue,
> > certains avec des param�tres, d'autres sans et dans ceux qui ont des
> > param�tres, certains de ces param�tres sont �galement � traduire.
> >
> > Par exemple je pourrais avoir le message "Valeur invalide : {0}. Le
> > nombre doit �tre compris entre {1} et {2}." et le message "Valeur
> > invalide pour
>
> le
>
> > champ "{0}" : {1}. Le nombre doit �tre compris entre {2} et {3}." avec
> > comme
> >
> > param�tre 0 la valeur "user.name" (valeur � traduire suivant la Locale).
> >
> > Pour r�soudre mon probl�me j'ai donc ajout� � mon exception un tableau
> > d'objet qui contient les param�tres du message.
> >
> > Merci pour vos r�ponses
> >
> > Seb
> >
> > Le Jeudi 6 Juin 2002 13:52, vous avez �crit :
> > > Normalement les exceptions sont cens�es pouvoir retourner le message de
> > > la localisation en cours.
> > >
> > > public String getLocalizedMessage()
> > >
> > > Creates a localized description of this Throwable. Subclasses may
> > > override this method in order to produce a locale-specific message. For
> > > subclasses that do not override this method, the default implementation
> > > returns the same result as getMessage().
> > >
> > >
> > > Il "suffit" donc � ton exception de savoir interroger son
> > > ResourceBundle (tu peux impl�menter des caches si tu veux r�pondre plus
> > > vite).
> > >
> > > Je pense que l'exception est donc la mieux plac�e pour g�rer la
> >
> > traduction.
> >
> > > Par exemple, une exception li� � un nombre devant �tre plac� entre deux
> > > bornes,
> > > s'�crira :
> > >
> > > Invalid value : 9. The number must be greater than 4 and lesser than 7.
> > > Valeur invalide : 9. Le nombre doit �tre compris entre 4 et 7.
> > >
> > > Le lancement de l'exception pourrait �tre :
> > > throw new IllegalValue(9, 4, 7)
> > >
> > > Je compl�terais le ResourceBundle avec un java.text.MessageFormat
> > >
> > > fichier_en
> > > Invalid value : {0}. The number must be greater than {1} and lesser
> > > than {2}.
> > > fichier_fr
> > > Valeur invalide : {0}. Le nombre doit �tre compris entre {1} et {2}.
> > >
> > > Tu pourras g�rer comme tu le d�sire tes constructeur avec des messages
> > > diff�rent suivant le contenu de ton exception.
> > >
> > > Si tu dois ajouter une exception, aucune modification n'est apport�e �
>
> la
>
> > > visualisation.
> > >
> > > --------------------------------------------------------------------
> > > Erik Mazoyer, Chef de projet
> > > HyperOffice
> > > 6, rue Jacques Daguerre - 92565 Rueil-Malmaison Cedex
> > > T�l. 01 41 96 96 76
> > > Fax 01 41 96 96 77
> > > M�l [EMAIL PROTECTED]
> > >
> > > -----Message d'origine-----
> > > De: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]
> > > Date: jeudi 6 juin 2002 15:26
> > > �: [EMAIL PROTECTED]
> > > Objet: Re: [MTX-SPAM-WARN] Gestion des exceptions et i18n
> > >
> > > At 08:42 2002-06-06 +0000, you wrote:
> > > >Personnellement, je ne voulais pas mettre l'i18n au niveau des
> > > > exceptions
> > >
> > > et
> > >
> > > >j'ai pour cela plusieurs raisons :
> > > >
> > > >- Etant donn� que j'ai une interface web, c'est au niveau de la
> > > > requ�te que je r�cup�re la Locale. Si je veux i18ner directement la
> > > > classe ExceptionFonctionnelle il faut alors que je passe en param�tre
> > > > � toutes mes m�thodes m�tier la Locale utilis�e ce qui me para�t
> > > > lourd. - Je consid�re que le traitement des r�gles de gestion m�tier
> > > > est
> > >
> > > ind�pendant
> > >
> > > >de cette Locale et donc c'est pour cela que je voulais traiter l'i18n
> > > >uniquement au niveau de ma couche de pr�sentation.
> > >
> > > Ce n'est pas vrai. Tu n'as seulement qu'� passer la Locale � ta classe
> > > qui g�n�re les exceptions. De cette fa�on, quand tu "throw" une
>
> exception
>
> > > dans une de tes m�thodes, cette derni�re n'a pas � passer la Locale en
> > > param�tre. Ton argument sur la lourdeur ne tient donc pas.
> > >
> > > L'id�e c'est que lorsque tu "throw" une exception toi-m�me, tu indiques
> > > qu'une condition particuli�re n'est pas remplie et donc que le
> > > programme
> >
> > ne
> >
> > > peut se poursuivre. Tu ajoute donc une message dans le constructeur de
> > > cette exception qui indique que telle condition particuli�re a �t�
> > > rencontr�e. Or ce message est un champ dans la classe des exceptions
> > > qui provient de la lecture de ton fichier .PROPERTIES. Donc la
> > > traduction
>
> est
>
> > > g�r�e � un autre niveau.
> > >
> > > Maintenant, que ce message ajout� soit en fran�ais, en anglais, en
> >
> > italien,
> >
> > > ... ne change absolument rien au fonctionnement, car c'est la job de
> > > ton ResourceBundle de toujours pointer sur le fichier .PROPERTIES
> > > contenant
> >
> > les
> >
> > > textes dans la langue de ta Locale.
> > >
> > > Finalement, ton JSP v�rifie si une exception se trouve dans la requ�te
>
> et
>
> > > si c'est le cas, il affiche de fa�on triviale le message d'erreur
> > > rencontr�.
> > >
> > > Sylvain
> > >
> > > >Pour l'instant je m'en sors en ajoutant une liste d'Objets (mes
> >
> > arguments)
> >
> > > �
> > >
> > > >mon exception. Lorsque je traduis, s'il l'un de ces objets est une
> > > > string
> > >
> > > je
> > >
> > > >le traduis (la traduction d'une cha�ne inconnue retourne cette
> > > > cha�ne).
> >
> > Je
> >
> > > ne
> > >
> > > >trouve pas cela formidable mais pour l'instant je n'ai pas trouv�
>
> mieux.
>
> > > >Seb
> > > >
> > > >Le Mercredi 5 Juin 2002 17:42, vous avez �crit :
> > > > > Voici comment tu pourrais le faire (j'assume que lorsque tu parles
>
> de
>
> > > > > gestion des exceptions, tu veux dire la gestion des exceptions que
>
> tu
>
> > > > > g�n�res toi-m�me)
> > > > >
> > > > > - Pour chaque message d'erreur pertinent � ton application, tu cr�e
> >
> > une
> >
> > > > > nouvelle clef dans un fichier .PROPERTIES
> > > > > - Tu as autant de fichier .PROPERTIES que tu supportes de language.
> > > > > - Ta classe ExceptionFonctionnelle doit comprendre un champ de type
> > > > > ResourceBundle, que tu initialises avec la source de ton fichier
> > > > > .PROPERTIES. example: private static ResourceBundle resFile =
> > > > > ResourceBundle.getBundle(com.ta_compagnie.context_path.nom_fichier)
> > > > >;
> > > > >
> > > > > - Ta classe ExceptionFonctionnelle doit comprendre un champ pour
> >
> > chaque
> >
> > > > > message d'erreur diff�rent. Ce champ doit lire la clef
>
> correspondante
>
> > > dans
> > >
> > > > > ton fichier .PROPERTIES
> > > > > example: public final static String MAUVAIS_UNAME =
> > > > > resFile.getString("exception.uname.mauvais");
> > > > >
> > > > > -A chaque fois que tu "throw" une exception, celle-ci sera
> > >
> > > automatiquement
> > >
> > > > > traduite si tu fournis un message d'erreur correspondant � un des
> > >
> > > messages
> > >
> > > > > d'erreur compris dans ta classe ExceptionFonctionnelle dans le
> > >
> > > constructeur
> > >
> > > > > de la nouvelle exception (ouf !)
> > > > > Example: if (machin!=56)
> > > > > throw new
> > > > > ExceptionFonctionnelle(ExceptionFonctionnelle.MAUVAIS_UNAME);
> > > > >
> > > > > -A chaque fois que l'utilisateur change de langue, une m�thode dans
> > > > > ExceptionFonctionnelle doit relire les clefs de ton fichier
> >
> > .PROPERTIES
> >
> > > en
> > >
> > > > > fonction de la langue choisie.
> > > > >
> > > > >
> > > > > De cette fa�on, tu traites les exceptions uniform�ment. Si tu veux
> > >
> > > ajouter
> > >
> > > > > des param�tres � traduire, tu ajoutes des champs dans ta classe
> > > > > ExceptionFonctionnelle et aussi les clefs correspondantes dans ton
> > >
> > > fichier
> > >
> > > > > .PROPERTIES. Et oui, c'est juste de designer ton application pour
>
> que
>
> > > > > la partie m�tier se charge de la gestion des exception et que la
> >
> > partie
> >
> > > > > pr�sentation ne fait que l'afficher, car c'est conforme au
> > > > > paradigme
> > >
> > > MVC.
> > >
> > > > > Sylvain
> > > > >
> > > > > At 15:13 2002-06-05 +0000, you wrote:
> > > > > > > 1-Quand tu dis "j'avais une ExceptionFonctionnelle je
> > > > > > > r�cup�rais
> >
> > le
> >
> > > > > > > message associ� dans ma partie pr�sentation que je traduisais",
> > > > > > > veux-tu dire que tu traduis le message associ� � l'exception en
> > > > > > > fonction du choix de langue de l'utilisateur ?
> > > > > >
> > > > > >Oui, je traduis le message en fonction de la langue de
> > > > > > l'utilisateur.
> > > > > >
> > > > > > > 2-Lorsque tu parles de la partie m�tier et de la partie
> > >
> > > pr�sentation,
> > >
> > > > > > > est-ce que tu veux dire que la partie m�tier est constitu�e de
> > >
> > > classes
> > >
> > > > > > > Java et que la partie pr�sentation est constitu�e de JSP ou
> > > > > > > bien
> > >
> > > d'un
> > >
> > > > > > > interface graphique genre Swing ?
> > > > > >
> > > > > >Ma partie m�tier correspond � des classes java et ma partie
> > >
> > > pr�sentation
> > >
> > > > > > est un framework model2 maison constitu� de jsp, servlet et
>
> classes
>
> > > java
> >
> >__________________________________________________________________________
> >
> > > > > >____ ifrance.com, l'email gratuit le plus complet de l'Internet !
> > > > > >vos emails depuis un navigateur, en POP3, sur Minitel, sur le
>
> WAP...
>
> > > > > >http://www.ifrance.com/_reloc/email.emailif
> > > > >
> > > > > --------------------------------
> > > > > Sylvain Cliche
> > > > > 822-6000 Ext. 7765
> > > > > [EMAIL PROTECTED]
> >
> >__________________________________________________________________________
> >
> > > >_
> > >
> > > ___
> > >
> > > >ifrance.com, l'email gratuit le plus complet de l'Internet !
> > > >vos emails depuis un navigateur, en POP3, sur Minitel, sur le WAP...
> > > >http://www.ifrance.com/_reloc/email.emailif
> > >
> > > --------------------------------
> > > Sylvain Cliche
> > > 822-6000 Ext. 7765
> > > [EMAIL PROTECTED]
>
> ___________________________________________________________________________
>
> >_ __
> > ifrance.com, l'email gratuit le plus complet de l'Internet !
> > vos emails depuis un navigateur, en POP3, sur Minitel, sur le WAP...
> > http://www.ifrance.com/_reloc/email.emailif
>
> ___________________________________________________________________________
>_ __
> ifrance.com, l'email gratuit le plus complet de l'Internet !
> vos emails depuis un navigateur, en POP3, sur Minitel, sur le WAP...
> http://www.ifrance.com/_reloc/email.emailif
______________________________________________________________________________
ifrance.com, l'email gratuit le plus complet de l'Internet !
vos emails depuis un navigateur, en POP3, sur Minitel, sur le WAP...
http://www.ifrance.com/_reloc/email.emailif