58 votes

Servir des fichiers statiques avec Jetty intégré

J'essaie de construire une application de démonstration simple avec Jetty intégré 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 contenant le jar et le contenu de la démo puisse être déplacé vers un autre endroit et continuer à fonctionner.

J'ai essayé des variantes de ce qui suit, mais j'obtiens toujours 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();

Mise à jour : Voici une solution telle que documentée dans le tutoriel Jetty. Comme mentionné dans la bonne réponse, elle utilise un fichier 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();

0 votes

Fichier pom.xml qui fonctionne avec ça : code.google.com/p/ram-badger/source/browse/trunk/static-jetty/

1 votes

Cela ne semble pas fonctionner avec jetty 9...

1 votes

Si l'un d'entre eux rencontre les mêmes problèmes avec jetty 9 @voir - stackoverflow.com/questions/28346438/

34voto

Sane Dog Points 311

Utilisez un ResourceHandler au lieu de ServletContextHandler .

1 votes

4 votes

Cela a fait l'affaire ! Merci les gars ! Le code est même donné dans le tutoriel Jetty. Doh ! wiki.eclipse.org/Jetty/Tutorial/

1 votes

Vous pouvez toujours utiliser ServletContextHandler si vous avez besoin de javax.servlet.Filter (pour les détails, voir mon commentaire ci-dessous)

20voto

xorcus Points 192

Il existe une différence importante entre le fait de servir du contenu statique à l'aide d'un fichier ResourceHandler et en utilisant un DefaultServlet (avec un ServletContextHandler ).

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

Si vous avez besoin de filtres, la seule façon d'y parvenir est d'utiliser une ServletContextHandler en y ajoutant des filtres, puis en ajoutant un DefaultServlet et enfin, en fixant la base Resource .

La base Resource représente un chemin de ressourceBase a ResourceHandler serait initialisé avec. Si vous servez des ressources statiques à partir de plusieurs répertoires, utilisez une balise ResourceCollection (qui est toujours un Resource ) et l'initialiser avec un tableau de chaînes resourceBase :

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

19voto

akatran Points 255

Dans mon petit serveur web, j'ai deux fichiers, un index.html et un info.js situer sous /src/webapp et je veux qu'ils soient servis par le serveur web Jetty intégré.

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 a marché comme un charme !

3voto

QaZ Points 31

J'ai réussi à obtenir quelque chose de similaire en ajoutant un mappage pour le répertoire "css" dans web.xml. En lui disant 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>

2voto

sklimkovitch Points 67

C'est Main.java archivo:

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 ceci est gradle.build archivo:

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 allez à http://localhost:8080/image.html dans votre navigateur pour voir ce fichier être servi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X