2010-11-20 11 views
2

J'ai besoin de savoir (en utilisant GWT) la stratégie de chargement d'une classe plutôt que d'autres en fonction de la valeur HTTP GET.GWT - Comment obtenir une valeur et décider quelle page charger

Exemple:

// Main.gwt.xml 
<?xml version="1.0" encoding="UTF-8"?> 

<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 1.7.0//EN" "http://google-web-toolkit.googlecode.com/svn/tags/1.7.0/distro-source/core/src/gwt-module.dtd"> 

<module> 
    <inherits name="com.google.gwt.user.User"/> 
    <entry-point class="org.sinfonet.client.PageLoader"/> 
</module> 

// PageLoader 
package org.sinfonet.client; 

import com.google.gwt.core.client.EntryPoint; 
import com.google.gwt.user.client.ui.FlowPanel; 
import com.google.gwt.user.client.ui.RootPanel; 

public class PageLoader implements EntryPoint { 
    public void onModuleLoad() { 
     FlowPanel pageloader=new FlowPanel(); 
     pageloader.add(new MainHomePage()); 
     RootPanel.get().add(pageloader); 
    } 
} 

Si mon GET est http://localhost:8084/GWT/index.html, je voudrais charger MainHomePage();

Sinon, si mon GET est http://localhost:8084/GWT/index.html?page=2, je voudrais charger MainAnotherClass();

Je dois implémenter ceci sur la classe PageLoader, sur XML, ou où? Je pense sur XML, parce que PageLoader est une classe côté client ... il n'y a aucun moyen de prendre une décision ici.

P.S. Je veux charger une autre page (alias, une autre classe principale), ne pas charger dinamiquement.

EXEMPLE I Tried

Merci à Chris Boesing de solution this, je l'ai trouvé un morceau facile de code qui fais ce que j'ai besoin. Malheureusement, quelque chose ne va pas, car il appelle la méthode .clear(), mais il n'ajoute pas mon nouveau conteneur. C'est le code:

public class PageLoader implements EntryPoint, ValueChangeHandler<String> { 
    private FlowPanel pageloader; 
    private GWTServiceAsync rpcService; 

    public void onModuleLoad() { 
     pageloader=new FlowPanel(); 
     rpcService=GWT.create(GWTService.class); 
     pageloader.add(new HomepageContext(rpcService)); 
     RootPanel.get().add(pageloader); 

     History.addValueChangeHandler(this); 
     if(!History.getToken().isEmpty()){ 
      changePage(History.getToken()); 
     } 
    } 

    public void onValueChange(ValueChangeEvent event) { 
     changePage(History.getToken()); 
    } 

    public void changePage(String token) { 
     if(History.getToken().equals("apartment")) { 
      pageloader.clear(); 
      pageloader.add(new ApartmentContext(rpcService)); 
     } else { 
      pageloader.clear(); 
      pageloader.add(new HomepageContext(rpcService)); 
     } 
    }  
} 

Qu'est-ce qui ne va pas?

+0

Je crois que le conteneur de servlet est le programme qui choisit quelle page charger en fonction de l'URL. Je ne sais même pas si c'est possible mais cela dépend du serveur que vous utilisez? utilisez-vous Tomcat? GAE? JBoss? – Pace

+0

Tomcat :) Mais quel est le servlet principal dans GWT? Je pense que je ne peux pas le gérer directement avec GWT, ou peut-être je ne sais pas ... – markzzz

Répondre

2

Pour ce faire, vous devez d'abord ajouter une servlet (au lieu de la page html statique) pour servir votre application gwt.

La première étape pourrait être simplement d'ajouter une servlet qui retourne la page html statique actuelle avec gwt iframe. Vous devez également modifier votre fichier web.xml bien sûr.

La deuxième étape consiste à modifier le code HTML retourné en fonction de l'URL pour afficher un module gwt ou l'autre. C'est la seule solution si vous voulez montrer 2 applications gwt différentes (alias modules) selon l'url.

De toute façon, si j'ai compris votre question, ce que vous voulez faire est juste montrer des données différentes en utilisant l'URL, pour cela je recommande une autre solution: utiliser le signe #.

Il est très facile avec GWT d'afficher différentes pages (à l'intérieur d'un même module GWT) avec cette syntaxe. http://localhost:8084/GWT/index.html http: // localhost: 8084/GWT/index.html # page = 2 http://localhost:8084/GWT/index.html#searchFor=foo etc.

Recherchez les événements et l'histoire dans la documentation GWT. Ce est aussi un très bon point de départ pour avoir RESTish urls:. http://code.google.com/webtoolkit/articles/mvp-architecture.html

+0

Uhm ... je ne sais pas si j'ai bien compris que les articles ... mais je ne pense pas que ce soit ce dont j'ai besoin! J'ai besoin de charger une nouvelle "page" quand je reçois la valeur du GET (ne charge pas la classe des autres au lieu de ce que j'ai). Je pense que c'est possible dans GWT, non? En fait, je voudrais "changer" le contexte, comme la page swith dans l'ancienne approche de l'application Web (charger apartment.php au lieu de index.php, savez-vous ce que je veux dire?). Mais je dois y penser, car peut-être sur GWT est préférable d'utiliser sa propre méthodologie :) – markzzz

+0

Dans gwt il n'y a pas de "page", techniquement toute l'application gwt est une seule page, donc ajouter une autre page cela signifie ajouter une autre application gwt (un module avec un point d'entrée différent). C'est ce que j'ai spécifié dans la première partie de la réponse. – Uberto

+1

Je pense que vous voulez seulement changer la page actuelle, sans vraiment le quitter. Pour ce faire, il suffit de travailler dans la page DOM. private void loadWelcomeView() { Étiquette finale welcomeMsg = new Étiquette ("welcome"); welcomeMsg.addStyleName ("welcomeMsg"); RootPanel.get(). Clear(); RootPanel.get(). Add (welcomeMsg); Par exemple, ce code supprimera tout ce qui se trouvait sur la page et le remplacera par l'étiquette. Vous devez appeler cette méthode lorsque l'utilisateur clique sur un bouton ou insère une URL (regardez l'historique et les événements de GWT) – Uberto

3

je pense que vous aurez envie de mettre en œuvre un ValueChangeHandler < String>, et travailler avec l'histoire (History.addValueChangeHandler (changeHandler)

Ensuite, sur votre implémentation valuechangehandler, vous pouvez obtenir le jeton demandé et choisir la vue à afficher.

J'espère que cela aide :)

+0

Oui. En fait, cela rend ma journée http://developerlife.com/tutorials/?p=232 :) – markzzz

+0

Uhm .. cette approche n'est pas si claire pour moi. Donc, j'ai ajouté un exemple, peut-être que vous pouvez m'aider, si vous avez du temps et patient :) merci pour votre effort! – markzzz

+0

résolu! Merci quand même :) – markzzz