HttpServlet里的三个方法:service(HttpServletRequest req, HttpServletResponse resp) ,doGet(HttpServletRequest req, HttpServletResponse resp), doPost(HttpServletRequest req, HttpServletResponse res)的区别和联系:

  1. 在servlet中默认情况下,无论你是get还是post 提交过来 都会经过service()方法来处理,然后转向到doGet
  2. 或是doPost方法,我们可以查看HttpServlet 类的service方法:  我在tomcat的lib目录下,解压servlet-api.jar,然后用反编译软件把lib\javax\servlet\http下的HttpServlet.class反编译,看里头的service()方法的原代码:查看源码发现,httpservlet继承genericservlet并实现了service方法,从实现来看service起到了调度的作用。因此自定义servlet继承httpservlet不需要覆盖重写service方法,只需覆盖重写doget或者dopost方法。
  3. 注意,sun只是定义了servlet接口,而实现servlet接口的就是类似于tomcat的服务器,所以我是在tomcat的安装目录下找到实现的类。

public abstract class HttpServlet extends GenericServlet {

protected void service(HttpServletRequest req, HttpServletResponse resp)

        throws ServletException, IOException
    {
        String method = req.getMethod();
        if(method.equals("GET"))
        {
            long lastModified = getLastModified(req);
            if(lastModified == -1L)
            {
                doGet(req, resp);
            } else
            {
                long ifModifiedSince = req.getDateHeader("If-Modified-Since");
                if(ifModifiedSince < (lastModified / 1000L) * 1000L)
                {
                    maybeSetLastModified(resp, lastModified);
                    doGet(req, resp);
                } else
                {
                    resp.setStatus(304);
                }
            }
        } else
        if(method.equals("HEAD"))
        {
            long lastModified = getLastModified(req);
            maybeSetLastModified(resp, lastModified);
            doHead(req, resp);
        } else
        if(method.equals("POST"))
            doPost(req, resp);
        else
        if(method.equals("PUT"))
            doPut(req, resp);
        else
        if(method.equals("DELETE"))
            doDelete(req, resp);
        else
        if(method.equals("OPTIONS"))
            doOptions(req, resp);
        else
        if(method.equals("TRACE"))
        {
            doTrace(req, resp);
        } else
        {
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object errArgs[] = new Object[1];
            errArgs[0] = method;
            errMsg = MessageFormat.format(errMsg, errArgs);
            resp.sendError(501, errMsg);
        }
    }}
  1. 从上面可以看出 这里的service是用来转向的,但是如果你在自己的servlet类中覆盖了service方法,比如说你的service是这样的:
  2. Java代码
  3. 1.publicvoid service(ServletRequest req, ServletResponse res)
  4. 2.                   throws ServletException, IOException {
  5. 3.          res.getOutputStream().print(
  6. 4.         "image is <img src='images/downcoin.gif'></img><br>");
  7. 5.      }
    1. 那么这时service就不是用来转向的,而是用来处理业务的,现在不论你的客户端是用pos还是get来请求此servlet
    2. 都会执行service方法也只能执行servlet方法,不会去执行doPost或是doGet方法。
    3. 比如说:你的客户端代码是:
    4. Java代码
    5. 1. <%@page contentType="text/html; charset=utf-8"%>
    6. 2. <html>
    7. 3. <head><title>选择</title></head>
    8. 4. <body>
    9. 5. 请选择你喜欢的水果:<br>
    10. 6. <form action ="Test" method = "post">
    11. 7. <input type="checkbox" name="fruit" value ="apple" >苹果<br>
    12. 8. <input type="checkbox" name="fruit" value ="orange">桔子<br>
    13. 9. <input type="checkbox" name="fruit" value ="mango">芒果<br>
    14. 10. <input type="submit" value="提交">
    15. 11. </form>
    16. 12. </body>
    17. 13. </html>
    18. 14.
    19. 15. 服务端servlet是:Test类
    20. 16.
    21. 17.import java.io.IOException;
    22. 18.
    23. 19.import javax.servlet.ServletException;
    24. 20.import javax.servlet.ServletOutputStream;
    25. 21.import javax.servlet.ServletRequest;
    26. 22.import javax.servlet.ServletResponse;
    27. 23.import javax.servlet.http.HttpServlet;
    28. 24.import javax.servlet.http.HttpServletRequest;
    29. 25.import javax.servlet.http.HttpServletResponse;
    30. 26.
    31. 27./**
    32. 28. * 演示service方法
    33. 29. */
    34. 30.publicclass Testextends HttpServlet {
    35. 31.
    36. 32.publicvoid service(ServletRequest req, ServletResponse res)
    37. 33.   throws ServletException, IOException {
    38. 34.             res.getOutputStream().print("This is the service");
    39. 35.
    40. 36. }
    41. 37.
    42. 38.protectedvoid doGet(HttpServletRequest request,
    43. 39.     HttpServletResponse response)throws ServletException, IOException {
    44. 40.    doPost(request,response);
    45. 41.
    46. 42. }
    47. 43.protectedvoid doPost(HttpServletRequest request,
    48. 44.     HttpServletResponse response)throws ServletException, IOException {
    49. 45.    ServletOutputStream out=response.getOutputStream();
    50. 46.    String[] args=(String[])request.getParameterValues("fruit");
    51. 47.  for(int i=0;i<args.length;i++){
    52. 48.     out.print(args[i]+"<br>");
    53. 49.    }
    54. 50.
    55. 51. }
    56. 52. }
    57. 点击提交后:页面输出结果为“This is the service“;

httpservlet的service()、doget()、dopost方法的更多相关文章

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

    原文地址:http://m.blog.csdn.net/blog/ghyg525/22928567 大家都知道在javax.servlet.Servlet接口中只有init, service, des ...

  2. servlet中service() doGet() doPost() 方法

    HttpServlet 里的三个方法:service(HttpServletRequest req, HttpServletResponse resp) ,doGet(HttpServletReque ...

  3. servlet 中 service ,doGet , doPost 关系

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2 ...

  4. doget,doPost在底层走的是service

    doget,doPost在底层走的是service 因为在源码上 先执行service方法 然后再调用doget,doPost方法

  5. 自定义servlet重写doGet或者doPost方法时,405 method not allowed

    自定义servlet public class TestServlet extends HttpServlet { @Override protected void doGet(HttpServlet ...

  6. Servlet的Service方法和doget 和 dopost方法的区别,常见的错误解析

    package com.sxt.in; import java.io.IOException; import javax.servlet.ServletException; import javax. ...

  7. service 方法和doGet、doPost方法的区别

    Service方法和doGet和doPost方法的区别service:     可以处理get/post方式的请求,如果servlet 中有service方法,会优先调用service方法进行处理do ...

  8. 关于HttpServlet和Servlet以及doPost和doGet关系

    这两天在看Servlet和Jsp,spring太难了,还是先看看基础,只怪自己太弱了. Servlet是一个接口,本身定义的是一种网络服务,HttpServlet是已经实现了Servlet接口,也就是 ...

  9. HttpServlet中service方法的源码解读

    前言     最近在看<Head First Servlet & JSP>这本书, 对servlet有了更加深入的理解.今天就来写一篇博客,谈一谈Servlet中一个重要的方法-- ...

随机推荐

  1. 【BZOJ4942】[Noi2017]整数 线段树+DFS(卡过)

    [BZOJ4942][Noi2017]整数 题目描述去uoj 题解:如果只有加法,那么直接暴力即可...(因为1的数量最多nlogn个) 先考虑加法,比较显然的做法就是将A二进制分解成log位,然后依 ...

  2. 20179209课后作业之od命令重写

    一.问题描述: 1 复习c文件处理内容 2 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能 3. main与其他分开,制作静态库和动态库 4. 编写Makefi ...

  3. 【题解】 AT2134 Zigzag MST

    [题解]AT2134 Zigzag MST 一道MST好题 \(Anson\)有云: 要么是减少边的数量. 要么是改变连接边的方式. 那么如何减少边的数量呢?很简单,把所有不可能对答案产生贡献的边去掉 ...

  4. UITableViewCell的多选操作

    版权声明:本文为博主原创文章.未经博主同意不得转载,转载需加上原博客链接. https://blog.csdn.net/panyong4627/article/details/37902207 - ( ...

  5. Linux入门基础(三)——系统命令

  6. long_query_time 设置不生效问题

    由于原来的慢查询日志太大了,有1G多,并且其中包含上一次查询优化前的慢sql,所以想收集最近两天的慢查询语句,故 mysql> show global variables like 'slow% ...

  7. web 全栈 学习 2 一个好的页面是如何炼成的

    第一章:Web页面内容的构成2.Web内容的分工一个Web页面可能的构成(视觉上看):①文字.链接.标题②交互入口(表单元素)③图片(哪些类型)④动画 Flash动画 HTML5 CSS3 动画⑤音视 ...

  8. web 全栈 学习 1 工程师成长思路图

    第一部分: 技术的三个阶段 实现 ---> 借鉴 ---> 优化 实现:为了实现功能,不考虑可读性.借鉴:阅读开源代码,开源程序,学到编程思想.优化:可读性,可执行. 阶段一:实现多做事, ...

  9. Linux内核同步【转】

    本文转载自:http://blog.csdn.net/a775992553/article/details/8797710 Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发访 ...

  10. 51Nod 1376 最长递增子序列的数量 —— LIS、线段树

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1376 1376 最长递增子序列的数量 基准时间限制:1 秒 空 ...