httpservlet的service()、doget()、dopost方法

简介: HttpServlet里的三个方法:service(HttpServletRequest req, HttpServletResponse resp) ,doGet(HttpServletRequest req, HttpServletResponse resp), doPost(HttpSer...

 

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.  
  3. Java代码 
  4.  
  5.    1.publicvoid service(ServletRequest req, ServletResponse res)    
  6.    2.                   throws ServletException, IOException {    
  7.    3.          res.getOutputStream().print(    
  8.    4.         "image is <img src='images/downcoin.gif'></img><br>");    
  9.    5.      }   
    1. 那么这时service就不是用来转向的,而是用来处理业务的,现在不论你的客户端是用pos还是get来请求此servlet 
    2.  
    3. 都会执行service方法也只能执行servlet方法,不会去执行doPost或是doGet方法。 
    4.  
    5. 比如说:你的客户端代码是: 
    6. Java代码 
    7.  
    8.    1. <%@page contentType="text/html; charset=utf-8"%>    
    9.    2. <html>    
    10.    3. <head><title>选择</title></head>    
    11.    4. <body>    
    12.    5. 请选择你喜欢的水果:<br>    
    13.    6. <form action ="Test" method = "post">    
    14.    7. <input type="checkbox" name="fruit" value ="apple" >苹果<br>    
    15.    8. <input type="checkbox" name="fruit" value ="orange">桔子<br>    
    16.    9. <input type="checkbox" name="fruit" value ="mango">芒果<br>    
    17.   10. <input type="submit" value="提交">    
    18.   11. </form>    
    19.   12. </body>    
    20.   13. </html>    
    21.   14.    
    22.   15. 服务端servlet是:Test类    
    23.   16.    
    24.   17.import java.io.IOException;    
    25.   18.    
    26.   19.import javax.servlet.ServletException;    
    27.   20.import javax.servlet.ServletOutputStream;    
    28.   21.import javax.servlet.ServletRequest;    
    29.   22.import javax.servlet.ServletResponse;    
    30.   23.import javax.servlet.http.HttpServlet;    
    31.   24.import javax.servlet.http.HttpServletRequest;    
    32.   25.import javax.servlet.http.HttpServletResponse;    
    33.   26.    
    34.   27./**
    35.   28. * 演示service方法
    36.   29. */   
    37.   30.publicclass Testextends HttpServlet {    
    38.   31.    
    39.   32.publicvoid service(ServletRequest req, ServletResponse res)    
    40.   33.   throws ServletException, IOException {    
    41.   34.             res.getOutputStream().print("This is the service");    
    42.   35.    
    43.   36. }    
    44.   37.    
    45.   38.protectedvoid doGet(HttpServletRequest request,    
    46.   39.     HttpServletResponse response)throws ServletException, IOException {    
    47.   40.    doPost(request,response);    
    48.   41.    
    49.   42. }    
    50.   43.protectedvoid doPost(HttpServletRequest request,    
    51.   44.     HttpServletResponse response)throws ServletException, IOException {    
    52.   45.    ServletOutputStream out=response.getOutputStream();    
    53.   46.    String[] args=(String[])request.getParameterValues("fruit");    
    54.   47.  for(int i=0;i<args.length;i++){    
    55.   48.     out.print(args[i]+"<br>");    
    56.   49.    }    
    57.   50.       
    58.   51. }    
    59.   52. }   
    60. 点击提交后:页面输出结果为“This is the service“;
目录
相关文章
关于springboot配置文件未加载的问题解决办法
一般情况下springboot的项目的配置文件都是默认加载的properties文件和yaml文件,但是有时候因为一些其他的设置也会导致这些配置文件没有被加载
2737 0
关于springboot配置文件未加载的问题解决办法
|
11月前
|
前端开发
React 泛型组件
React 中的泛型组件是一种非常有价值的编程技术,它为我们提供了更强大、灵活和可扩展的组件开发方式,有助于我们构建更优秀的用户界面和应用程序。
181 52
|
开发框架 缓存 Java
JSP 教程 之 Eclipse JSP/Servlet 环境搭建 1
本教程指导如何使用Eclipse搭建JSP/Servlet开发环境。需下载Eclipse J2EE和Tomcat,将Tomcat解压至无中文和空格的D盘目录。启动Tomcat后,服务器运行,通过浏览器访问`http://localhost:8080/`。在Tomcat的webapps\ROOT目录创建test.jsp文件,输入代码并访问`http://localhost:8080/test.jsp`以验证环境配置成功。
221 1
|
11月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的256QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了256QAM调制解调算法的仿真效果及理论基础。使用Vivado 2019.2进行仿真,分别在SNR为40dB、32dB和24dB下生成星座图,并导入Matlab进行分析。256QAM通过将8比特数据映射到复平面上的256个点,实现高效的数据传输。Verilog核心程序包括调制、信道噪声添加和解调模块,最终统计误码率。
278 0
|
缓存 前端开发 JavaScript
Webpack 模块解析:打包原理、构造形式、扣代码补参数和全局导出
Webpack 模块解析:打包原理、构造形式、扣代码补参数和全局导出
618 1
|
JavaScript 前端开发 Unix
一篇学会cron表达式
# 1、定义 Cron表达式是一种用于定义定时任务的格式化字符串。它被广泛用于Unix、Linux和类Unix系统中,用于在指定的时间执行预定的任务。Cron表达式由6个字段组成,每个字段通过空格分隔开。 在本文中,我们将学习如何理解和编写Cron表达式。 Cron表达式的格式如下: ```javascript * * * * * * | | | | | | | | | | | +-- 星期(周日=0 或 7) | | | | +---- 月份(1-12) | | | +------ 日期(1-31) | | +-------- 小时(0-23) | +-------
598 1
一篇学会cron表达式
|
自然语言处理 Python
Python实现词频统计
Python实现词频统计
|
tengine 弹性计算 运维
性能提升一倍!云原生网关支持 TLS 硬件加速
业界在优化 HTTPS 的性能上也做了诸多探索,传统的软件优化方案有 Session 复用、OCSP Stapling、False Start、dynamic record size、TLS1.3、HSTS 等, 但软件层面如何优化也无法满足流量日益增长的速度,加上 CPU 摩尔定律已入暮年,使得专用硬件卸载 CPU 密集型运算成为业界一个通用解决方案。
1984 107
性能提升一倍!云原生网关支持 TLS 硬件加速
|
前端开发 JavaScript
如何让React中useEffet支持async/await
如何让React中useEffet支持async/await
244 0
|
存储 关系型数据库 Go
《深入PostgreSQL的存储引擎:原理与性能》
《深入PostgreSQL的存储引擎:原理与性能》
1056 0