Bereitstellen statischer Dateien mit eingebettetem Jetty

Lesezeit: 4 Minuten

Benutzer-Avatar
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();

  • 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

Benutzer-Avatar
Guy Hiller

Verwenden ein ResourceHandler Anstatt von ServletContextHandler.

  • In der Tat… jetty.codehaus.org/jetty/jetty-6/apidocs/org/mortbay/jetty/…

    – Spencer Kormos

    23. April 2012 um 18:59 Uhr

  • Das hat funktioniert! Danke Leute! Der Code ist sogar im Jetty-Tutorial angegeben. Doh! wiki.eclipse.org/Jetty/Tutorial/…

    – HolySamosa

    23. April 2012 um 19:16 Uhr

  • 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

Benutzer-Avatar
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:

<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

Führen Sie dann Eclipse aus und gehen Sie zu http://localhost:8080/image.html in Ihrem Browser, um zu sehen, wie diese Datei bereitgestellt wird.

1037870cookie-checkBereitstellen statischer Dateien mit eingebettetem Jetty

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy