1. 程式人生 > >servlet中的service, doGet, doPost方法的區別和聯絡

servlet中的service, doGet, doPost方法的區別和聯絡

大家都知道在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是不會被執行的