Servlet中的service方法用于应答浏览器请求,每次请求都会调用该方法。
ServletRequest:封装了请求信息,可以从中获取到任何的请求信息。
ServletResponse:封装了响应信息,用于响应用户请求。
这两个接口都是服务器给予实现的,并在服务器调用service方法时传入。
大家都知道在javax.servlet.Servlet接口中只有init, service, destroy方法但是我们在继承HttpServlet的时候为何一般重写doGet和doPost方法呢?
下面我们看一下Servlet源代码:
//注意: JDK只是定义了servlet接口,而实现servlet接口的比如tomcat, jboss等服务器
上面我们找到tomcat源代码, 可以到官网下载, 目前最新版本是7.0.53找到javax.servlet.http.HttpServlet类, 下面是service方法部分源代码:
可以很清楚的看到, 在tomcat的实现中, service方法只起到了类似调度的功能
所以我们平时只重写doGet或doPost方法后, 会自动按请求类型匹配执行
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String method = req.getMethod();
if (method.equals(METHOD_GET)) {
...
doGet(req, resp);
...
} else if (method.equals(METHOD_HEAD)) {
long lastModified = getLastModified(req);
maybeSetLastModified(resp, lastModified);
doHead(req, resp);
} else if (method.equals(METHOD_POST)) {
doPost(req, resp);
} else if (method.equals(METHOD_PUT)) {
doPut(req, resp);
} else if (method.equals(METHOD_DELETE)) {
doDelete(req, resp);
} else if (method.equals(METHOD_OPTIONS)) {
doOptions(req,resp);
} else if (method.equals(METHOD_TRACE)) {
doTrace(req,resp);
} else {
...
}
}
可见tomcat实现的service方法只是起到了调度请求的作用
如果我们重写了service方法, 父类HttpServlet中的service方法就会失效
所以收到的任何请求都会由我们自己覆写的service方法来处理
如果我们的servlet中只有service方法, 是没有问题的
但值得注意的是, 如果你同时重写了service和doGet, doPost方法
一定要在执行完自己代码后调用父类service方法, super.service;
否自你的doGet和doPost是不会被执行的
主要区别:
Service 方法: 不管是 get 方式还是 post 方式的请求,如果 Servlet 类中有service 方法,则优先调用 Service 方法。
doGet 方法: 在没有 service 方法的情况下如果是 get 方式的请求所调的处理请求的方法
doPost 方法: 在没有 service 方法的情况下如果是 post 方式的请求所调用的处理请求的方法造成的常见错误:
405错误:请求方式不支持
原因:请求方式和servlet中的方法不匹配所造成的。*
解决:尽量使用 service 方法进行请求处理,并且不要再 service 方法中调用父类的service。