【问题标题】:What is the difference between GenericServlet, HttpServlet and a Servlet?GenericServlet、HttpServlet 和 Servlet 有什么区别?
【发布时间】:2012-07-17 20:13:15
【问题描述】:

我正在寻找 javax.servlet.http.HttpServlet 之间的确切区别 ,javax.servlet.GenericServletjavax.Servlet 无法找到它。

“完全不同”是指

  1. 用法
  2. javax.servlet.GenericServlet 存在的原因

【问题讨论】:

标签: java servlets


【解决方案1】:

“完全不同”是什么意思? API 列出了确切的差异。

Servlet is an interface defining what a servlet must implement.

GenericServlet is just that, a generic, protocol-independent servlet.

HttpServlet is a servlet tied specifically to the HTTP protocol.

你是在问什么时候使用其中的任何一个?

一般来说,您会扩展 HttpServlet 以实现应用程序的 Web 层。

如果您正在编写自己的容器或自己处理所有内容,则可以实现 Servlet。您可以扩展 GenericServlet 以处理不同的协议,但您可能不会。

【讨论】:

  • You might implement Servlet if you're writing your own container or handling everything yourself+1
【解决方案2】:

javax.servlet

Servlet 是一种服务器端 Web 技术。顾名思义,它服务于客户端请求并接收来自服务器的响应。您必须实现 javax.Servlet (Interface) 来处理 servlet 工作。

javax.servlet.GenericServlet

签名:

public abstract class GenericServlet extends java.lang.Object implements Servlet, ServletConfig, java.io.Serializable
  1. GenericServlet 定义了一个通用的、独立于协议的 servlet。
  2. GenericServlet 提供了一个蓝图,让编写 servlet 变得更加容易。
  3. GenericServlet 提供简单版本的生命周期方法 init 和 destroy 以及 ServletConfig 接口中的方法。
  4. GenericServlet 实现 log 方法,在 ServletContext 接口。
  5. 要编写通用 servlet,只需覆盖 抽象 service() 方法。

javax.servlet.http.HttpServlet

签名:

public abstract class HttpServlet extends GenericServlet implements java.io.Serializable
  1. HttpServlet 定义了一个特定于 HTTP 协议的 servlet。
  2. HttpServlet给出了Http servlet的蓝图并使得编写 他们更容易。
  3. HttpServlet 扩展了 GenericServlet,因此继承了 属性 GenericServlet。

【讨论】:

【解决方案3】:

javax.servlet.Servlet 是接口,它定义了所有实现的方法——这就是接口通常做的事情。

javax.servlet.GenericServlet 与协议无关。它是抽象的,所以不能直接实例化。如果有一天你必须为 HTTP 以外的协议编写 servlet,它是可用的类来扩展。

javax.servlet.http.HttpServlet 是抽象类,如果你想通过 HTTP 协议进行通信,可以扩展。很可能您只需要关心这个。

您可以在链接后面找到更准确的信息。

【讨论】:

    【解决方案4】:

    -> 一个共同的特点是,这两个类都是抽象类。

    -> GenericServlet 是 HttpServlet 类的超类。

    -> 主要区别在于,HttpServlet 是依赖于协议的,而 GenericServlet 是独立于协议的。所以 GenericServlet 可以处理所有类型的协议,但 HttpServlet 只能处理 HTTP 特定的协议。

    -> GenericServlet 属于 javax.servlet 包。 HttpServlet 属于 javax.servlet.http 包

    -> GenericServlet 是一个抽象类,它扩展了 Object 并实现了 Servlet、ServletConfig 和 java.io.Serializable 接口。 HttpServlet 是一个抽象类,继承了 GenericServlet 并实现了 java.io.Serializable 接口。

    -> GenericServlet 仅支持 service() 方法,不包含 doGet() 和 doPost() 方法。 HttpServlet 还支持 doGet()、doPost()、doHead() 方法 (HTTP 1.0) 以及 doPut()、doOptions()、doDelete()、doTrace() 方法 (HTTP 1.1)。

    【讨论】:

      【解决方案5】:

      小服务程序:-

      1. Servlet 作为线程在 Web 容器中运行,而不是在单独的操作系统进程中。
      2. 第一次请求时只创建一个对象,其他请求共享同一个对象。
      3. Servlet 独立于平台。
      4. Servlet 速度很快。

      GenericServlet:-

      1. 适用于所有协议。
      2. 实现 Servlet 接口。
      3. 使用服务方法。

      HttpServlet:-

      1. 仅适用于 HTTP 协议。
      2. 继承 GenericServlet 类。
      3. 使用 doPost、doGet 方法代替服务方法。

      【讨论】:

        【解决方案6】:

        HttpServlet 特定于 HTTP 协议,因此它为 HTTP 动词提供方法:doGetdoPost 等,以及接受 HTTP 特定请求和响应的通用 service 方法的一个版本对象。它是Servlet 的一种特殊类型,实际上是一个非常小的接口。

        GenericServletServlet 接口的基本、协议中立的实现。通常,您会在 API 中找到类似的接口基本实现。在这种情况下,GenericServletServlet API 添加了一些功能:getServletNamegetServletInfo,以及 servlet 初始化参数的传递方法。 HttpServlet 通过扩展 GenericServlet 受益于这些添加。

        通常每个针对此 API 进行编码的人都使用 HttpServlet 来实现 HTTP Web 服务,但也可以扩展或使用 GenericServlet 来使用自定义协议或其他现有协议(例如 FTP)来实现服务器/服务功能.

        【讨论】:

          【解决方案7】:

          Servlet 是一个包含五个抽象方法的接口,为了使用 servlet,我们必须为所有这五个方法提供一个实现,这是一个令人头疼的问题。为了避免这种复杂性,我们为下一级提供了 GenericServlet 和 HttpServlet。

          GenericServlet 是独立于协议的,这意味着它可以接受任何协议请求。 GenericServlet 可以转发和包含请求,但我们不能重定向请求。 在 GenericServlet 中无法使用 cookie 和 HttpSession 进行会话管理。 在 GenericServlet 中,无法为 get 和 post 请求定义单独的逻辑。

          HttpServlet 依赖于协议。这意味着,它只接受 HTTP 协议请求。 HttpServlet 可以转发、包含和重定向请求。 在 HttpServlet 中可以使用 cookie 和 HttpSession 进行会话管理。 在 HttpServlet 中,可以为 get 和 post 请求定义单独的逻辑。

          【讨论】:

          • 我喜欢你的回答。也请喜欢我的回答。
          【解决方案8】:
          1. Servlet 接口
            它是 GenericServletHttpServlet 的超级接口。它包含 5 个抽象方法,全部由 GenericServlet 和 HttpServlet 继承。
            • 问题
              如果你想通过实现 Servlet 接口来创建 servlet,即使程序员不感兴趣,也应该重写接口 Servlet 的所有 5 个抽象方法
            • 用法
              如果您想开发自己的容器,请仅实现 Servlet 接口。
          2. GenericServlet
            它是 Servlet 接口的直接子类和 HttpServlet 的超类。在这个类中,存在一个抽象方法:service()。其他4个抽象方法在这个类中实现。
            • 问题
              除了 service() 方法外,所有方法都是具体的,所以你必须将它实现为回调方法。
            • 用法
              它独立于协议,因此可以与任何协议一起使用,如 FTP、SMTP、HTTP 等。
          3. HttpServlet
            它是 GenericServlet 和 Servlet 接口的子类。 HttpServlet 的直接超类是 GenericServlet。 HttpServlet 不包含任何抽象方法。尽管 HttpServlet 不包含任何抽象方法,但设计者将其声明为抽象类,不允许任何人直接创建对象,因为 Servlet 对象是由 Servlet 容器创建的。
            • 问题
              HttpServlet 依赖于协议,仅用于特定于 HTTP 协议。
            • 用法
              service() 方法不需要被覆盖。它可以被具有相同参数的 doGet() 或 doPost() 方法替换。它最常用的创建servlet的方法。


              hierarchy
              参考:way2java.com

          【讨论】:

            【解决方案9】:

            -->GenericServlet 可以处理来自单个表单的多个客户端请求。而HttpServlet 可以处理来自多个HTML 表单的多个客户端的请求。

            --> GenericServlet 是无状态的,HttpServlet 是有状态的。

            【讨论】:

              【解决方案10】:

              javax.servlet 包中的所有类、接口和方法都是协议独立(对所有协议通用)。

              相比之下,javax.servlet.http 包中的所有类、接口和方法都依赖于协议(特定于 HTTP 协议)

              【讨论】:

                【解决方案11】:
                1. http servlet 是一个特定的类,它只允许 http 协议,不允许其他协议,如 ftp smtp
                2. 通用 servlet 允许所有类型的协议只有一个抽象方法是服务方法,其他四种方法是具体方法
                3. 通用 servlet 是 http servlet 的超类

                【讨论】:

                  猜你喜欢
                  • 2010-12-01
                  • 2011-01-06
                  • 2011-03-18
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-04-28
                  • 2018-06-09
                  相关资源
                  最近更新 更多