在向以下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");
}
}
答案 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。然后,它根据请求的类型调用适当的方法。