httpservlet的public service()方法和protected service()方法有什么区别

时间:2015-12-03 16:34:00

标签: java servlets service

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

我对这两种服务方法感到有些困惑。请澄清我

4 个答案:

答案 0 :(得分:3)

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

Servlet容器始终调用Servlet接口中定义的服务方法。这个服务方法的HttpServlet实现只是用HttpServletRequest和HttpServletResponse调用服务mehtod。

您可以在

中看到方法的定义
protected void service(HttpServletRequest req,
                       HttpServletResponse resp)
                throws ServletException,
                       java.io.IOException
  

从公共服务方法接收标准HTTP请求   将它们分派给此类中定义的doXXX方法。这个   method是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

答案 1 :(得分:2)

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

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

[编辑] 您应该了解Java interfaces and classes之间的区别。

当你看到一些代码时,可能会更容易理解:

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

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

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

答案 2 :(得分:1)

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

此方法只调用内部方法 protected void service(HttpServletRequest req,HttpServletResponse resp)     抛出ServletException,IOException。

答案 3 :(得分:1)

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

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

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

  1. 实现javax.servlet.Servlet接口。在这种情况下,servlet必须提供服务方法的实现,并且它将被调用。
  2. 请参阅:https://docs.oracle.com/javaee/7/api/javax/servlet/Servlet.html

    1. 扩展javax.servlet.GenericServlet抽象类。这提供了一些默认方法实现,但是您的servlet仍然必须提供和实现服务方法,并且它将被调用。
    2. 请参阅:https://docs.oracle.com/javaee/7/api/javax/servlet/GenericServlet.html

      1. 扩展javax.servlet.http.HttpServlet抽象类。这提供了服务方法的默认实现,因此如果不重写此实现,将调用HttpServlet的服务方法。
      2. 请注意,3是推荐使用的方法,因为默认服务方法将调用它的受保护版本,然后处理入站方法并根据需要调用doGet,doPost,doHead等。

        请参阅:https://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpServlet.html