2009-05-30 12 views
9

Ho più punti di accesso nello stesso modulo.Problema con più punti di ingresso nello stesso modulo

Ad esempio, ho un punto di ingresso Home per la home page e un punto di ingresso Admin per la pagina di amministrazione.

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

Il modo in cui sono messa a punto ora - ho bisogno di controllare somt come questo nel mio OnModuleLoad:

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

al fine di non il l'Entrypoint Admin da eseguire quando la pagina iniziale ottiene aperto e viceversa.

non fare la verifica di cui sopra comporta anche che se ho un div con lo stesso nome sia nella home page e Admin qualunque cosa stia iniettando nel si presenta due volte su ciascuno di essi.

Questo puzza a 1000 miglia di distanza ed è ovviamente sbagliato: qual è il modo corretto di fare questo nella gente per esperienza ?

Qualsiasi aiuto apprezzato!

risposta

8

Il modo corretto è quello di avere un unico punto di ingresso per modulo, che attacca i widget appropriati nelle div appropriate:

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

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

In questo modo solo scansione della pagina alla ricerca di eventuali div che avete e inserisce il widget appropriato. Quindi la tua pagina HTML determina quali widget vengono visualizzati quando e il codice GWT è pronto a gestire qualsiasi situazione. Non c'è nulla di quanto sopra che puzza, è il modo in cui il tuo punto di ingresso dovrebbe essere scritto.

L'alternativa è se l'area di amministrazione e l'area normalmente sono completamente diversi (ad esempio: si desidera caricarli in momenti separati), quindi dovrebbero essere moduli separati, con punti di ingresso separati.

+0

Nella mia home page caso e la pagina di amministrazione ha bisogno di essere caricato in tempi diversi (sono diverse pagine!) - quindi anche con un unico punto di ingresso non sarebbe trovare il div e sarebbe un'eccezione. Dall'altra parte, ciò che non è chiaro sull'uso di diversi moduli è come configurare quale deve essere attivato con quale pagina. – JohnIdol

+1

Perché non dovrebbe trovare i div? Ti rendi conto che puoi inserire l'importazione di JavaScript per GWT su tutte le pagine che desideri. Quindi lo inseriresti nella tua pagina di amministrazione e avresti l'amministratore più in basso nella pagina. Poi lo inseriresti anche nella pagina normale e avresti il ​​div normale in fondo alla pagina. Se si hanno più moduli d'altra parte, si include semplicemente l'importazione di javascript per il modulo che si desidera sulla pagina che si desidera, in realtà è piuttosto semplice. – rustyshelf

+0

Questa è una bella soluzione. – Feargal

1

Non considerare Admin e pagina iniziale come pagine diverse. Il concetto di pagine non è applicabile a GWT, in quanto esiste una sola pagina, cioè un singolo punto di accesso. Se si desidera dare l'effetto di pagine diverse, utilizzare le funzioni di riscrittura degli URL di GWT.

Se si desidera utilizzare punti di ingresso diversi, quindi come detto nel commento sopra, utilizzare diversi moduli.

+0

Grazie - Non ho molta familiarità con la riscrittura dell'URL (potresti fornire alcuni collegamenti?) - qual è l'approccio migliore in ogni caso tra questo e più moduli? In uno scenario come quello che descrivi, perché è possibile in primo luogo definire più punti di accesso? Stai dicendo che non si dovrebbero mai usare più punti di accesso nello stesso modulo? – JohnIdol

+0

Ciao John, Per la riscrittura degli URL, vi consiglio di passare attraverso tutta la roba correlati Storia di GWT. Punti di ingresso multipli per elementi basati su moduli: molte volte, in particolare per le applicazioni aziendali, è possibile distribuire set di moduli e non distribuire altri set di moduli in base a ciò che un cliente ha acquistato. Questo è il concetto di base del modulo. Ogni modulo, con un punto di accesso separato, è un'unità di app distribuibile separatamente. Entropunti multipli in un singolo modulo, non ha senso per me dal punto di vista tecnico e commerciale. – sbidwai

1

Di solito è meglio avere solo un EntryPoint. Più Entry Point in un modulo iniziano tutti allo stesso tempo e talvolta possono fare cose che non ti aspetti.

Avete un sacco di opzioni su come gestirlo separatamente: - Avere 2 diverse compilazioni una per Admin e una per l'applicazione Home. - Utilizzare i gettoni di storia per indicare che si desidera Admin o casa - Controllare una variabile JS per mostrare uno o l'altro - Verificare la presenza di uno specifico ID DIV per mostrare Admin o domicilio (RootPanel.get (id)) - Utilizzare i parametri URL per indicare l'applicazione. - ... ecc

+0

Il tuo commento su più punti di accesso che iniziano tutti nello stesso momento è quello che sto sperimentando mentre provo a impacchettare un'applicazione di base e ad estenderla. Grazie per aver confermato i miei sospetti sul motivo per cui il punto di accesso potrebbe essere chiamato più volte. – Stevko

0

Ho una soluzione per questo sul mio blog. È possibile scaricare un progetto maven di esempio con più punti di accesso e utilizza la riscrittura dell'URL.Date un'occhiata: http://zenoconsulting.wikidot.com/blog:16

4

Volevo anche usare più pagine in un'app giocattolo GWT e penso di averlo capito. Ci sono voluti alcuni massages del descrittore di deployment (myApp.gwt.xml), ma ecco cosa ho fatto.

  • fatto un'altra classe che implementa EntryPoint e ha aggiunto un po 'di codice che aggiunto a un div solo nella nuova pagina.
  • copiato le gwt.xml originale e cambiato due cose:
    • Il modulo-rinomina-to - ho cambiato a "anothergwtapp"
    • Il punto di ingresso specificata la nuova classe.
  • Quando compilo il progetto, c'è un'altra cartella nella cartella "war" chiamata (attendi che ...) "anothergwtapp". Conteneva il "anothergwtapp.nocache.js" che è la magia GWT.
  • Infine, ho copiato la pagina HTML originale e sostituito "stockwatcher/stockwatcher.nocache.js" con "anothergwtapp/anothergwtapp.nocache.js" (sì, sono molto nuovo - il tutorial è ancora sul mio computer)
    • Ho modificato il nuovo codice HTML in modo che fosse leggermente diverso (nuovi div per il nuovo caricamento del punto di ingresso da compilare) e ho aggiunto un semplice href alla nuova pagina nella prima pagina.

Ha funzionato. Basta duplicare gwt.xml e fornire un nuovo nome per il modulo per andare insieme alla nuova pagina dell'app. Ho guardato alcuni degli altri link e potrei aver effettivamente fatto ciò che è stato descritto, ma c'erano troppe parole e reindirizzamenti e simili (cioè non ho letto nulla). Sto usando l'ultimo plugin GWT per Galileo quindi forse IJWs ora.

+0

Ho cercato questo! Grazie. – McTrafik

1

C'è un modo (difficile) semplice per raggiungere questo obiettivo:

fare una classe principale tuo punto di ingresso.

<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/> 

creare questa Main.java a lavorare come un dispatcher:

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);  
    } 
    } 
} 

Ora le diverse classi di applicazioni, Admin e Installare opera come unità separate.

Ecco per esempio una semplice installazione:

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>")); 
    } 
} 

Non è necessario la roba Singleton (getInstance), ma è molto utile nelle grandi applicazioni.

Ora, nella/dalla guerra directory creare directory di nome installare e admin e molto di esse creare una pagina HTML come questo:

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

Così, quando l'utente dirige il suo Brower a http://www.example.com/install sarà reindirizzato a http://www.example.com/index?install e index.html è associato a Main.java che invierà la richiesta e caricherà Installa.java

Problemi correlati