Server vs ServletContextHandler vs ServletHolder vs Servlet

时间:2018-04-27 16:59:22

标签: java jetty

我正在查看使用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

服务器的含义是显而易见的,似乎Servlet是实现实际应用程序的脚本。

但ServletContextHandler的含义不太清楚。您能否给出一个简单的解释,在Java生态系统中没有多少背景,只有一般的编程经验?它是为了跨不同的应用程序(servlet)共享配置变量吗?那些有用的应用是什么?

最后,我不知道为什么我们需要一个ServletHolder,而不是仅仅将Servlet提供给ServletContextHandler。

以下内容有点相关,但我并未仔细思考。它与此问题只有一个类重叠:What's the difference between a ServletHandler and a ServletContextHandler in Jetty?

1 个答案:

答案 0 :(得分:0)

服务器 - 服务器本身。 (是的,应该很明显)

ServletContextHandler - 上下文,提供javax.servlet.ServletContext中定义的范围

您可以拥有[0..n] ServletContextHandler个实例 它们不能映射到相同的上下文路径。

负责:

  • 上下文路径(此上下文映射到什么?) -

示例:

/ for root

http://machine.com/foo的请求将点击ServletContext并处理资源/foo

中映射的内容

/app针对特定应用

http://machine.com/app/bar的请求将在ServletContext点击/app并处理资源/bar

内的任何内容
  • 属于ServletContext
  • 的属性
  • 基本资源位置 - 您所有内容的所在位置(请参阅:https://stackoverflow.com/a/39019797/775715
  • Servlets列表
  • 过滤器列表
  • Servlet规范监听器列表
  • 保留您的Servlet规范会话配置
  • 保留您的Servlet规范身份验证配置
  • 欢迎文件配置
  • 特定于上下文的请求调度程序支持
  • 错误处理配置
  • Gzip响应压缩支持
  • 等...

ServletHolder - 特定servlet的配置

每个Servlet都可以配置为:

  • 感兴趣的网址模式
  • Init-Parameter map
  • 是否在开始时初始化?若然,以何种顺序?

注意:过滤器

还有一个FilterHolder等效项

Servlet - 处理请求并生成响应的低级端点资源

它使用标准Servlet行为处理原始请求。

过滤器 - Servlet之前可以参与请求/响应处理的组件。

相关问题