2012-02-21 6 views
7

Sto provando a configurare un semplice webservice per la mia applicazione incorporando Jetty. Mi piacerebbe avere due diversi servizi web disponibili, un semplice server HTTP che serve solo contenuto statico (che alla fine sarà un'app GWT) e un servlet personalizzato che può sputare messaggi di stato JSON per l'applicazione.Come configurare risorse statiche e servizi personalizzati con Jetty incorporato?

mia distribuzione struttura di cartelle simile a questa:

+ dist/ 
    - MyApp.jar 
    + lib/ 
    + html/ 
    - index.html 

Ed ecco cosa ho finora per la configurazione del server integrato. Ottengo correttamente l'output di test dal mio servlet personalizzato quando si visita http://localhost/data/, ma non riesco a ottenere il DefaultServlet per trovare il mio file index.html.

public Webserver(int port) { 
    server = new Server(port); 

    ServletContextHandler context = new ServletContextHandler(); 
    context.setResourceBase("./html/"); 
    server.setHandler(context); 


    JsonDataApiServlet dataServlet = new JsonDataApiServlet(); 
    DefaultServlet staticServlet = new DefaultServlet(); 

    context.addServlet(new ServletHolder(dataServlet), "/data/*"); 
    context.addServlet(new ServletHolder(staticServlet), "/*"); 
} 

Sembra che questo sarebbe un compito comune per le persone incorporano Molo nelle cose .. sto ancora sulla strada giusta?

Modifica

Risulta questo problema era dovuto ad un malinteso del modo in cui i relativi percorsi sono calcolati all'interno Jetty. Stavo eseguendo questo da una cartella sopra la cartella dist, usando java -jar dist\MyApp.jar, e Jetty cercava dist\..\html anziché il corretto dist\html. L'esecuzione del barattolo dall'interno della cartella dist risolve il problema. Risponderò con come ho fatto a farlo funzionare senza dover eseguire da all'interno della directory dist.

+1

_Io non riesco a ottenere il DefaultServlet per trovare il mio file index.html_ Quindi, quale comportamento stai vedendo quando visiti "/index.html". Quale output di registro produce Jetty? – Tim

+0

Grazie Tim, quel commento mi ha portato nella giusta direzione. – Collin

risposta

6

Come dice la modifica, questo era solo un problema con la directory di cui stavo eseguendo il jar. Ecco il metodo con cui ho trovato la cartella html da dove è stato eseguito Jar:

Innanzitutto, ho aggiunto la cartella html al percorso di classe Manifest di Jar. Il codice che segue riporta la cartella html per ovunque il vaso viene caricato da:

ClassLoader loader = this.getClass().getClassLoader(); 
File indexLoc = new File(loader.getResource("index.html").getFile()); 
String htmlLoc = indexLoc.getParentFile().getAbsolutePath(); 

Questo utilizza il classloader per trovare il file di indice nel percorso di classe, poi trova la directory in assoluto per passare al Jetty:

server = new Server(port); 

ServletContextHandler context = new ServletContextHandler(); 
context.setResourceBase(htmlLoc); 
context.setWelcomeFiles(new String[] { "index.html" }); 
server.setHandler(context); 


JsonDataApiServlet dataServlet = new JsonDataApiServlet(); 
DefaultServlet staticServlet = new DefaultServlet(); 

context.addServlet(new ServletHolder(dataServlet), "/data/*"); 
context.addServlet(new ServletHolder(staticServlet), "/*");