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。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵广陆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值