嵌入式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应用程序。
不要将ResourceHandler
与ContextHandler
,ServletContextHandler
或WebAppContext
混合使用。
根据你的要求,我想你想要这个……
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
)