Serving static files from an alternate path in embedded Jetty

I am trying to create an integrated berth server using a special servlet that serves some dynamic data, and a default servlet that will serve some images. I have a custom servlet, but I can’t figure out how to add a default servlet to serve image files.

This is what I have ...

private void setUpServer(ServerOptions options){ s = new Server(options.getPort()); this.options = options; context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); s.setHandler(context); context.addServlet(new ServletHolder(new DataServlet()), "/data/*"); context.addServlet(new ServletHolder(new DefaultServlet()), "/pictures/*"); } 

I cannot figure out how to configure DefaultServlet to act as a file server and still work with a custom DataServelet.

Does anyone have any ideas?

+10
java servlets jetty fileserver embedded-jetty
Nov 26 '13 at 2:34
source share
1 answer

What you need:

  • DefaultServlet in "/" (recommended, this is a servlet specification requirement)
    • it should be in the named dispatcher "default" (another servlet specification requirement)
  • Alternate DefaultServlet with your static content configured with init-params
    • Using a different dispatcher name than "default" (to avoid name collisions between other functions of the servlet specification)
    • You can use ServletHolder.setInitParameter(name,value) to accomplish this
    • Be sure to set the pathInfoOnly parameter to true (to bypass special cases for the "default" named dispatchers)
  • Servlet containing dynamic content.

AltDefaultServlet.java

 package jetty.demo; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.servlet.DefaultServlet; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; public class AltDefaultServlet { public static void main(String[] args) { System.setProperty("org.eclipse.jetty.LEVEL","INFO"); Server server = new Server(); ServerConnector connector = new ServerConnector(server); connector.setPort(8080); server.addConnector(connector); // The filesystem paths we will map String homePath = System.getProperty("user.home"); String pwdPath = System.getProperty("user.dir"); // Setup the basic application "context" for this application at "/" // This is also known as the handler tree (in jetty speak) ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setResourceBase(pwdPath); context.setContextPath("/"); server.setHandler(context); // add a simple Servlet at "/dynamic/*" ServletHolder holderDynamic = new ServletHolder("dynamic", DynamicServlet.class); context.addServlet(holderDynamic, "/dynamic/*"); // add special pathspec of "/home/" content mapped to the homePath ServletHolder holderHome = new ServletHolder("static-home", DefaultServlet.class); holderHome.setInitParameter("resourceBase",homePath); holderHome.setInitParameter("dirAllowed","true"); holderHome.setInitParameter("pathInfoOnly","true"); context.addServlet(holderHome,"/home/*"); // Lastly, the default servlet for root content (always needed, to satisfy servlet spec) // It is important that this is last. ServletHolder holderPwd = new ServletHolder("default", DefaultServlet.class); holderPwd.setInitParameter("dirAllowed","true"); context.addServlet(holderPwd,"/"); try { server.start(); server.dump(System.err); server.join(); } catch (Throwable t) { t.printStackTrace(System.err); } } } 
+27
Nov 26 '13 at 16:50
source share



All Articles