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();
Utilisez un ResourceHandler
au lieu de ServletContextHandler
.
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());
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!
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>
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.