Servant des fichiers statiques avec une jetée intégrée

J’essaie de construire 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 contenant le fichier de démonstration et son contenu puisse être déplacé vers un nouvel emplacement et continuer à fonctionner.

J’ai essayé des variantes de ce qui suit, mais je continue à obtenir 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(); 

Mise à jour: Voici une solution décrite dans le tutoriel Jetty. Comme mentionné dans la réponse correcte, 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 Ssortingng[]{ "index.html" }); resource_handler.setResourceBase("."); HandlerList handlers = new HandlerList(); handlers.setHandlers(new Handler[] { resource_handler, new DefaultHandler() }); server.setHandler(handlers); server.start(); server.join(); 

Utilisez un ResourceHandler au lieu de ServletContextHandler .

Il existe une différence importante entre le service de contenu statique à l’aide d’un ResourceHandler et l’utilisation d’un DefaultServlet (avec ServletContextHandler ).

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

Si vous avez besoin de filtres, le seul moyen d’y ServletContextHandler consiste à utiliser ServletContextHandler , à y append des filtres, à append un DefaultServlet et enfin à définir la Resource base.

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

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

Dans mon petit serveur Web, j’ai deux fichiers, un index.html et un localisateur info.js sous /src/webapp et je souhaite qu’ils soient /src/webapp depuis le serveur Web intégré.

C’est comme ça que je résous le problème avec le 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); 

Travaillé comme un charme!

J’ai réussi à obtenir quelque chose de similaire en ajoutant un mappage pour le répertoire “css” dans web.xml. Lui dire explicitement d’utiliser DefaultServlet:

  DefaultServlet org.eclipse.jetty.servlet.DefaultServlet   DefaultServlet /css/*