原文地址:http://m.blog.csdn.net/blog/ghyg525/22928567
大家都知道在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是不會被執行的
