2012-04-23 11 views
46

Próbuję utworzyć prostą aplikację demo z wbudowanym Jetty, która obsługuje pliki statyczne z katalogu "html", który jest podkatalogiem bieżącego katalogu roboczego. Chodzi o to, że katalog ze słojem demo i treścią może zostać przeniesiony do nowej lokalizacji i nadal działać.Udostępnianie plików statycznych z wbudowanym Jetty

Próbowałem wariacji następujących, ale wciąż dostaję 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(); 

Aktualizacja: Oto rozwiązanie jak udokumentowano w tutorialu Jetty. Jak wspomniano w poprawnej odpowiedzi, używa ResourceHandler zamiast 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

plik pom.xml, który działa z tym: https://code.google.com/p/ram-badger/source/browse/trunk/static-jetty/pom. xml – cwash

+1

to nie wydaje się działać z jetty 9 ... –

+1

jeśli jedna twarz to samo problemy z jetty 9 @see - http://stackoverflow.com/questions/28346438/resourcehandler-stop-hosting-files-with-jetty -9-404-not-found-error-works-fin –

Odpowiedz

30
+1

Rzeczywiście ... http://jetty.codehaus.org/jetty/jetty-6/apidocs/org/mortbay/jetty/handler/ResourceHandler.html –

+4

To załatwił sprawę! Dzięki chłopaki! Kod jest nawet podany w samouczku Jetty. Doh! http://wiki.eclipse.org/Jetty/Tutorial/Embedding_Jetty#Configuring_a_File_Server – HolySamosa

+1

nadal możesz chcieć użyć 'ServletContextHandler' jeśli potrzebujesz javax.servlet.Filtruj (szczegóły, patrz komentarz poniżej) – xorcus

18

Istnieje istotna różnica między wyświetlaniem statycznej zawartości przy użyciu ResourceHandler i używaniem DefaultServlet (z ServletContextHandler).

Gdy ResourceHandler (lub HandlerList trzyma kilka ResourceHandler wystąpień) jest ustawiony jako obsługi kontekście bezpośrednio przetwarza żądania i ignoruje zarejestrowanych przypadków javax.servlet.Filter.

Jeśli potrzebujesz filtrów, jedynym sposobem, aby to zrobić, jest użycie ServletContextHandler, dodanie do niego filtrów, a następnie dodanie DefaultServlet i wreszcie ustawienie podstawy Resource.

Baza Resource reprezentuje ścieżkę bazy zasobowej, w której zainicjowano by ResourceHandler. Jeśli obsługujących zasoby statyczne z wielu katalogów, użyj ResourceCollection (która jest nadal Resource) i zainicjować go z tablicą ciągów resourceBase:

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

W moim małym serwerem WWW Mam dwa pliki, a index.html i info.js zlokalizuj pod numerem /src/webapp i chcę, aby były obsługiwane z wbudowanego serwera internetowego pomostu.

W ten sposób rozwiązuję problem z treścią statyczną.

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); 

Pracował jak urok!

+2

Możesz rzucić okiem na to pytanie - http://stackoverflow.com/questions/39011587/jetty-files-outside-war-and-context –

2

Udało mi się osiągnąć coś podobnego, dodając mapowanie do katalogu "css" w web.xml. Wyraźnie informując go używać DefaultServlet:

<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> 
Powiązane problemy