2009-05-30 5 views
9

J'ai plusieurs points d'entrée dans le même module.Problème avec plusieurs points d'entrée dans le même module

Par exemple, j'ai un point d'entrée Accueil pour la page d'accueil et un point d'entrée Admin pour la page d'administration.

<entry-point class='com.company.project.client.HomeModule'/> 
<entry-point class='com.company.project.client.AdminModule'/> 

La façon dont je suis maintenant configuré - Je dois vérifier SOMT comme ça dans mon onModuleLoad:

if((RootPanel.get("someHomeWidget")!=null)&& 
    (RootPanel.get("someOtherHomeWidget")!=null)) 
{ 
    // do the stuff 
} 

pour le Admin Entrypoint ne pas être exécuté lorsque la maison page est ouverte et l'inverse. Ne pas faire la vérification ci-dessus implique également que si j'ai un div avec le même nom dans la page d'accueil et d'administration que ce que j'injecte dans il apparaît deux fois sur chacun d'eux.

Cela pue 1000 miles de distance et est évidemment faux: quelle est la bonne façon de faire cela dans l'expérience des gens ?

Toute aide appréciée!

Répondre

8

La bonne façon est d'avoir un point d'entrée unique par module, qui colle les widgets appropriés dans les divs appropriés:

RootPanel panel = RootPanel.get("someHomeWidget"); 
if (panel) panel.add(new HomeWidget()); 

panel = RootPanel.get("adminWidget"); 
if (panel) panel.add(new AdminWidget()); 

De cette façon juste scanne la page à la recherche de tous les divs que vous avez et insère la widget approprié. Ainsi, votre page HTML détermine quels widgets sont affichés lorsque le code GWT est prêt à gérer n'importe quelle situation. Il n'y a rien à propos de ce qui précède qui pue, c'est la façon dont votre point d'entrée devrait être écrit. L'alternative est que si votre zone d'administration et votre zone normale sont totalement différentes (par exemple: vous voulez les charger à des moments différents), alors ils doivent être des modules séparés, avec des points d'entrée séparés.

+0

Dans mon cas, la page d'accueil et la page d'administration doivent être chargées à différents moments (ce sont des pages différentes!) - donc même avec un seul point d'entrée, il ne trouverait pas les divs. D'un autre côté, ce qui n'est pas clair à propos de l'utilisation de différents modules, c'est la façon de configurer lequel devrait fonctionner avec quelle page. – JohnIdol

+1

Pourquoi ne trouverait-il pas les divs? Vous réalisez que vous pouvez mettre l'importation javascript pour GWT sur autant de pages que vous le souhaitez. Donc, vous le mettre sur votre page d'administration et avoir l'administrateur div plus bas sur la page. Ensuite, vous devez également le mettre sur la page normale et avoir la div normale plus bas sur la page. Par contre, si vous avez plusieurs modules, il vous suffit d'inclure l'importation javascript pour le module que vous voulez sur la page que vous voulez, c'est plutôt simple. – rustyshelf

+0

C'est une bonne solution. – Feargal

1

Ne pas considérer l'Admin et la page d'accueil comme des pages différentes. Le concept de pages ne s'applique pas à GWT, car il n'y a qu'une seule page, c'est-à-dire un seul point d'entrée. Si vous souhaitez appliquer des pages différentes, utilisez les fonctions de réécriture d'URL de GWT.

Si vous voulez utiliser des Entrypoints différents, alors comme indiqué dans le commentaire ci-dessus, utilisez des modules différents.

+0

Merci - Je ne suis pas très familier avec la réécriture d'URL (pourriez-vous fournir des liens?) - quelle est la meilleure approche entre ce module et plusieurs modules? Dans un scénario comme celui que vous décrivez, pourquoi est-il possible en premier lieu de définir plusieurs entrypoints? Êtes-vous en train de dire que plusieurs entrypoints dans un même module ne devraient jamais être utilisés? – JohnIdol

+0

Salut John, Pour la réécriture d'URL, je vous suggère de parcourir toute l'histoire liée à GWT. Points d'entrée multiples pour les objets basés sur un module - Plusieurs fois, en particulier pour les applications d'entreprise, vous pouvez déployer un ensemble de modules et ne pas déployer d'autres ensembles de modules en fonction de ce qu'un client a acheté. C'est le concept de base du module. Chaque module, en ayant un point d'entrée distinct, est une unité d'application déployable séparément. Plusieurs entrypoints dans un seul module, n'a pas de sens pour moi du point de vue technique et commercial. – sbidwai

1

Il est généralement préférable d'avoir un seul EntryPoint. Les EntryPoints multiples dans un module commencent tous en même temps et peuvent parfois faire des choses inattendues.

Vous avez beaucoup d'options dans la façon de le gérer séparément: - Vous disposez de 2 compilations différentes, une pour Admin et une pour l'application Home. - Utilisez les jetons d'historique pour indiquer que vous voulez Admin ou Domicile - Vérifiez une variable JS pour afficher l'un ou l'autre - Vérifiez la présence d'un ID DIV spécifique pour afficher Admin ou Accueil (RootPanel.get (id)) - Utilisez les paramètres d'URL pour indiquer l'application. - ... etc

+0

Votre commentaire à propos de plusieurs points d'entrée commençant tous à la même heure est ce que je ressens lorsque j'essaie d'empaqueter une application de base et de l'étendre. Merci de confirmer mes soupçons sur les raisons pour lesquelles l'entrypoint pourrait être appelé plusieurs fois. – Stevko

0

J'ai une solution pour cela sur mon blog. Vous pouvez télécharger un exemple de projet maven comportant plusieurs points d'entrée et utilisant la réécriture d'URL.Jetez un coup d'oeil: http://zenoconsulting.wikidot.com/blog:16

4

Je voulais également utiliser plusieurs pages dans une application de jouet GWT et je pense que je l'ai compris. Il a fallu masser le descripteur de déploiement (myApp.gwt.xml), mais voici ce que j'ai fait.

  • Fait une autre classe implémentant EntryPoint et ajouté du code ajouté à un div seulement dans la nouvelle page.
  • copia les gwt.xml original et changé deux choses:
    • Le module renommer à - j'ai changé pour « anothergwtapp »
    • Le point d'entrée spécifié la nouvelle classe. Lorsque je compile le projet, il y a un autre répertoire dans le dossier "war" appelé (attendez-le ...) "anothergwtapp". Il contenait le "anothergwtapp.nocache.js" qui est la magie de GWT.
    • Enfin, j'ai copié la page HTML originale et remplacé le "stockwatcher/stockwatcher.nocache.js" par "anothergwtapp/anothergwtapp.nocache.js" (oui, je suis très nouveau - le tutoriel est toujours sur ma machine) J'ai changé le nouveau HTML pour être un peu différent (nouveaux divs pour l'ongle du nouveau point d'entrée à remplir) et j'ai ajouté un simple href à la nouvelle page dans la première page.

Il a travaillé. Il suffit de dupliquer le fichier gwt.xml et de fournir un nouveau nom pour que le module corresponde à la nouvelle page de l'application. J'ai regardé quelques-uns des autres liens et j'ai peut-être fait ce qui était décrit, mais il y avait trop de mots et de redirections et autres (c'est-à-dire que je n'ai pas vraiment lu quelque chose). J'utilise le dernier plugin GWT pour Galileo, donc peut-être des IJWs maintenant.

+0

J'ai cherché ça! Je vous remercie. – McTrafik

1

Il est un moyen simple (difficile) pour y parvenir:

Faire une classe principale Votre point d'entrée.

<module rename-to='gwt'> 
    <inherits name='com.google.gwt.user.User'/> 
    <entry-point class='com.example.client.Main'/> 
    <source path='client'/> 
    <source path='shared'/> 
</module>;<br/> 

Créer cette Main.java pour fonctionner comme un répartiteur:

package com.example.client; 

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

public class Main implements EntryPoint { 

    public void onModuleLoad() { 

    String url = Window.Location.getHref(); 
    if (url.indexOf("?install")>-1) { 
     Install install = Install.getInstance(); 
     RootPanel.get().add(install);  
    else if (url.indexOf("?admin")>-1) { 
     Admin admin = Admin.getInstance(); 
     RootPanel.get().add(admin);  
    } else { 
     Application app = Application.getInstance(); 
     RootPanel.get().add(app);  
    } 
    } 
} 

Maintenant les différentes classes d'application, Admin et installons fonctionnent comme des unités séparées.

Voici par exemple une installation simple:

package comexample.client; 

import com.google.gwt.user.client.ui.FlowPanel; 
import com.google.gwt.user.client.ui.HTML; 

public class Install extends FlowPanel { 

    /** Singleton stuff - to access Main from all subclasses! */ 
    private static Install singelton; 
    public static Install getInstance() { 
    if (singelton == null) {singelton = new Install();} 
    return singelton; 
    } 

    /** Constructor - called by Main.onModuleLoad() */ 
    private Install() { 
    this.add(new HTML("<h1>Do whatever You have to do!</h1>")); 
    } 
} 

Vous n'avez pas besoin les choses Singleton (getInstance), mais il est très pratique dans les grandes applications.

maintenant dans le répertoire/guerre répertoire créer des répertoires nommés installer et d'administration et même de les créer une page HTML comme ceci:

<!DOCTYPE html> 
<html> 
<head> 
<meta http-equiv="refresh" content="0; URL=/index.html?install"> 
</head> 
<body></body> 
</html> 

Ainsi, lorsque l'utilisateur dirige son Brower http://www.example.com/install, il sera redirigé vers http://www.example.com/index?install et index.html est lié à Main.java qui va envoyer la demande et charger l'installation.java

Questions connexes