Bereitstellen statischer Dateien mit eingebettetem Jetty
Lesezeit: 4 Minuten
HeiligSamosa
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 immer noch funktioniert.
Ich habe folgende Variationen ausprobiert, bekomme aber immer wieder 404-Fehler.
ServletContextHandler context =
new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("https://stackoverflow.com/");
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();
Aktualisieren: Hier ist eine Lösung, die im Jetty-Tutorial dokumentiert ist. Wie in der richtigen Antwort erwähnt, verwendet es a ResourceHandler anstelle einer 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();
Sie können immer noch verwenden möchten ServletContextHandler wenn Sie javax.servlet.Filter benötigen (Details finden Sie in meinem Kommentar unten)
– Xorkus
28. Oktober 2013 um 12:18 Uhr
Als Jetty 6 noch existierte, machte dieser Rat Sinn. Heute, mit Jetty 9, ist dieser Ratschlag nicht mehr gültig. Siehe stackoverflow.com/a/28419106/775715
– Joakim Erdfelt
13. Februar 2015 um 13:26 Uhr
Der erste Link ist tot. Weiß jemand wie man auf die Seite kommt?
– Der Pfähler
12. Juli 2018 um 0:25 Uhr
Xorkus
Es gibt einen wichtigen Unterschied zwischen der Bereitstellung statischer Inhalte mit a ResourceHandler und mit a DefaultServlet (mit einer ServletContextHandler).
Wenn ein ResourceHandler (oder ein HandlerList mehrere halten ResourceHandler Instanzen) als Kontexthandler festgelegt ist, verarbeitet er Anforderungen direkt und ignoriert alle registrierten javax.servlet.Filter-Instanzen.
Wenn Sie Filter benötigen, können Sie dies nur mit a tun ServletContextHandlerfüge Filter hinzu und füge dann a hinzu DefaultServlet und schließlich das Setzen der Basis Resource.
Die Basis Resource repräsentiert einen resourceBase-Pfad a ResourceHandler würde mit initialisiert werden. Wenn Sie statische Ressourcen aus mehreren Verzeichnissen bereitstellen, verwenden Sie a ResourceCollection (das ist immer noch eine Resource) und initialisieren Sie es mit einem Array von resourceBase-Strings:
ResourceCollection resourceCollection = new ResourceCollection();
resourceCollection.setResources(getArrayOfResourceBaseDirs());
In meinem kleinen Webserver habe ich zwei Dateien, a index.html und ein info.js finden Sie 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("https://stackoverflow.com/");
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!
Könnten Sie sich diese Frage ansehen – stackoverflow.com/questions/39011587/…
– Pavel_K
18. August 2016 um 6:48 Uhr
Ich habe es geschafft, etwas Ähnliches zu erreichen, indem ich eine Zuordnung für das Verzeichnis “css” in web.xml hinzugefügt habe. Explizit anweisen, DefaultServlet zu verwenden:
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();
}
}
pom.xml-Datei, die damit funktioniert: code.google.com/p/ram-badger/source/browse/trunk/static-jetty/…
– Waschen
31. Juli 2013 um 6:31 Uhr
das scheint mit jetty 9 nicht zu funktionieren …
– Ilja Buziuk
5. Februar 2015 um 13:53 Uhr
wenn man mit Jetty 9 auf die gleichen Probleme stößt @see – stackoverflow.com/questions/28346438/…
– Ilja Buziuk
5. Februar 2015 um 14:31 Uhr