Servlet接口由服务方法组成,Httpservlet也包含自己的特定服务方法。在servlet生命周期中,在init方法之后调用HttpServlet的公共服务方法。如果是这样,当调用Httpservlet类的受保护服务方法时?
我对这两种服务方法感到有些困惑。请澄清我
答案 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类型(GET
,POST
,...)并调用正确的处理程序方法( 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可以通过多种方式实现:
请参阅:https://docs.oracle.com/javaee/7/api/javax/servlet/Servlet.html
请参阅:https://docs.oracle.com/javaee/7/api/javax/servlet/GenericServlet.html
请注意,3是推荐使用的方法,因为默认服务方法将调用它的受保护版本,然后处理入站方法并根据需要调用doGet,doPost,doHead等。
请参阅:https://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpServlet.html