Ответ 1
Используйте ResourceHandler
вместо ServletContextHandler
.
Я пытаюсь создать простое демонстрационное приложение со встроенным 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();
Используйте ResourceHandler
вместо ServletContextHandler
.
Существует важная разница между обслуживанием статического содержимого с помощью ResourceHandler
и использованием DefaultServlet
(с ServletContextHandler
).
Когда a ResourceHandler
(или HandlerList
, содержащий несколько экземпляров ResourceHandler
), задается как обработчик контекста, он непосредственно обрабатывает запросы и игнорирует любые зарегистрированные экземпляры javax.servlet.Filter.
Если вам нужны фильтры, единственный способ сделать это - использовать ServletContextHandler
, добавить к нему фильтры, затем добавить DefaultServlet
и, наконец, установить базу Resource
.
База Resource
представляет собой путь ресурса, к которому будет инициализирован a ResourceHandler
. Если вы используете статические ресурсы из нескольких каталогов, используйте ResourceCollection
(который все еще является Resource
) и инициализируйте его массивом строк resourceBase:
ResourceCollection resourceCollection = new ResourceCollection();
resourceCollection.setResources(getArrayOfResourceBaseDirs());
На моем маленьком веб-сервере у меня есть два файла: 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);
Работал как шарм!
Мне удалось добиться чего-то подобного, добавив сопоставление для каталога "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>
Это файл 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
в своем браузере, чтобы увидеть, что этот файл обслуживается.