0

在我向以下 servlet 发出 GET 请求后,文本“In service method”被写入,无法解释。这是为什么?

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class MyServlet extends HttpServlet {
   public void service(HttpServletRequest req,
                       HttpServletResponse resp) throws IOException {
      Writer out = resp.getWriter();
      out.write("In Service method");
   }

   public void doGet(HttpServletRequest req, HttpServletResponse resp) 
                                                        throws IOException {
      Writer out = resp.getWriter();
      out.write("In get method");
   }
}
4

3 回答 3

2

的默认实现正是完成HttpServlet#service()这项工作。这是其 javadoc 的摘录:

从公共服务方法接收标准 HTTP 请求并将它们分派到此类中doXXX定义的方法。此方法是该方法的特定于 HTTP 的版本Servlet.service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)。无需重写此方法。

它根据 HTTP 方法委托给适当的 servlet 方法。例如,当request.getMethod()等于 时"GET",它委托给doGet()。顺便说一句,你也读过最后一句话吗?

无论如何,您基本上应该自己执行相同的工作。

@Override
public void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    Writer out = resp.getWriter();
    out.write("In Service method");

    if ("GET".equalsIgnoreCase(req.getMethod())) {
        doGet(req, resp);
    }
    // Check other methods as well!
}

或者只是调用该super方法,以便它可以完成它的工作。

@Override
public void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    Writer out = resp.getWriter();
    out.write("In Service method");
    super.service(req, resp);
}

或者根本不覆盖它。

于 2012-11-09T16:57:22.773 回答
1

从HttpServlet(第 607 行)读取代码将告诉您原因。service()负责委托给适当的 doXXX 方法。

您可能想阅读普通Servlet(或GenericServlet),而不是子类 HttpServlet。您将在文档中看到 Servlet 是协议独立的,而 HttpServlet 绝对是协议相关的。

于 2012-11-09T16:46:31.227 回答
1

HttpServlet 的 service 方法实际上是检查请求是 GET 还是 POST,然后根据请求的类型调用相应的方法。

于 2012-11-12T09:20:13.810 回答