2009-05-30 26 views
9

Tengo múltiples puntos de entrada en el mismo módulo.Problema con múltiples puntos de entrada en el mismo módulo

Por ejemplo, tengo un punto de entrada Inicio para la página de inicio y un punto de entrada Admin para la página de administración.

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

La manera en que yo soy configuración ahora - Tengo que comprobar SOMT como este en mi onModuleLoad:

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

el fin del el Punto de entrada de administración no se ejecuta cuando la página de inicio obtiene abierta Y a la inversa.

No hacer la comprobación anterior también implica que si tengo un div con el mismo nombre tanto en la página de inicio de administración y lo que yo estoy inyectando en de que aparezca dos veces en cada uno de ellos.

Esto huele a 1000 millas de distancia y obviamente está mal: ¿cuál es la forma correcta de para hacer esto en la experiencia de las personas?

Cualquier ayuda apreciada!

Respuesta

8

La forma correcta es tener un único punto de entrada por módulo, que se pega a los reproductores adecuados en los divs apropiadas:

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

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

De esta manera sólo se escanea la página en busca de algún DIV que tiene e inserta el widget apropiado Así que su página HTML determina qué widgets se muestran cuando y el código GWT está listo para manejar cualquier situación. No hay nada de lo anterior que huele mal, es la forma en que debe escribirse su punto de entrada.

La alternativa es si su área de administración y normalmente su área son totalmente diferentes (por ejemplo, si desea cargarlas en momentos distintos) entonces deberían ser módulos separados, con puntos de entrada separados.

+0

En mi caso, la página de inicio y la página de administración deben cargarse en diferentes momentos (¡son páginas diferentes!), por lo que incluso con un solo punto de entrada no encontraría los divs y arrojaría una excepción. En el otro extremo, lo que no está claro sobre el uso de diferentes módulos es cómo configurar cuál debe iniciarse con qué página. – JohnIdol

+1

¿Por qué no encontraría los divs? Te das cuenta de que puedes poner la importación de javascript para GWT en tantas páginas como quieras. Así que lo pondrías en tu página de administración y tendrías el administrador div más abajo en la página. Luego también lo pondría en la página normal y tendría el div normal más abajo en la página. Si tiene múltiples módulos, simplemente incluye la importación de javascript para el módulo que desea en la página que desea, de hecho es bastante simple. – rustyshelf

+0

Esta es una buena solución. – Feargal

1

No considere Admin y la página de inicio como páginas diferentes. El concepto de páginas no es aplicable a GWT, ya que solo hay una página, es decir, un solo punto de entrada. Si desea dar efecto a diferentes páginas, utilice las funciones de reescritura de URL de GWT.

Si desea utilizar diferentes puntos de entrada, como se dijo en el comentario anterior, use diferentes módulos.

+0

Gracias. No estoy muy familiarizado con la reescritura de URL (¿podría proporcionar algunos enlaces?). ¿Cuál es el mejor enfoque de todos modos entre este y varios módulos? En un escenario como el que describes, ¿por qué es posible en primer lugar definir puntos de entrada múltiples? ¿Estás diciendo que nunca se deben usar múltiples puntos de entrada en el mismo módulo? – JohnIdol

+0

Hola John, Para la reescritura de URL, te sugiero que revises todo el material relacionado con la historia en GWT. Múltiples puntos de entrada para cosas basadas en módulos: muchas veces, especialmente para aplicaciones empresariales, es posible que desee implementar un conjunto de módulos y no implementar otro conjunto de módulos en función de lo que haya comprado un cliente. Ese es el concepto básico de módulo. Cada módulo, al tener un punto de entrada separado, es una unidad de aplicación que se puede implementar por separado. Múltiples puntos de entrada en un solo módulo, no tiene sentido para mí desde una perspectiva técnica y comercial. – sbidwai

1

Por lo general, es mejor tener solo un EntryPoint. Múltiples EntryPoints en un módulo, todos comienzan al mismo tiempo y eso a veces puede hacer cosas que usted no esperaba.

Tiene muchas opciones en cómo manejarlo por separado: - Tiene 2 compilaciones diferentes una para Admin y una para la aplicación Home. - Utilice los tokens de historial para indicar que desea Admin o Inicio - Compruebe una variable JS para mostrar uno u otro - Compruebe la presencia de un ID de DIV específico para mostrar Admin o Inicio (RootPanel.get (id)) - Use los parámetros de URL para indicar la aplicación. - ... etc

+0

Su comentario sobre múltiples puntos de entrada, todos empezando al mismo tiempo, es lo que estoy experimentando cuando intento empaquetar una aplicación base y ampliarla. Gracias por confirmar mis sospechas sobre por qué el punto de entrada podría ser llamado varias veces. – Stevko

0

Tengo una solución para esto en mi blog. Puede descargar un proyecto de maven de muestra que tiene múltiples puntos de entrada y usa reescritura de url.Echar un vistazo: http://zenoconsulting.wikidot.com/blog:16

4

También quería utilizar varias páginas en una aplicación GWT juguete y creo que lo he descubierto. Me tomó un poco de masaje del descriptor de implementación (myApp.gwt.xml), pero esto es lo que hice.

  • Realicé otra clase implementando EntryPoint y añadí algunos códigos que se agregaron a un div solo en la página nueva.
  • copiado el gwt.xml original y cambiado dos cosas:
    • El módulo de cambiar el nombre a - He cambiado a "anothergwtapp"
    • El punto de entrada especifica la nueva clase.
  • Cuando compilo el proyecto, hay otro directorio en la carpeta "war" llamado (wait it it ...) "anothergwtapp". Contenía el "anothergwtapp.nocache.js" que es la magia de GWT.
  • Finalmente, copié la página HTML original y reemplacé el "stockwatcher/stockwatcher.nocache.js" con "anothergwtapp/anothergwtapp.nocache.js" (sí, soy muy nuevo, el tutorial aún está en mi máquina)
    • He cambiado el nuevo HTML para que sea un poco diferente (nuevos divs para la carga del nuevo punto de entrada para rellenar) y agregué un href simple a la nueva página en la primera página.

Funcionó. Simplemente duplique el gwt.xml y proporcione un nuevo nombre para que el módulo vaya junto con la nueva página de la aplicación. Miré algunos de los otros enlaces y pude haber hecho lo que se describió, pero hubo demasiadas palabras y redirecciones y tal (es decir, realmente no leí nada). Estoy usando el último complemento de GWT para Galileo, así que tal vez IJW ahora.

+0

¡He estado buscando esto! Gracias. – McTrafik

1

Hay una manera sencilla (complicado) para lograr esto:

hacer una clase principal de su punto de entrada.

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

crear este Main.java para trabajar como un despachador:

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

Ahora las diferentes clases de aplicaciones, administración e instalar funcionan como unidades separadas.

Aquí es por ejemplo un simple Instalar:

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

No es necesario el material Singleton (getInstance), pero es muy útil en grandes aplicaciones.

ahora en la guerra-directorio/crear directorios llamados instalar y de administración y en muy de ellos crear una página HTML como esto:

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

Así que cuando el usuario dirige su Brower a http://www.example.com/install que será redirigido a http://www.example.com/index?install y index.html está vinculado a Main.java que enviará la solicitud y cargará Install.java

Cuestiones relacionadas