Ich versuche, eine einfache Demo-App mit eingebettetem Jetty zu erstellen, die statische Dateien aus einem "html" -Verzeichnis bereitstellt, das ein Unterverzeichnis des aktuellen Arbeitsverzeichnisses ist. Die Idee ist, dass das Verzeichnis mit dem Demo-Jar und dem Inhalt an einen neuen Ort verschoben werden kann und weiterhin funktioniert.
Ich habe versucht, Variationen der folgenden, aber ich bekomme immer 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();
pdate: Hier ist eine Lösung, wie im Jetty-Tutorial dokumentiert. Wie in der richtigen Antwort erwähnt, wird ein ResourceHandler
anstelle eines ServletContextHandler
verwendet:
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();
Verwenden Sie ein ResourceHandler
anstelle von ServletContextHandler
.
Es gibt einen wichtigen Unterschied zwischen der Bereitstellung statischer Inhalte mit einem ResourceHandler
und einem DefaultServlet
(mit einem ServletContextHandler
).
Wenn ein ResourceHandler
(oder ein HandlerList
mit mehreren ResourceHandler
Instanzen) als Kontexthandler festgelegt ist, werden Anforderungen direkt verarbeitet und alle registrierten javax.servlet.Filter-Instanzen ignoriert.
Wenn Sie Filter benötigen, können Sie nur ein ServletContextHandler
verwenden, Filter hinzufügen, dann ein DefaultServlet
hinzufügen und schließlich die Basis Resource
festlegen.
Die Basis Resource
stellt einen resourceBase-Pfad dar, mit dem ein ResourceHandler
initialisiert werden würde. Wenn Sie statische Ressourcen aus mehreren Verzeichnissen bereitstellen, verwenden Sie ein ResourceCollection
(das immer noch ein Resource
ist) und initialisieren Sie es mit einem Array von resourceBase-Zeichenfolgen:
ResourceCollection resourceCollection = new ResourceCollection();
resourceCollection.setResources(getArrayOfResourceBaseDirs());
Auf meinem kleinen Webserver habe ich zwei Dateien, ein index.html
und ein info.js
finde unter /src/webapp
und ich möchte, dass sie vom eingebetteten Jetty-Webserver bedient werden.
So löse ich das Problem mit statischen Inhalten.
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);
Lief wie am Schnürchen!
Ich habe etwas Ähnliches erreicht, indem ich eine Zuordnung für das Verzeichnis "css" in web.xml hinzugefügt habe. Explizite Anweisung zur Verwendung von 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>
Das ist Main.Java
Datei:
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();
}
}
====================================
Und das ist gradle.build
Datei:
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) }
}
}
====================================
Angenommen, die folgende Datei existiert: C:\Users\serge.klimkovitch\Documents\images\image.html
Dann renne in Eclipse und gehe zu http://localhost:8080/image.html
in Ihrem Browser, um zu sehen, ob diese Datei geliefert wird.