提供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>