2009-09-18 13 views
6

Provare a evitare di reinventare la ruota qui. Ho una pagina di Google Web Toolkit che sto preparando per la distribuzione, ma il servizio web con cui sto comunicando avrà un indirizzo relativo diverso sul server distribuito rispetto alla mia macchina di prova locale.Configurazione lato server per GWT

Come tale, sto cercando un modo semplice per implementare con una sorta di file di configurazione facilmente modificabile che posso mettere le impostazioni di base sul lato server. Ho un paio di idee su come farlo, ma sembrano un po 'hacky e mi sembra che ci sia già una soluzione per questo tipo di problemi (dopo tutto, le impostazioni per server sono una cosa MOLTO comune!)

Qualche idea?

Edit: Dal momento che questo non sembra essere attirare molta attenzione, mi permetta di delineare i miei pensieri iniziali: Conservare un file statico locale per i file GWT che ho query con una chiamata AJAX prima di qualsiasi altra logica. Quando il file viene restituito, analizzo i miei dati e li memorizzo come vars accessibili a livello globale, quindi consentono l'esecuzione della logica di creazione di pagine. Sembra goffo, e c'è il grande svantaggio di aspettare che l'AJAX ritorni prima del caricamento, ma funzionerebbe. Qualche suggerimento migliore? (Si prega di?)

mia soluzione: ho trovato una soluzione per conto mio, ma è abbastanza specifico per il mio scenario esatto in modo da non so quanto sia utile sarebbe per l'utente generale. Lo posterò qui comunque nella remota possibilità che qualcuno lo trovi utile.

La pagina su cui sto lavorando è in realtà un controllo GWT incorporato in un sito ASP.net. Approfittando di questo, e della mia scoperta della classe Dizionario GWT, ho messo insieme un sistema "impostazioni" come questo:

Innanzitutto, l'impostazione che voglio (in questo caso un indirizzo per un servizio web) è impostata nell'ASP .net file di

<appSettings> 
    <add key="serviceUrl" value="http://mySite.com/myService.asmx"/> 
</appSettings> 

web.config nella pagina ASP che è incorporare il controllo di GWT, aggiungo una "statica" javascript oggetto che contiene le impostazioni di configurazione che ho bisogno:

<head runat="server"> 
    <title>Picklist Manager</title> 

    <script type="text/javascript" language="javascript"> 
     var AppConfig = { 
      serviceUrl: "<%= ConfigurationManager.AppSettings["serviceUrl"] %>" 
     }; 
    </script> 
    <script type="text/javascript" language="javascript" src="gwtcontrol.nocache.js"></script> <!-- Include my GWT control --> 
</head> 

Infine, in GWT Creo una classe "AppConfig" statica che espone questa impostazione in questo modo:

public class AppConfig { 
    public static String serviceUrl = "defaultUrl"; 

    public static void Initialize() { 
     Dictionary appConfig = Dictionary.getDictionary("AppConfig"); 
     if(appConfig == null) { return; } 

     servicePath = appConfig.get("serviceUrl"); 
    } 
} 

Da lì posso chiamare AppConfig.serviceUrl ovunque nel mio codice per ottenere l'impostazione ... wow! Quindi sì, questo è un modo lungo e complicato per farlo, ma funziona per me. Tra le risposte date, quella di Alexander sembra più in linea con quello che stavo cercando, quindi la taglia va a lui, ma grazie a tutti quelli che hanno lanciato il mio piccolo problema appiccicoso!

risposta

5

Sentiti libero di correggermi, ma non sembra che tu richieda la configurazione del lato server in fase di esecuzione. Nel caso in cui tu abbia davvero bisogno di quella flessibilità o tu voglia usare un singolo .zip per tutte le implementazioni potresti usare la tecnica data in Yahoo's Performance Rules - (vedi la sezione 'Aggiungi un Expires o un'intestazione di Cache-Control)' - il futuro scadrà le intestazioni . Ciò significa che la richiesta AJAX verrà memorizzata nella cache pesantemente dal browser e causerà solo un lieve rallentamento della prima richiesta.

Anziché farlo, in realtà suggerisco di utilizzare i flag di compilazione e il sistema di proprietà offerto da GWT. Per semplificare questo ho creato un piccolo pacchetto chiamato auto-config available on github. L'utilizzo di questo rende molto semplice l'accesso per configurazione di distribuzione. Aggiungere la seguente classe:

public interface MyConfiguration extends AutoConfiguration { 
    public String getFoobar(); 
} 

per accedere al valore dal codice GWT aggiungere questo semplice aiutante:

private MyConfiguration getMyConfiguration() { 
    return (MyConfiguration) GWT.create(MyConfiguration.class); 
} 

creare diversi file .gwt.xml diverse, una per ogni server di distribuzione. Quindi ridurre al minimo qualsiasi duplicazione utilizzando un file genitore .gwt.xml. Per ulteriori informazioni su questo argomento leggere CompileOnePermutation on the GWT Wiki

In sintesi, aggiungere il seguente frammento al vostro per-distribuzione di (e assicurarsi di aggiungere la riga eredita necessario) .gwt.xml:

<set-configuration-property name="foobar" value="whee1234" /> 

speranza di avere aiutato :)

+0

Il tuo secondo link funzionava :) Penso che il primo sia semplicemente formattato divertente, ma ottiene il risultato. Vedrò questo metodo ... – Toji

+0

Wow ... questo è un esempio abbastanza complicato. Non sono sicuro di quale parte dovrei guardare. Ho capito che PropertyOracle è qualcosa che ottengo attraverso un generatore, ma cosa fa il generatore per me, e come lo userei? Normalmente sono abbastanza bravo a leggere queste cose, ma mi sento come se mi mancasse molto contesto in questo caso. :( – Toji

+0

Ho bisogno di questo comunque per un progetto, quindi lo scaverò subito. –

1

Il modo più semplice sembra archiviare queste informazioni di configurazione da qualche parte accessibile al codice server, ad esempio le vostre classi ServiceImpl.

Si dispone di più opzioni per questo, in genere:

  • impostare una variabile d'ambiente;
  • imposta una proprietà di sistema;
  • inserire un file di proprietà nel classpath;
  • cercare un bean JNDI.
1

Sono un po 'confuso su quello che stai chiedendo.

Se ciò che si desidera è compilare una sola volta ed eseguire l'app GWT su server diversi con opzioni diverse e utilizzare le opzioni sul lato client durante la costruzione della GUI, ci sono un sacco di opzioni.

ottenere le informazioni nel vostro programma utilizzando:

  • Ambiente variabile
  • proprietà Sistema
  • Etc

Ottenere le informazioni al vostro lato client:

  • Chiamata AJAX al file (come specificato)
  • Serve la tua GUI da un JSP invece di un HTML statico. Chiedi al JSP di incorporare le informazioni in una variabile JS, a cui la GUI può accedere utilizzando una chiamata JSNI. Questo ti risparmia un viaggio di andata e ritorno.