• 转: 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是不会被执行的

  • 相关阅读:
    Centos 5.5 Lamp源码包安装编译 新风宇宙
    Linux系统日志管理 新风宇宙
    ubuntu设置时区,网上同步时间 新风宇宙
    ubuntu vim输入中文设置(SecureCRT下) 新风宇宙
    DIV+CSS容易犯的十个错误 新风宇宙
    apache性能优化 新风宇宙
    java里面main函数为什么要用static修饰
    如何设计mysql数据库和数据表
    PHP 图片验证码
    PHP免费空间选择方法概述
  • 原文地址:https://www.cnblogs.com/shadowduke/p/5011402.html
Copyright © 2020-2023  润新知