提供embeddedJetty的静态文件

我正在尝试构build一个简单的embedded式Jetty演示应用程序,该应用程序从当前工作目录的子目录“html”目录提供静态文件。 这个想法是,具有演示jar和内容的目录可以被移动到一个新的位置,并仍然工作。

我已经尝试了以下的变体,但我一直在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(); 

有任何想法吗?

更新:这是Jetty教程中logging的解决scheme。 正如在正确答案中提到的,它使用ResourceHandler而不是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(); 

使用ResourceHandler而不是ServletContextHandler

在使用ResourceHandler提供静态内容和使用DefaultServlet (使用ServletContextHandler )之间有一个重要的区别。

当一个ResourceHandler (或一个持有多个ResourceHandler实例的HandlerList )被设置为上下文处理程序时,它直接处理请求并忽略任何已注册的javax.servlet.Filter实例。

如果你需要filter,唯一的方法就是使用ServletContextHandler ,添加filter,然后添加一个DefaultServlet ,最后设置基本Resource

基本Resource表示ResourceHandler将被初始化的resourceBasepath。 如果从多个目录提供静态资源,请使用ResourceCollection (它仍然是一个Resource ),并使用一组resourceBasestring对其进行初始化:

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

在我的小型Web服务器中,我有两个文件,一个index.html和一个info.js位于/src/webapp ,我希望它们可以从embedded式jetty web服务器上提供。

这是我如何解决静态内容的问题。

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

像魅力一样工作!

我设法通过为web.xml中的“css”目录添加映射来实现类似的function。 明确地告诉它使用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>