嵌入式Jetty处理url以提供内容

我正在使用嵌入式Jetty和Guice,我想知道处理我的单页应用程序的最佳方法。

我希望Jetty能够处理这样的请求(优先顺序):

  • /socket必须由websocket servlet处理

  • /fs/read/* ,与此url匹配的任何内容我需要由自定义servlet处理

  • /* ,任何与此url匹配的内容都应该从我的Java应用程序的类路径上的/web提供,假设它不是由上面的处理。 如果资源不存在,则它提供/web/index.html

现在我想知道处理这个问题的最佳方法吗? 使用REST框架似乎很苛刻,因为我没有任何rest服务。

目前我正在设置Jetty:

 ServletHolder servletHolder = new ServletHolder(DefaultServlet.class); ServletContextHandler servletContextHandler = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS); servletContextHandler.addFilter(GuiceFilter.class, "/*", EnumSet.allOf(DispatcherType.class)); servletContextHandler.addServlet(servletHolder, "/"); ResourceHandler resHandler = new ResourceHandler(); resHandler.setBaseResource(Resource.newClassPathResource("/web")); server.setHandler(resHandler); 

这是我的Guice ServletModule

 serve("/socket/*").with(WebSocketManagerServlet.class); serve("/fs/read/*").with(MyCustomServlet.class); 

但是,我不知道如何做最后一条规则,它重定向任何与index.html不匹配的东西,并且仍然让jetty发出正确的标题,为css/js/html等正确的mime类型.Petty也可能做一些内存映射和花哨的东西,以便快速提供这些,我想维护。

一般注意ResourceHandler不适用于具有ServletContext的应用程序的嵌入式Jetty 。
ResourceHandler非常原始(非常天真),仅用于支持仅使用原始Jetty处理程序的Web应用程序。
不要将ResourceHandlerContextHandlerServletContextHandlerWebAppContext混合使用。

根据你的要求,我想你想要这个……

 URL urlToWebDir = findUrlTo("/web"); ServletContextHandler servletContextHandler = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS); servletContextHandler.setContextPath("/"); servletContextHandler.setWelcomeFiles(new String[] { "index.html" }); servletContextHandler.setBaseResource(Resource.newResource(urlToWebDir)); servletContextHandler.addServlet(DefaultServlet.class, "/"); ErrorPageErrorHandler errorMapper = new ErrorPageErrorHandler(); errorMapper.addErrorPage(404,"/"); // map all 404's to root (aka /index.html) servletContextHandler.setErrorHandler(errorMapper); 

这是一个更简单的"/web"路径要求设置。

BaseResource是一个URL(它可以是一个jar:file://file:// URL引用), DefaultServlet使用它来为静态内容提供服务。

因此,如果请求进入/image.png则会提供{baseResource}/image.png (并且来自{baseResource}/icons/avatar.gif

WelcomeFiles设置index.html解析,以便/上的请求导致服务文件{baseResource}/index.html 。 (如果请求是/alternate/path/deep/in/your/tree/然后/alternate/path/deep/in/your/tree/index.html被提供(如果存在),也可以使用。

附加说明: DefaultServlet支持预压缩静态内容服务。 这意味着如果您对内容进行gzip并保留其副本,那么如果他们的浏览器说它支持压缩响应,那么压缩版本将提供给您的用户。 (示例:请求/js/hugelib.js使用不支持压缩响应的旧浏览器,然后提供{baseResource}/js/hugelib.js 。但如果浏览器支持压缩响应,那么{baseResource}/js/hugelib.js.gz服务{baseResource}/js/hugelib.js.gz