web-dev-qa-db-de.com

Statische Dateien mit integriertem Steg bereitstellen

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();
52
HolySamosa

Verwenden Sie ein ResourceHandler anstelle von ServletContextHandler .

33
Sane Dog

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());
19
xorcus

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!

15
akatran

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>
2
QaZ

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.

0
sklimkovitch