2012-04-23 13 views
46

Ich versuche, eine einfache Demo-App mit Embedded Jetty, die statische Dateien aus einem "Html" -Verzeichnis dient, die ein Unterverzeichnis des aktuellen Arbeitsverzeichnisses ist. Die Idee ist, dass das Verzeichnis mit dem Demo-Jar und Inhalt an einen neuen Ort verschoben werden kann und trotzdem funktioniert.Serving statische Dateien mit eingebetteten Jetty

Ich habe versucht, Variationen der folgenden, aber ich bekomme 404s.

ServletContextHandler context = 
         new ServletContextHandler(ServletContextHandler.SESSIONS); 
context.setContextPath("/"); 

context.getInitParams().put(
         "org.eclipse.jetty.servlet.Default.resourceBase", "html"); 
context.addServlet(new ServletHolder(new DefaultServlet()), "/html"); 

Server jetty = new Server(8080); 
jetty.setHandler(context); 

jetty.start(); 

Update: Hier ist eine Lösung wie in der Jetty Tutorial dokumentiert. Wie in der richtigen Antwort erwähnt, verwendet es eine ResourceHandler anstelle eines ServletContextHandler:

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

    ResourceHandler resource_handler = new ResourceHandler(); 
    resource_handler.setDirectoriesListed(true); 
    resource_handler.setWelcomeFiles(new String[]{ "index.html" }); 

    resource_handler.setResourceBase("."); 

    HandlerList handlers = new HandlerList(); 
    handlers.setHandlers(new Handler[] { resource_handler, new DefaultHandler() }); 
    server.setHandler(handlers); 

    server.start(); 
    server.join(); 
+0

pom.xml-Datei, die mit diesem Werk: https://code.google.com/p/ram-badger/source/browse/trunk/static-jetty/pom. xml – cwash

+1

dies scheint nicht mit Anlegesteg 9 zu funktionieren ... –

+1

wenn ein Gesicht gleiche Probleme mit Anlegesteg 9 @see - http://StackOverflow.com/Questions/28346438/resourcehandler-stop-hosting-files-with-jjety -9-404-nicht-gefunden-Fehler-funktioniert-fin –

Antwort

30

eine ResourceHandler statt ServletContextHandler verwenden.

+1

In der Tat ... http://jetty.codehaus.org/jetty/jetty-6/apidocs/org/mortbay/jetty/handler/ResourceHandler.html –

+4

Das hat den Trick gemacht! Danke Leute! Der Code ist sogar im Jetty-Tutorial angegeben. Do! http://wiki.eclipse.org/Jetty/Tutorial/Embedding_Jetty#Configuring_a_File_Server – HolySamosa

+1

Sie möchten immer noch 'ServletContextHandler' verwenden, wenn Sie javax.servlet benötigen.Filter (Details siehe unten) – xorcus

18

Es gibt einen wichtigen Unterschied zwischen dem Servieren von statischem Inhalt mit einem ResourceHandler und dem Verwenden eines DefaultServlet (mit einem ServletContextHandler).

Wenn ein ResourceHandler (oder eine HandlerList mehrere Instanzen ResourceHandler hält) als Kontext-Handler gesetzt ist, verarbeitet sie direkt Anfragen und ignoriert alle registrierten javax.servlet.Filter Instanzen.

Wenn Sie Filter benötigen, können Sie nur ServletContextHandler verwenden, Filter hinzufügen, dann DefaultServlet hinzufügen und schließlich die Basis Resource einstellen.

Die Basis Resource repräsentiert einen resourceBase-Pfad, der mit ResourceHandler initialisiert werden soll. Wenn statische Ressourcen aus mehreren Verzeichnissen dient, verwenden Sie einen ResourceCollection (das ist immer noch ein Resource) und initialisieren es mit einer Reihe von resourceBase Strings:

ResourceCollection resourceCollection = new ResourceCollection(); 
resourceCollection.setResources(getArrayOfResourceBaseDirs()); 
12

In meinem kleinen Web-Server Ich habe zwei Dateien, eine index.html und info.js Lokalisieren Sie unter /src/webapp und ich möchte, dass sie vom Embedded Jetty Webserver bedient werden.

So löse ich das Problem mit statischem Inhalt.

Server server = new Server(8080); 

ServletContextHandler ctx = new ServletContextHandler(); 
ctx.setContextPath("/"); 

DefaultServlet defaultServlet = new DefaultServlet(); 
ServletHolder holderPwd = new ServletHolder("default", defaultServlet); 
holderPwd.setInitParameter("resourceBase", "./src/webapp/"); 

ctx.addServlet(holderPwd, "/*"); 
ctx.addServlet(InfoServiceSocketServlet.class, "/info"); 

server.setHandler(ctx); 

Arbeitete wie ein Charme!

+2

Könnten Sie sich diese Frage ansehen - http://stackoverflow.com/questions/39011587/jetty-files-outside-war-and-context –

2

Ich habe etwas Ähnliches erreicht, indem ich ein Mapping für das Verzeichnis "css" in web.xml hinzugefügt habe. sagen, es Explizit DefaultServlet zu verwenden:

<servlet> 
    <servlet-name>DefaultServlet</servlet-name> 
    <servlet-class>org.eclipse.jetty.servlet.DefaultServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>DefaultServlet</servlet-name> 
    <url-pattern>/css/*</url-pattern> 
</servlet-mapping> 
Verwandte Themen