HttpServlet里的三個方法:service(HttpServletRequest req, HttpServletResponse resp) ,doGet(HttpServletRequest req, HttpServletResponse resp), doPost(HttpServletRequest req, HttpServletResponse res)的區別和聯系:
- 在servlet中默認情況下,無論你是get還是post 提交過來 都會經過service()方法來處理,然后轉向到doGet
- 或是doPost方法,我們可以查看HttpServlet 類的service方法: 我在tomcat的lib目錄下,解壓servlet-api.jar,然后用反編譯軟件把lib\javax\servlet\http下的HttpServlet.class反編譯,看里頭的service()方法的原代碼:查看源碼發現,httpservlet繼承genericservlet並實現了service方法,從實現來看service起到了調度的作用。因此自定義servlet繼承httpservlet不需要覆蓋重寫service方法,只需覆蓋重寫doget或者dopost方法。
- 注意,sun只是定義了servlet接口,而實現servlet接口的就是類似於tomcat的服務器,所以我是在tomcat的安裝目錄下找到實現的類。
public abstract class HttpServlet extends GenericServlet {
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String method = req.getMethod();
if(method.equals("GET"))
{
long lastModified = getLastModified(req);
if(lastModified == -1L)
{
doGet(req, resp);
} else
{
long ifModifiedSince = req.getDateHeader("If-Modified-Since");
if(ifModifiedSince < (lastModified / 1000L) * 1000L)
{
maybeSetLastModified(resp, lastModified);
doGet(req, resp);
} else
{
resp.setStatus(304);
}
}
} else
if(method.equals("HEAD"))
{
long lastModified = getLastModified(req);
maybeSetLastModified(resp, lastModified);
doHead(req, resp);
} else
if(method.equals("POST"))
doPost(req, resp);
else
if(method.equals("PUT"))
doPut(req, resp);
else
if(method.equals("DELETE"))
doDelete(req, resp);
else
if(method.equals("OPTIONS"))
doOptions(req, resp);
else
if(method.equals("TRACE"))
{
doTrace(req, resp);
} else
{
String errMsg = lStrings.getString("http.method_not_implemented");
Object errArgs[] = new Object[1];
errArgs[0] = method;
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(501, errMsg);
}
}}
- 從上面可以看出 這里的service是用來轉向的,但是如果你在自己的servlet類中覆蓋了service方法,比如說你的service是這樣的:
- Java代碼
- 1.publicvoid service(ServletRequest req, ServletResponse res)
- 2. throws ServletException, IOException {
- 3. res.getOutputStream().print(
- 4. "image is <img src='images/downcoin.gif'></img><br>");
- 5. }
-
- 那么這時service就不是用來轉向的,而是用來處理業務的,現在不論你的客戶端是用pos還是get來請求此servlet
- 都會執行service方法也只能執行servlet方法,不會去執行doPost或是doGet方法。
- 比如說:你的客戶端代碼是:
- Java代碼
- 1. <%@page contentType="text/html; charset=utf-8"%>
- 2. <html>
- 3. <head><title>選擇</title></head>
- 4. <body>
- 5. 請選擇你喜歡的水果:<br>
- 6. <form action ="Test" method = "post">
- 7. <input type="checkbox" name="fruit" value ="apple" >蘋果<br>
- 8. <input type="checkbox" name="fruit" value ="orange">桔子<br>
- 9. <input type="checkbox" name="fruit" value ="mango">芒果<br>
- 10. <input type="submit" value="提交">
- 11. </form>
- 12. </body>
- 13. </html>
- 14.
- 15. 服務端servlet是:Test類
- 16.
- 17.import java.io.IOException;
- 18.
- 19.import javax.servlet.ServletException;
- 20.import javax.servlet.ServletOutputStream;
- 21.import javax.servlet.ServletRequest;
- 22.import javax.servlet.ServletResponse;
- 23.import javax.servlet.http.HttpServlet;
- 24.import javax.servlet.http.HttpServletRequest;
- 25.import javax.servlet.http.HttpServletResponse;
- 26.
- 27./**
- 28. * 演示service方法
- 29. */
- 30.publicclass Testextends HttpServlet {
- 31.
- 32.publicvoid service(ServletRequest req, ServletResponse res)
- 33. throws ServletException, IOException {
- 34. res.getOutputStream().print("This is the service");
- 35.
- 36. }
- 37.
- 38.protectedvoid doGet(HttpServletRequest request,
- 39. HttpServletResponse response)throws ServletException, IOException {
- 40. doPost(request,response);
- 41.
- 42. }
- 43.protectedvoid doPost(HttpServletRequest request,
- 44. HttpServletResponse response)throws ServletException, IOException {
- 45. ServletOutputStream out=response.getOutputStream();
- 46. String[] args=(String[])request.getParameterValues("fruit");
- 47. for(int i=0;i<args.length;i++){
- 48. out.print(args[i]+"<br>");
- 49. }
- 50.
- 51. }
- 52. }
- 點擊提交后:頁面輸出結果為“This is the service“;