嵌入式Jetty处理网址以提供内容

时间:2015-09-03 14:11:07

标签: java servlets jetty guice embedded-jetty

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

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

  • /socket必须由websocket servlet处理

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

  • /*,应该提供与此网址匹配的任何内容 我的Java应用程序的类路径上的/web假设它不是 由上述处理。如果资源不存在,那么它就会服务 /web/index.html

现在我想知道处理这个的最佳方法吗?使用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类型。 Jetty也可能会做一些记忆映射和花哨的事情来快速提供这些,我想维持。

1 个答案:

答案 0 :(得分:2)

  

常规说明ResourceHandler不适用于ServletContext的应用程序一起使用。
  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"路径要求设置。

BaseResourcejar:file://用来提供静态内容的网址(可以是file://DefaultServlet网址引用)。

因此,如果/image.png上有请求,则会提供{baseResource}/image.png/icons/avatar.gif上的请求会从{baseResource}/icons/avatar.gif提供

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

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