【发布时间】:2015-12-03 16:33:59
【问题描述】:
Servlet 接口由服务方法组成,Httpservlet 也包含自己特定的服务方法。在 servlet 生命周期中,在 init 方法之后调用 HttpServlet 的公共服务方法。如果调用Httpservlet类的受保护服务方法时是这样?
我对这两种服务方法有点困惑。请澄清一下
【问题讨论】:
Servlet 接口由服务方法组成,Httpservlet 也包含自己特定的服务方法。在 servlet 生命周期中,在 init 方法之后调用 HttpServlet 的公共服务方法。如果调用Httpservlet类的受保护服务方法时是这样?
我对这两种服务方法有点困惑。请澄清一下
【问题讨论】:
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
【讨论】:
javax.servlet.Servlet 是一个由javax.servlet.http.HttpServlet 实现的接口。这意味着Servlet 的方法永远不会被调用;一个接口只是定义了一个 API - 它背后没有实现。
servlet 生命周期将确保首先调用HttpServlet 的init() 方法。当请求与 servlet 的 URL 匹配时,容器将调用 HttpServlet.service() 以区分各种 HTTP 类型(GET、POST、...)并调用正确的处理程序方法(doGet()、@987654331 @, ...)。
[编辑]你应该阅读Java interfaces and classes之间的区别。
也许看到一些代码会更容易理解:
Servlet servlet = new HttpServlet(...);
...
servlet.init();
...
servlet.service(...);
... 的意思是“这里发生了一些事情,但理解这个例子并不重要”。
通过扩展HttpServlet 创建一个真正的servlet。此类实现Servlet 接口。这意味着任务有效。编译器将使用Servlet 中定义的方法来确定servlet.init() 是否有效。但是在运行时,方法HttpServlet.init()会被调用。
【讨论】:
Servlet.init() 无法调用,因为没有可以运行的代码。将调用的是HttpServlet.init()。
Servlet 是一个接口。所以,它没有实现。 如果您看到 Servlet.service() 调用,实际上是在调用 HttpServlet 类中的实现。 如果您检查 HttpServlet 类,它有 2 个服务方法。 首先是 Servlet 接口中的实现 公共无效服务(ServletRequest req,ServletResponse res) 抛出 ServletException、IOException
这个方法只是调用内部方法 受保护的无效服务(HttpServletRequest req,HttpServletResponse resp) 抛出 ServletException、IOException。
【讨论】:
对于入站请求,容器调用目标 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
【讨论】: