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

Tapestry Java Discussion :

Supprimer la locale dans URL


Sujet :

Tapestry Java

  1. #1
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut Supprimer la locale dans URL
    Comment est-ce possible d'éviter que Tapestry rajoute la locale dans l'url:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    http://host/fr/home/index
    http://host/en/home/index
    J'ai vu qu'il y avait des SymbolConstants à setter dans AppModule:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    configuration.add(SymbolConstants.ENCODE_LOCALE_INTO_PATH, "false");
    Mais d'après l'API, il faudra gérer la persistance de la locale manuellement avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    LinkCreationListener/LinkCreationListener2(si Tapestry > 5.1.*)
     
    et LinkCreationHub
    Je n'ai rien trouvé sur le Net. Quelqu’un a une idée? Merci.

  2. #2
    Membre actif
    Avatar de vahid
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 228
    Points : 276
    Points
    276
    Par défaut
    Bonjour,

    La locale est présente dans le nom des pages ou des assets ?

    Quelle est la version de Tapestry est utilisée ? Je n'ai jamais vu cette locale apparaitre !
    Non, Vahid n'est pas mon prénom
    c' est gratuit , aussi

  3. #3
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut
    J'ai défini les locales pour l'appli comme il faut dans AppModule:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public static void contributeApplicationDefaults(
    MappedConfiguration<String, String> configuration)
    {
    ..
    configuration.add("tapestry.supported-locales", "en,fr");
    }
    Pour changer de locale j'ai utilisé un link dqns la view:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <p align="right">
    <t:actionlink t:id="switchlocale">
    ${localeLabel}
    </t:actionlink>
    </p>
    avec PersistentLocale dans la classe de layout appropriée:
    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
     
    @Inject
    private PersistentLocale persistentLocale;
    @Inject
    private Locale currentLocale;
    @Persist
    private String localeLabel;
     
    public String getLocaleLabel()
    {
    if (localeLabel == null)
    {
    if (currentLocale.equals(Locale.FREBCH))
    {
    localeLabel =
    new Locale("en").getDisplayName(Locale.ENGLISH);
    }
    else
    {
    localeLabel =
    new Locale("de").getDisplayName(Locale.FRENCH);
    }
    }
     
    return localeLabel;
    }
     
    @OnEvent(component="switchlocale")
    void changeLocale()
    {
    localeLabel = currentLocale.getDisplayName(currentLocale);
    if (currentLocale.equals(Locale.FRENCH))
    {
    persistentLocale.set(Locale.ENGLISH);
    }
    else
    {
    persistentLocale.set(Locale.FRENCH);
    }
    }
    Tout fonctionne bien, mais Tapestry rajoute toujours un préfixe en ou fr ce que je voudrais éviter, car dans une appli réelle qui ne prévoyait pas d’internationalisation, ça ne marche pas car l'url genre domain/en/home ou domain/fr/home/ est inconnu.
    La version de Tapestry que j'utilise est 5.1.0.5.

  4. #4
    Membre actif
    Avatar de vahid
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 228
    Points : 276
    Points
    276
    Par défaut
    Tu dois apparament redéfinir la méthode de gestion de la locale via Cookie ou autre en utilisant un RequestFilter.

    Je ne comprends pas par contre pourquoi cela ne fonctionne pas dans ton application, c'est censé être pris en charge par Tapestry.
    Non, Vahid n'est pas mon prénom
    c' est gratuit , aussi

  5. #5
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut
    La seule chose que j'ai trouvée dans API - c'est de rajouter une autre constante dans la config via Class SymbolConstants.ENCODE_LOCALE_INTO_PATH qui est à true par défaut:
    If "true" (the default), then the PersistentLocale will be encoded into the Link path by the ComponentEventLinkEncoder service. If overriden to "false" this does not occur, but you should provide a LinkCreationListener (registered with the LinkCreationHub) in order to add the locale as a query parameter (or provide some alternate means of persisting the locale between requests).
    Mais je ne trouve aucun exemple comment le définir avec LinkCreationListener ?

  6. #6
    Membre actif
    Avatar de vahid
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 228
    Points : 276
    Points
    276
    Par défaut
    Le service PersistentLocale permet de faire persister la locale dans les URL.

    Si tu souhaites initialiser la locale de ta requête en cours, tu dois utiliser le service LocalizationSetter et gérer toi même la locale. Si j'ai bien compris tu aimerais la persister en session.

    Voici la démarche.

    Dans ta classe Module, contribue un RequestFilter qui se chargera de réinitialiser la locale pour la thread courante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void contributeComponentRequestHandler(OrderedConfiguration<ComponentRequestFilter> configuration)
        {
            configuration.addInstance("malocale", LocaleRequestFilter.class);
        }
    Ta classe LocaleRequestFilter ressemblera à ca :

    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
    public class LocaleRequestFilter implements ComponentRequestFilter
    {
     
        private final RequestGlobals request;
        private final LocalizationSetter ls;
     
        public LocaleRequestFilter(RequestGlobals request, LocalizationSetter ls)
        {
            this.request = request;
            this.ls = ls;
        }
     
        public void handleComponentEvent(ComponentEventRequestParameters parameters, ComponentRequestHandler handler) throws IOException
        {
            restoreSession();
            handler.handleComponentEvent(parameters);
        }
     
        public void handlePageRender(PageRenderRequestParameters parameters, ComponentRequestHandler handler) throws IOException
        {
            restoreSession();
            handler.handlePageRender(parameters);
        }
     
        private void restoreSession()
        {
            if (request.getRequest().getSession(true).getAttribute("_locale") != null)
            {
                ls.setNonPeristentLocaleFromLocaleName((String) request.getRequest().getSession(true).getAttribute("_locale"));
            }
        }
    }
    enfin, il ne te reste plus qu'à initialiser ta valeur _locale de la sorte dans ta page :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @Inject
        private RequestGlobals request;
     
    void onActionFromFr()
        {
            request.getRequest().getSession(true).setAttribute("_locale", "fr");
            System.out.println(msg.get("test"));
        }
    Testé en Tapestry 5.2.0.
    Non, Vahid n'est pas mon prénom
    c' est gratuit , aussi

  7. #7
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut
    Bonjour et merci pour la réponse.
    Mais déjà sur la première ligne il y a une ereur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    configuration.addInstance("malocale", LocaleRequestFilter.class);
    car la méthode accepte 3 paramètres et non pas 2.

    T5 API:
    addInstance

    void addInstance(String id,
    Class<? extends T> clazz,
    String... constraints)

    Adds an ordered object by instantiating (with dependencies) the indicated class. When the configuration type is an interface and the class to be contributed is a local file, then a reloadable proxy for the class will be created and contributed.

    Parameters:
    id - of contribution (used for ordering)
    clazz - class to instantiate
    constraints - used to order the object relative to other contributed objects
    Since:
    5.1.0.0
    En plus, dans la méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void onActionFromFr()
        {
            request.getRequest().getSession(true).setAttribute("_locale", "fr");
            System.out.println(msg.get("test"));
        }
    la variable 'msg' n'est définie, elle vient d'où, stp? Que signifie le paramètre 'test' ?

  8. #8
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut
    En fait, j'ai découvert que dans l'appli actuelle, on a fait appel à URLRewriterRule et SimpleRequestWrapper pour réécrire les urls.
    je crois que c'est la technique décrite ici: http://tapestry.apache.org/url-rewriting.html qui est utilisée.
    Je ne sais pas si ça pourrait aider à trouver une bonne solution pour implémenter l'internationalisation et possibilité de 'switcher' la locale. Merci d'avance.

  9. #9
    Membre actif
    Avatar de vahid
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 228
    Points : 276
    Points
    276
    Par défaut
    Salut,

    As-tu testé ?
    Ou es tu bloqué ?

    La configuration que je t'ai donné fonctionne, à toi de l'adapter si quelques changements sont nécessaires en 5.1

    Pour info, msg est relatif à une variable @Inject Messages msg qui m'a permis de valider le code.
    Non, Vahid n'est pas mon prénom
    c' est gratuit , aussi

  10. #10
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut
    Bon, j'ai tésté ton code sur une nouvelle appli 'celebrity collector' décrite dans le tuto de Tapestry http://tapestry.apache.org/tapestry-tutorial.html.
    La version de tapestry utilisée: 5.2.4.
    Voici ce que j'ai du mettre en commentaire dans AppModule:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     public void contributeRequestHandler(OrderedConfiguration<ComponentRequestFilter> configuration/*, @Local RequestFilter filter*/) {
    	// Each contribution to an ordered configuration has a name, When
    	// necessary, you may
    	// set constraints to precisely control the invocation order of the
    	// contributed filter
    	// within the pipeline.
     
    	//configuration.add("Timing", filter);
    	configuration.addInstance("malocale", LocaleRequestFilter.class);
        }
    pour virer les erreurs de compile dans Eclipse.
    Avant cette modif j'avais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     public void contributeRequestHandler(OrderedConfiguration<RequestFilter> configuration, @Local RequestFilter filter) {
     
    configuration.add("Timing", filter);
    Je run Jetty et obtiens cette erreur:
    Problem accessing /celebrity-collector/. Reason:

    Exception constructing service 'RequestHandler': Error invoking service builder method org.apache.tapestry5.services.TapestryModule.buildRequestHandler(Logger, List, Dispatcher) (at TapestryModule.java:1490) (for service 'RequestHandler'): Error invoking service contribution method com.celebrities.services.AppModule.contributeRequestHandler(OrderedConfiguration): java.lang.NullPointerException

    Caused by:

    java.lang.RuntimeException: Exception constructing service 'RequestHandler': Error invoking service builder method org.apache.tapestry5.services.TapestryModule.buildRequestHandler(Logger, List, Dispatcher) (at TapestryModule.java:1490) (for service 'RequestHandler'): Error invoking service contribution method com.celebrities.services.AppModule.contributeRequestHandler(OrderedConfiguration): java.lang.NullPointerException
    at org.apache.tapestry5.ioc.internal.services.JustInTimeObjectCreator.obtainObjectFromCreator(JustInTimeObjectCreator.java:78)
    at org.apache.tapestry5.ioc.internal.services.JustInTimeObjectCreator.createObject(JustInTimeObjectCreator.java:57)
    at $RequestHandler_134a841dd80.delegate($RequestHandler_134a841dd80.java)
    at $RequestHandler_134a841dd80.service($RequestHandler_134a841dd80.java)
    at org.apache.tapestry5.services.TapestryModule$HttpServletRequestHandlerTerminator.service(TapestryModule.java:272)
    at org.apache.tapestry5.internal.gzip.GZipFilter.service(GZipFilter.java:53)
    at $HttpServletRequestHandler_134a841dd82.service($HttpServletRequestHandler_134a841dd82.java)
    at org.apache.tapestry5.internal.services.IgnoredPathsFilter.service(IgnoredPathsFilter.java:62)
    at $HttpServletRequestFilter_134a841dd7f.service($HttpServletRequestFilter_134a841dd7f.java)
    at $HttpServletRequestHandler_134a841dd82.service($HttpServletRequestHandler_134a841dd82.java)
    at org.apache.tapestry5.services.TapestryModule$2.service(TapestryModule.java:928)
    at $HttpServletRequestHandler_134a841dd82.service($HttpServletRequestHandler_134a841dd82.java)
    at $HttpServletRequestHandler_134a841dd7d.service($HttpServletRequestHandler_134a841dd7d.java)
    at org.apache.tapestry5.TapestryFilter.doFilter(TapestryFilter.java:147)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1148)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:387)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:417)
    at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
    at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:324)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:535)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:865)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:539)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:520)
    Caused by: java.lang.RuntimeException: Error invoking service builder method org.apache.tapestry5.services.TapestryModule.buildRequestHandler(Logger, List, Dispatcher) (at TapestryModule.java:1490) (for service 'RequestHandler'): Error invoking service contribution method com.celebrities.services.AppModule.contributeRequestHandler(OrderedConfiguration): java.lang.NullPointerException
    at org.apache.tapestry5.ioc.internal.ServiceBuilderMethodInvoker.createObject(ServiceBuilderMethodInvoker.java:76)
    at org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator$1.invoke(OperationTrackingObjectCreator.java:45)
    at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:65)
    at org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:68)
    at org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1063)
    at org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator.createObject(OperationTrackingObjectCreator.java:49)
    at org.apache.tapestry5.ioc.internal.SingletonServiceLifecycle.createService(SingletonServiceLifecycle.java:29)
    at org.apache.tapestry5.ioc.internal.LifecycleWrappedServiceCreator.createObject(LifecycleWrappedServiceCreator.java:46)
    at org.apache.tapestry5.ioc.internal.AdvisorStackBuilder.createObject(AdvisorStackBuilder.java:60)
    at org.apache.tapestry5.ioc.internal.InterceptorStackBuilder.createObject(InterceptorStackBuilder.java:52)
    at org.apache.tapestry5.ioc.internal.RecursiveServiceCreationCheckWrapper.createObject(RecursiveServiceCreationCheckWrapper.java:60)
    at org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator$1.invoke(OperationTrackingObjectCreator.java:45)
    at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:65)
    at org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:68)
    at org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1063)
    at org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator.createObject(OperationTrackingObjectCreator.java:49)
    at org.apache.tapestry5.ioc.internal.services.JustInTimeObjectCreator.obtainObjectFromCreator(JustInTimeObjectCreator.java:68)
    ... 30 more

  11. #11
    Membre actif
    Avatar de vahid
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 228
    Points : 276
    Points
    276
    Par défaut
    tu dois contribuer à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    contributeComponentRequestHandler
    et non à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    contributeRequestHandler
    Non, Vahid n'est pas mon prénom
    c' est gratuit , aussi

  12. #12
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut
    Oups, je ne l'ai pas vu .
    MERCI BEAUCOUP, ça fonctionne à merveille

  13. #13
    Membre actif
    Avatar de vahid
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 228
    Points : 276
    Points
    276
    Par défaut
    Pour information, cette fonctionnalité est intégrée dans la librairie exanpe-t5-lib depuis la version 1.2.0.

    http://exanpe.github.com/exanpe-t5-lib/
    Non, Vahid n'est pas mon prénom
    c' est gratuit , aussi

  14. #14
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut
    Encore merci pour l'info, jamais entendu parler de cette librairie. Pourtant, il est marqué sur leur site:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    The library is fully integrated with Maven 2 and validated with Tapestry 5.2.0, 5.2.6 and 5.3.1.
    Actuellement je suis sur 5.1.*, donc ce sera pour les prochains projets s'il en a encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Obtenir l'URL d'un WSDL contenu en local dans le projet Eclipse
    Par thomas_31 dans le forum Services Web
    Réponses: 0
    Dernier message: 14/06/2015, 11h30
  2. [PHP 5.2] Supprimer valeur GET dans Url
    Par Invité dans le forum Langage
    Réponses: 7
    Dernier message: 15/04/2011, 14h58
  3. Supprimer "Localization" dans une Form
    Par Enyths dans le forum VB.NET
    Réponses: 2
    Dernier message: 04/06/2010, 14h06
  4. supprimer une table dans une base de donnée locale (sdf)
    Par vinowan dans le forum Windows Forms
    Réponses: 0
    Dernier message: 17/03/2009, 10h29
  5. [VB6] Supprimer un enregistrement dans une ListView ??
    Par Argonz dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/11/2002, 09h37

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