2013-11-26 14 views
10

Sto provando a creare un server jetty incorporato con sia un servlet personalizzato che serve alcuni dati dinamici, sia un servlet predefinito che servirà per alcune immagini. Ho il servlet personalizzato funzionante, ma non riesco a capire come aggiungere un servlet predefinito per servire i file di immagine.Elaborazione di file statici da un percorso alternativo nel molo incorporato

Questo è ciò che ho ...

private void setUpServer(ServerOptions options){ 
    s = new Server(options.getPort()); 
    this.options = options; 
    context = new ServletContextHandler(ServletContextHandler.SESSIONS); 
    context.setContextPath("/"); 
    s.setHandler(context); 
    context.addServlet(new ServletHolder(new DataServlet()), "/data/*"); 
    context.addServlet(new ServletHolder(new DefaultServlet()), "/pictures/*"); 
} 

Non riesco a capire come configurare il DefaultServlet a lavorare come un file server e avere ancora l'usanza DataServelet ancora lavoro.

Qualcuno ha qualche idea?

risposta

28

quello che vi serve:

  1. Un DefaultServlet a "/" (consigliato, è un requisito della specifica servlet)
    • questo dovrebbe essere chiamato dispatcher di "default" (un altro requisito di servlet spec)
  2. Un DefaultServlet si alternano con il contenuto personalizzato statico, configurato tramite init-params
    • utilizzo di un diverso dispatcher nome di "default" (per evitare una collisione nome tra le altre caratteristiche servlet spec)
    • È possibile utilizzare il ServletHolder.setInitParameter(name,value) per raggiungere questo
    • Assicurarsi di impostare il parametro pathInfoOnly a true (per andare in giro casi speciali per "default" denominati spedizionieri)
  3. Un servlet tutto tuo, che serve contenuto dinamico.

AltDefaultServlet.java

package jetty.demo; 

import org.eclipse.jetty.server.Server; 
import org.eclipse.jetty.server.ServerConnector; 
import org.eclipse.jetty.servlet.DefaultServlet; 
import org.eclipse.jetty.servlet.ServletContextHandler; 
import org.eclipse.jetty.servlet.ServletHolder; 

public class AltDefaultServlet 
{ 
    public static void main(String[] args) 
    { 
     System.setProperty("org.eclipse.jetty.LEVEL","INFO"); 

     Server server = new Server(); 
     ServerConnector connector = new ServerConnector(server); 
     connector.setPort(8080); 
     server.addConnector(connector); 

     // The filesystem paths we will map 
     String homePath = System.getProperty("user.home"); 
     String pwdPath = System.getProperty("user.dir"); 

     // Setup the basic application "context" for this application at "/" 
     // This is also known as the handler tree (in jetty speak) 
     ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); 
     context.setResourceBase(pwdPath); 
     context.setContextPath("/"); 
     server.setHandler(context); 

     // add a simple Servlet at "/dynamic/*" 
     ServletHolder holderDynamic = new ServletHolder("dynamic", DynamicServlet.class); 
     context.addServlet(holderDynamic, "/dynamic/*"); 

     // add special pathspec of "/home/" content mapped to the homePath 
     ServletHolder holderHome = new ServletHolder("static-home", DefaultServlet.class); 
     holderHome.setInitParameter("resourceBase",homePath); 
     holderHome.setInitParameter("dirAllowed","true"); 
     holderHome.setInitParameter("pathInfoOnly","true"); 
     context.addServlet(holderHome,"/home/*"); 

     // Lastly, the default servlet for root content (always needed, to satisfy servlet spec) 
     // It is important that this is last. 
     ServletHolder holderPwd = new ServletHolder("default", DefaultServlet.class); 
     holderPwd.setInitParameter("dirAllowed","true"); 
     context.addServlet(holderPwd,"/"); 

     try 
     { 
      server.start(); 
      server.dump(System.err); 
      server.join(); 
     } 
     catch (Throwable t) 
     { 
      t.printStackTrace(System.err); 
     } 
    } 

} 
+0

questo ha funzionato perfettamente. Grazie!!!!!!!!! – user3034643

+0

questo funziona ... dopo poche ore sprecate alla fine. Grazie!!! – thisarattr

+0

risolto il problema con la versione Jetty integrata 9.4, grazie @Joakim Erdfelt –

Problemi correlati