web-dev-qa-db-fra.com

Servir des fichiers statiques avec Jetty intégrée

J'essaie de créer une application de démonstration simple avec Jetty intégrée qui sert des fichiers statiques à partir d'un répertoire "html" qui est un sous-répertoire du répertoire de travail actuel. L'idée est que le répertoire avec le pot de démonstration et le contenu peut être déplacé vers un nouvel emplacement et continuer à fonctionner.

J'ai essayé des variantes de ce qui suit, mais je reçois toujours des 404.

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: Voici une solution telle que documentée dans le tutoriel Jetty. Comme mentionné dans la bonne réponse, il utilise un ResourceHandler au lieu d'un 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();
52
HolySamosa

Utilisez un ResourceHandler au lieu de ServletContextHandler .

33
Sane Dog

Il existe une différence importante entre la diffusion de contenu statique à l'aide d'un ResourceHandler et à l'aide d'un DefaultServlet (avec un ServletContextHandler).

Lorsqu'un ResourceHandler (ou un HandlerList contenant plusieurs instances ResourceHandler) est défini en tant que gestionnaire de contexte, il traite directement les demandes et ignore toutes les instances javax.servlet.Filter enregistrées.

Si vous avez besoin de filtres, la seule façon de procéder consiste à utiliser un ServletContextHandler, à y ajouter des filtres, puis à ajouter un DefaultServlet et enfin à définir la base Resource.

La base Resource représente un chemin ResourceBase avec lequel ResourceHandler serait initialisé. Si vous servez des ressources statiques à partir de plusieurs répertoires, utilisez un ResourceCollection (qui est toujours un Resource) et initialisez-le avec un tableau de chaînes resourceBase:

ResourceCollection resourceCollection = new ResourceCollection();
resourceCollection.setResources(getArrayOfResourceBaseDirs());
19
xorcus

Dans mon petit serveur Web, j'ai deux fichiers, un index.html et un info.js localiser sous /src/webapp et je veux qu'ils soient servis à partir du serveur Web de la jetée intégrée.

C'est ainsi que je résous le problème du contenu statique.

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);

A fonctionné comme un charme!

15
akatran

J'ai réussi à réaliser quelque chose de similaire en ajoutant un mappage pour le répertoire "css" dans web.xml. Lui dire explicitement d'utiliser 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

C'est Main.Java fichier:

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();
    }
}

=====================================

Et c'est gradle.build fichier:

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) }
  }
}

=====================================

En supposant que le fichier suivant existe: C:\Users\serge.klimkovitch\Documents\images\image.html

Ensuite, exécutez dans Eclipse et accédez à http://localhost:8080/image.html dans votre navigateur pour voir ce fichier en cours de diffusion.

0
sklimkovitch