[转]servlet中的service, doGet, doPost方法的区别和联系

原文地址: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是不会被执行的

posted @ 2015-12-01 15:49  dirgo  阅读(10470)  评论(1编辑  收藏  举报