【问题标题】:Server vs ServletContextHandler vs ServletHolder vs Servlet服务器 vs ServletContextHandler vs ServletHolder vs Servlet
【发布时间】:2018-10-08 13:50:54
【问题描述】:

我正在研究一个使用 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?

【问题讨论】:

    标签: java jetty


    【解决方案1】:

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

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

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

    负责:

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

    例子:

    / 代表根

    http://machine.com/foo 的请求将点击ServletContext 并处理其中映射的任何资源/foo

    /app 用于特定应用

    http://machine.com/app/bar 的请求将在/app 处访问ServletContext,并处理其中为资源/bar 映射的任何内容

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

    ServletHolder - 特定 servlet 的配置

    每个 Servlet 可以配置为:

    • 感兴趣的 URL 模式
    • 初始化参数映射
    • 是否在启动时初始化?如果有,按什么顺序?

    注意:还有一个 FilterHolder 等价于过滤器

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

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

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

    【讨论】:

    • 你能澄清一下哪些部分是由 Servlet 规范定义的,哪些是由 Jetty 定义的?
    • 这是一个灰色地带。几乎所有做出的决定都在某种程度上受到 Servlet 规范的影响。如果它很重要,请注意 Servlet API 类/包,这将为您提供有关什么是什么的提示。除了服务器和“Gzip 响应压缩支持”之外,我上面列出的所有内容都是直接或间接的 Servlet 规范的一部分。
    • 您知道,这是 Servlet 的冰山一角,是对您特别询问的类的介绍。还有更多需要熟悉的内容。
    猜你喜欢
    • 1970-01-01
    • 2014-08-30
    • 2016-12-01
    • 2011-08-13
    • 2018-06-06
    • 2016-02-09
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    相关资源
    最近更新 更多