2013-11-26 8 views
10

Ich versuche, einen eingebetteten Jetty-Server mit einem benutzerdefinierten Servlet, das einige dynamische Daten dient, und Standard-Servlet, das einige Bilder liefern wird, zu erstellen. Ich habe das benutzerdefinierte Servlet funktioniert, aber ich kann nicht herausfinden, wie Sie ein Standard-Servlet hinzufügen, um die Bilddateien zu liefern.Serving statische Dateien von alternativen Pfad in eingebetteten Jetty

Das ist, was ich habe ...

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

Ich kann nicht herausfinden, wie die DefaultServlet konfigurieren als Dateiserver zu arbeiten und haben immer noch die benutzerdefinierte DataServelet immer noch funktionieren.

Hat jemand irgendwelche Ideen?

Antwort

28

Was Sie brauchen:

  1. A DefaultServlet unter "/" (empfohlen, es eine Anforderung der Servlet-Spezifikation ist)
    • dies bei namens Dispatcher von "default" sein sollte (eine weitere Anforderung der Servlet-spec)
  2. Eine alternative DefaultServlet mit Ihrem eigenen statischen Inhalt, konfiguriert via init-params
    • einen anderen Namen Dispatcher als „default“ (einen Namen Kollision zwischen anderen Servlet-Spezifikation Funktionen zu vermeiden)
    • Sie die ServletHolder.setInitParameter(name,value) können diese
    • Seien Sie sicher, dass Sie den pathInfoOnly Parameter true (umgehen gesetzt zu erreichen Sonderfälle für "Standard" benannte Dispatcher)
  3. Ein eigenes Servlet, das dynamische Inhalte bedient.

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

Das funktionierte perfekt. Vielen Dank!!!!!!!!! – user3034643

+0

das funktioniert ... nach ein paar vergeudeten Stunden endlich. Vielen Dank!!! – thisarattr

+0

dies behoben mein Problem mit Embedded Jetty Version 9.4, danke @Joakim Erdfelt –