2012-04-23 20 views
46

Estoy tratando de construir una aplicación de demostración simple con Jetty integrado que sirve archivos estáticos de un directorio "html" que es un subdirectorio del directorio de trabajo actual. La idea es que el directorio con el demo jar y el contenido se puedan mover a una nueva ubicación y seguir funcionando.Sirviendo archivos estáticos con Jetty

He intentado variaciones de lo siguiente, pero sigo recibiendo 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(); 

Actualización: he aquí una solución tal como se documenta en el tutorial embarcadero. Como se mencionó en la respuesta correcta, se utiliza una ResourceHandler en lugar de 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

pom.xml que funciona con esto: https://code.google.com/p/ram-badger/source/browse/trunk/static-jetty/pom. xml – cwash

+1

esto no parece funcionar con el muelle 9 ... –

+1

si una misma cara tiene problemas con el muelle 9 @see - http://stackoverflow.com/questions/28346438/resourcehandler-stop-hosting-files-with-jetty -9-404-not-found-error-works-fin –

Respuesta

30

Utilice un ResourceHandler en lugar de ServletContextHandler.

+1

Indeed ... http://jetty.codehaus.org/jetty/jetty-6/apidocs/org/mortbay/jetty/handler/ResourceHandler.html –

+4

Eso ¡Hizo el truco! ¡Gracias chicos! El código incluso se da en el tutorial de Jetty. Doh! http://wiki.eclipse.org/Jetty/Tutorial/Embedding_Jetty#Configuring_a_File_Server – HolySamosa

+1

aún puede querer usar 'ServletContextHandler' si necesita javax.servlet.Filtro (para más detalles, consulte mi comentario a continuación) – xorcus

18

Hay una diferencia importante entre servir contenido estático usando un ResourceHandler y usando un DefaultServlet (con un ServletContextHandler).

Cuando un ResourceHandler (o un HandlerList múltiple que sostiene ResourceHandler instancias) se establece como un gestor de contextos, procesa directamente solicitudes e ignora cualquier instancia javax.servlet.Filter registrados.

Si necesita filtros, la única forma de hacerlo es usando ServletContextHandler, agregándole filtros, luego agregando un DefaultServlet y, finalmente, estableciendo la base Resource.

La base Resource representa una ruta de resourceBase con la que se inicializaría una ruta ResourceHandler. Si va a servir recursos estáticos a partir de múltiples niveles, use un ResourceCollection (que sigue siendo un Resource) y se inician con una matriz de cadenas resourceBase:

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

En mi pequeño servidor web Tengo dos archivos, un index.html y una info.js localizar bajo /src/webapp y quiero que se sirvan desde el servidor web embarcado.

Así resuelvo el problema con el contenido estático.

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

¡Funcionó como un encanto!

+2

¿Podría echar un vistazo a esta pregunta? Http://stackoverflow.com/questions/39011587/jetty-files-outside-war-and-context –

2

Logré lograr algo similar al agregar una asignación para el directorio "css" en web.xml. Explícitamente diciéndole que la utilice 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> 
Cuestiones relacionadas