2011-12-05 14 views
15

Sto sviluppando un'applicazione GWT che genera rapporti per il download. Quando lancio in Eclipse ha un URL simile a questo:URL di base per un'app GWT

http://127.0.0.1:8888/MyApp.html

Ma quando Che tipo di imballaggio mia app per la distribuzione in un server web (ad esempio Tomcat) mio URL è simile a questo:

http://localhost:8080/MyApp/MyApp.html

C'è un modo per ottenere l'URL di base dell'app? Come http://localhost:8080/MyApp/ nel secondo caso?

+0

Cosa fate voi significa "ottieni l'URL di base dell'app"? All'interno del tuo servlet o sul lato client? – Vladimir

risposta

2

Il metodo doPost su RemoteServiceServlet viene passato il HttpServletRequest inviato dal client. HttpServletRequest ha un numero di metodi disponibili che possono costruire l'URL di base della richiesta del cliente. HttpServletRequest.getRequestURL() recupera l'intero URL dalla richiesta. Se si desidera semplicemente l'URL di base senza il nome della pagina, è possibile utilizzare una combinazione di getRemoteHost, getRemotePort e getServletPath.

Esempio:

doPost(request, response){ 
    String baseURL = new StringBuilder(); 
    baseURL.append(request.getRemoteHost()); 
    baseURL.append(":"); 
    baseURL.append(request.getRemotePort()); 
    baseURL.append(request.getServletPath()); 
} 
5

Per il lato client è possibile utilizzare Window.Location

Ad esempio:

public static String getUrlString(String path) { 
    UrlBuilder urlBuilder = new UrlBuilder(); 
    urlBuilder.setHost(Window.Location.getHost()); 
    urlBuilder.setPath(path); 

    String port = Window.Location.getPort(); 
    if (!port.isEmpty()) 
     urlBuilder.setPort(Integer.parseInt(port)); 

    return urlBuilder.buildString(); 
} 

Un altro approccio è quello di utilizzare GWT Dictonary. Qui si include un frammento di JavaScript nella pagina HTML host per impostare il valore:

<script type="text/javascript" language="javascript"> 
    var location = { baseUrl: "http://localhost:8080/myapp" }; 
</script> 

Poi caricare il valore nel lato client con GWT Dizionario:

Dictionary theme = Dictionary.getDictionary("location"); 
    String baseUrl = theme.get("baseUrl"); 

Per utilizzare questo sarebbe necessario cambia la pagina host HTML per le istanze locali e di produzione.

+0

Questo è un approccio interessante. Ma funziona solo sul client, giusto? –

+0

Sì, utilizzando Window.Location funziona solo sul lato client. Ho aggiornato la mia risposta per includere anche un altro approccio. –

+0

Niente lato server completo? GWT fa davvero schifo. –

0

ho il sospetto che questo un Tomcat, non un problema di GWT. Prova a rinominare il file WAR dell'applicazione pacchettizzata su ROOT.war e inseriscilo nella cartella webapps di Tomcat. In genere Tomcat considera un'applicazione simile a quella da distribuire nel contesto di root (ad esempio, otterrete l'accesso /MyApp.html).

17

lato client:

GWT.getHostPageBaseURL(); 

o

GWT.getModuleBaseURL(); 

lato server è possibile ottenere l'URL di qualsiasi servlet dal HttpServletRequest utilizzando questo metodo semplice:

public static String getBaseUrl(HttpServletRequest request) { 
    if ((request.getServerPort() == 80) || 
     (request.getServerPort() == 443)) { 
     return request.getScheme() + "://" + 
      request.getServerName() + 
      request.getContextPath(); 
    } else { 
     return request.getScheme() + "://" + 
      request.getServerName() + ":" + request.getServerPort() + 
      request.getContextPath(); 
    } 
} 
+0

Ciao, grazie per la risposta, Ricevo tomcat UnsatisfiedLinkError su GWT.getModuleBaseUrl() o GWT.getHostPageBaseUrl(). Cosa sto sbagliando? java.lang.UnsatisfiedLinkError: com.google.gwt.core.client.impl.Impl.getModuleBaseURL() Ljava/lang/String; – Ehsan