为什么一旦我们覆盖service(),委托就永远不会到达doGet()?

时间:2012-11-09 16:44:05

标签: servlets

在向以下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");
   }
}

3 个答案:

答案 0 :(得分:2)

HttpServlet#service()的默认实现确实exactly该作业。这是javadoc的摘录:

  

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

它根据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);
}

或者根本不要覆盖它。

答案 1 :(得分:1)

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

您可能希望阅读普通Servlets(或GenericServlet),而不是子类HttpServlet。您将在文档中看到的是Servlet与协议无关,而HttpServlet肯定是协议依赖的。

答案 2 :(得分:1)

HttpServlet的服务方法实际检查请求是GET还是POST。然后,它根据请求的类型调用适当的方法。