2012-04-23 2 views
46

Я пытаюсь создать простое демонстрационное приложение со встроенным Jetty, которое обслуживает статические файлы из каталога «html», который является подкаталогом текущего рабочего каталога. Идея состоит в том, что каталог с демонстрационным банком и контентом можно перенести в новое место и по-прежнему работать.Обслуживание статических файлов со встроенным Jetty

Я пробовал варианты следующего, но я продолжаю получать 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: Вот решение, как описано в учебнике Jetty. Как уже упоминалось в правильном ответе, он использует ResourceHandler вместо 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, который работает с этим: https://code.google.com/p/ram-badger/source/browse/trunk/static-jetty/pom. xml – cwash

+1

это, кажется, не работает с причалом 9 ... –

+1

если у одного лица такие же проблемы с причалом 9 @see - http://stackoverflow.com/questions/28346438/resourcehandler-stop-hosting-files-with-jetty -9-404-not-found-error-works-fin –

ответ

30

Используйте ResourceHandler вместо ServletContextHandler.

+1

Действительно ... http://jetty.codehaus.org/jetty/jetty-6/apidocs/org/mortbay/jetty/handler/ResourceHandler.html –

+4

Это сделал трюк! Спасибо, парни! Код даже указан в учебнике Jetty. Doh! http://wiki.eclipse.org/Jetty/Tutorial/Embedding_Jetty#Configuring_a_File_Server – HolySamosa

+1

вы все равно можете использовать 'ServletContextHandler', если вам нужен javax.servlet.Фильтр (подробнее см. Мой комментарий ниже) – xorcus

18

Существует важное различие между обслуживанием статического содержимого с использованием ResourceHandler и использованием DefaultServletServletContextHandler).

Когда ResourceHandler (или HandlerList, проведение многократных ResourceHandler экземпляров) устанавливается в качестве обработчика контекста, она непосредственно обрабатывает запросы и игнорирует все зарегистрированные экземпляры javax.servlet.Filter.

Если вам нужны фильтры, единственный способ сделать это - использовать ServletContextHandler, добавив к нему фильтры, затем добавив DefaultServlet и, наконец, установив базу Resource.

Основание Resource представляет собой путь resourceBase a ResourceHandler будет инициализирован. Если обслуживание статические ресурсы из нескольких каталогов, используйте ResourceCollection (который до сих пор Resource) и отформатируйте ее с массивом строк resourceBase:

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

В моем маленьком веб-сервере У меня есть два файла, а index.html и info.js найдите под /src/webapp, и я хочу, чтобы они обслуживались с встроенного веб-сервера причала.

Вот как я решаю проблему со статическим контентом.

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

Работал как очарование!

+2

Не могли бы вы взглянуть на этот вопрос - http://stackoverflow.com/questions/39011587/jetty-files-outside-war-and-context –

2

Мне удалось добиться чего-то подобного, добавив сопоставление для каталога «css» в web.xml. Явное говоря это использовать 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>