【问题标题】:what is the difference between public service() method and protected service() method of httpservlethttpservlet的public service()方法和protected service()方法有什么区别
【发布时间】:2015-12-03 16:33:59
【问题描述】:

Servlet 接口由服务方法组成,Httpservlet 也包含自己特定的服务方法。在 servlet 生命周期中,在 init 方法之后调用 HttpServlet 的公共服务方法。如果调用Httpservlet类的受保护服务方法时是这样?

我对这两种服务方法有点困惑。请澄清一下

【问题讨论】:

    标签: java servlets service


    【解决方案1】:

    Servlet 接口定义了所有 servlet 必须实现的方法,HttpServlet 是一个抽象类,需要扩展(继承)以创建适合 Web 应用程序(网站或在线应用程序)的 HttpServlet。

    Servlet 容器总是调用 Servlet 接口中定义的服务方法。该服务方法的 HttpServlet 实现只是调用带有 HttpServletRequest 和 HttpServletResponse 的服务方法。

    可以看到方法的定义

    protected void service(HttpServletRequest req,
                           HttpServletResponse resp)
                    throws ServletException,
                           java.io.IOException
    

    从公共服务方法接收标准 HTTP 请求,并 将它们分派到此类中定义的 doXXX 方法。这 方法是 HTTP 特定版本的 Servlet.service(javax.servlet.ServletRequest, javax.servlet.ServletResponse) 方法。没有必要覆盖 这个方法。

    public void service(ServletRequest req,
                        ServletResponse res)
                 throws ServletException,
                        java.io.IOException
    

    将客户端请求分派到受保护的服务方法。没有 需要重写这个方法。

    你可以在这里看到更多

    http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServlet.html

    【讨论】:

    • 所以你的意思是web容器调用Servlet.service()方法,然后调用HttpServlet.service()方法?
    • 是的,在文档中。将客户端请求分派到受保护的服务方法。无需重写此方法。
    • 但是其他人说 HttpServlet.service() 是由容器调用的,而 Servlet.service() 永远不会被调用。请参阅下面的答案
    • 在我的回答中是黄色的,就是api官方网站上的定义
    • 感谢您的回答。我受够了这种混乱
    【解决方案2】:

    javax.servlet.Servlet 是一个由javax.servlet.http.HttpServlet 实现的接口。这意味着Servlet 的方法永远不会被调用;一个接口只是定义了一个 API - 它背后没有实现。

    servlet 生命周期将确保首先调用HttpServletinit() 方法。当请求与 servlet 的 URL 匹配时,容器将调用 HttpServlet.service() 以区分各种 HTTP 类型(GETPOST、...)并调用正确的处理程序方法(doGet()、@987654331 @, ...)。

    [编辑]你应该阅读Java interfaces and classes之间的区别。

    也许看到一些代码会更容易理解:

    Servlet servlet = new HttpServlet(...);
    ...
    servlet.init();
    ...
    servlet.service(...);
    

    ... 的意思是“这里发生了一些事情,但理解这个例子并不重要”。

    通过扩展HttpServlet 创建一个真正的servlet。此类实现Servlet 接口。这意味着任务有效。编译器将使用Servlet 中定义的方法来确定servlet.init() 是否有效。但是在运行时,方法HttpServlet.init()会被调用。

    【讨论】:

    • 当我在互联网上搜索时,每一个写着实现方法服务(ServletRequest,ServletResponse)的地方都是在init方法之后调用的。但是我的疑惑是什么时候调用HttpServlet类的service(HttpServletRequest,HttpServletResponse)方法?
    • @Perdomoff 那么如何调用 HttpServlet.service() 方法呢?
    • @Aaron 如果从不调用 servlet 的方法,那么如何调用 Servlet.init() 方法?你的意思是 Servlet.service() 永远不会被调用?
    • @AKHILMATHEW:Servlet.init() 无法调用,因为没有可以运行的代码。将调用的是HttpServlet.init()
    • 其实有些混乱。很抱歉给您带来不便。
    【解决方案3】:

    Servlet 是一个接口。所以,它没有实现。 如果您看到 Servlet.service() 调用,实际上是在调用 HttpServlet 类中的实现。 如果您检查 HttpServlet 类,它有 2 个服务方法。 首先是 Servlet 接口中的实现 公共无效服务(ServletRequest req,ServletResponse res) 抛出 ServletException、IOException

    这个方法只是调用内部方法 受保护的无效服务(HttpServletRequest req,HttpServletResponse resp) 抛出 ServletException、IOException。

    【讨论】:

    【解决方案4】:

    对于入站请求,容器调用目标 servlet 的服务方法:

    protected void service(HttpServletRequest req,
                       HttpServletResponse resp)
                throws ServletException,
                       java.io.IOException
    

    目标 servlet 可以通过多种方式实现:

    1. 实现 javax.servlet.Servlet 接口。在这种情况下,servlet 必须提供服务方法的实现,并且它将被调用。

    见:https://docs.oracle.com/javaee/7/api/javax/servlet/Servlet.html

    1. 扩展 javax.servlet.GenericServlet 抽象类。这提供了一些默认方法实现,但您的 servlet 仍必须提供服务方法的实现,并且它将被调用。

    见:https://docs.oracle.com/javaee/7/api/javax/servlet/GenericServlet.html

    1. 扩展 javax.servlet.http.HttpServlet 抽象类。这提供了服务方法的默认实现,因此如果您不覆盖此实现,则将调用 HttpServlet 的服务方法。

    请注意,建议使用 3 方法,因为默认服务方法将调用它的受保护版本,然后处理入站方法并酌情调用 doGet、doPost、doHead 等。

    见:https://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpServlet.html

    【讨论】:

      猜你喜欢
      • 2015-01-23
      • 2017-08-21
      • 2011-03-17
      • 2020-03-04
      • 1970-01-01
      • 2014-08-19
      • 1970-01-01
      • 2019-11-08
      • 2011-12-07
      相关资源
      最近更新 更多