我正在使用嵌入式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也可能会做一些记忆映射和花哨的事情来快速提供这些,我想维持。
答案 0 :(得分:2)
常规说明:
ResourceHandler
不适用于embedded-jetty与ServletContext
的应用程序一起使用。
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
是jar: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>