Service、doGet、doPost 方法的区别

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。

发布了178 篇原创文章 · 获赞 14 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/ZGL_cyy/article/details/104444306
今日推荐