我正在看一个使用Jetty的应用程序,它有很多不同的相关对象:
service = new Server(Integer.valueOf(System.getenv("PORT")));
final ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
MyAppServlet myAppServlet = new MyAppServlet();
ServletHolder myAppServletServletHolder = new ServletHolder(myAppServlet);
final String serviceName = 'abc';
servletContextHandler.addServlet(myAppServletServletHolder, ("/"+ serviceName));
service.setHandler(servletContextHandler);
因此,似乎层次结构是:
Server
ServletContextHandler
ServletHolder
Servlet
Server的含义很明显,似乎Servlet是实现实际应用程序的脚本。
但是ServletContextHandler的含义不太清楚。您能否给出一个简单的解释,而该假设并不需要Java生态系统的太多背景,而只是具有一般的编程经验?是否出于在不同应用程序(Servlet)之间共享配置变量的目的?那会有什么有用的应用?
最后,我不知道为什么我们需要ServletHolder而不是仅仅将Servlet提供给ServletContextHandler。
以下内容有些相关,但我认为并不太紧密。它只有一个类与此问题重叠:What's the difference between a ServletHandler and a ServletContextHandler in Jetty?
最佳答案
服务器-服务器本身。 (是的,应该很明显)
ServletContextHandler-上下文,提供javax.servlet.ServletContext
中定义的范围
您可以有[0..n]个ServletContextHandler
实例。
它们一定不能映射到相同的上下文路径。
负责:
上下文路径(此上下文映射到什么?)-
例子:
根的/
对http://machine.com/foo
的请求将命中该ServletContext
并处理其中为资源/foo
映射的任何内容/app
特定于应用
对http://machine.com/app/bar
的请求将在ServletContext
处命中/app
并处理其中为资源/bar
映射的任何内容
属于该ServletContext
的属性
基本资源位置-您所有内容所在的位置(请参阅:https://stackoverflow.com/a/39019797/775715)
Servlet列表
筛选器清单
Servlet规范侦听器列表
保存您的Servlet规范会话配置
保留您的Servlet规范身份验证配置
欢迎文件配置
上下文特定的请求分派器支持
错误处理配置
Gzip响应压缩支持
等...
ServletHolder-特定Servlet的配置
每个Servlet可以配置为:
感兴趣的网址模式
初始化参数图
它在开始时初始化吗?如果是这样,按什么顺序?
注意:还有一个相当于Filters的FilterHolder
Servlet-处理您的请求并生成响应的低级端点资源
这使用标准的Servlet行为处理原始请求。
过滤器-Servlet之前可以参与请求/响应处理的组件。