Подтвердить что ты не робот

Обслуживание статических файлов со встроенным Jetty

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

Я пробовал варианты следующего, но я продолжаю получать 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();

Обновление: здесь решение, описанное в учебнике 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();
4b9b3361

Ответ 2

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

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

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

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

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

Ответ 3

На моем маленьком веб-сервере у меня есть два файла: 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);

Работал как шарм!

Ответ 4

Мне удалось добиться чего-то подобного, добавив сопоставление для каталога "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>

Ответ 5

Это файл Main.java:

import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.ResourceHandler;

public class Main
{
    public static void main(String[] args) throws Exception
    {
        Server server = new Server(8080);
        ResourceHandler resource_handler = new ResourceHandler();
        resource_handler.setResourceBase("C:/Users/serge.klimkovitch/Documents/images");
        HandlerList handlers = new HandlerList();
        handlers.setHandlers(new Handler[] { resource_handler, new DefaultHandler() });
        server.setHandler(handlers);
        server.start();
        server.join();
    }
}

=====================================

И это файл gradle.build:

apply plugin: 'java'
apply plugin: 'application'

mainClassName = 'SheetsQuickstart'
sourceCompatibility = 1.7
targetCompatibility = 1.7
version = '1.0'

repositories {
    mavenCentral()
}

dependencies {
compile group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.4.16.v20190411'

}

jar {
  manifest {
    attributes(
      'Main-Class': 'SheetsQuickstart'
    )
  }
  from {
    configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
  }
}

=====================================

Предполагая, что существует следующий файл: C:\Users\serge.klimkovitch\Documents\images\image.html

Затем запустите в Eclipse и перейдите по http://localhost:8080/image.html в своем браузере, чтобы увидеть, что этот файл обслуживается.