文档章节

HttpServlet中的service()、doPost()、doGet()方法解析

寻找丢失的草帽儿
 寻找丢失的草帽儿
发布于 2016/04/11 20:34
字数 997
阅读 57
收藏 0
点赞 2
评论 0

1、service()方法源码解析

先来看HttpServletservice()方法:

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 
        //获取http request的method参数,其实就是html的form标签  
//中method属性对应的字符串 
        String method = req.getMethod();
        long errMsg;
//判断请求方式
        if(method.equals("GET")) {
//获取最后被修改时间 
            errMsg = this.getLastModified(req);
            if(errMsg == -1L) {
/**如果servlet不支持http request header的if-modified-since属性 
* 则继续处理 
**/  
                this.doGet(req, resp);
            } else {
//如果支持这个属性 
                long ifModifiedSince;
                try {
                    ifModifiedSince = req.getDateHeader("If-Modified-Since");
                } catch (IllegalArgumentException var9) {
                    ifModifiedSince = -1L;
                }
/** 
* 如果客户端的文件最后修改时间和服务器端的文件最后修改时间一致则返回304不需要修改状态 
* 这样服务器就不返回html,浏览器读取本地缓存文件,否则重新获取服务器端的对应html文件 
             **/  
                if(ifModifiedSince < errMsg / 1000L * 1000L) {
                    this.maybeSetLastModified(resp, errMsg);
                    this.doGet(req, resp);
                } else {
                    resp.setStatus(304);
                }
            }
        } else if(method.equals("HEAD")) {
            errMsg = this.getLastModified(req);
            this.maybeSetLastModified(resp, errMsg);
            this.doHead(req, resp);
        } else if(method.equals("POST")) {
            this.doPost(req, resp);
        } else if(method.equals("PUT")) {
            this.doPut(req, resp);
        } else if(method.equals("DELETE")) {
            this.doDelete(req, resp);
        } else if(method.equals("OPTIONS")) {
            this.doOptions(req, resp);
        } else if(method.equals("TRACE")) {
            this.doTrace(req, resp);
        } else {
            //如果请求不是以上的所有请求方式,该方法就会响应501错误,也就是不支持这种请求
            String errMsg1 = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[]{method};
            errMsg1 = MessageFormat.format(errMsg1, errArgs);
            resp.sendError(501, errMsg1);
        }
 
    }
 
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        HttpServletRequest request;
        HttpServletResponse response;
        try {
            request = (HttpServletRequest)req;
            response = (HttpServletResponse)res;
        } catch (ClassCastException var6) {
            throw new ServletException("non-HTTP request or response");
        }
        this.service(request, response);
}

很显然HttpServlet这个类里面有两个service()方法。首先要知道的是用户自定义的Servlet都是HttpServlet的子类,也就是要继承HttpServlet,而HttpServlet是从GenericServlet继承而来,GenericServlet类要实现javax.servlet.Servlet接口。而GenericServlet类提供的除service()方法以外所有接口方法都默认实现。所以service()是一个抽象方法,GenericServlet的派生类必须对该方法重置才能实现期望的业务逻辑。

 

先说以上HttpServlet的第二种service()方法,该方法是来自父类GenericServlet

HttpServlet将其重置。该方法收到客服端请求后,创建request对象和response对象,并强制转化为HttpServletRequestHttpServletResponse类型的对象,在处理请求期间发生错误,会主动抛出异常。最后调用HttpServlet自身的service()方法,也就是第一种service()方法

 

然后我们来看第一种service()方法,客服端发送请求至服务器端,服务器将请求发送到Servlet,首先会调用init()方法初始化Servlet,然后Servlet的执行时期会调用service()方法,该方法会自动判断来自客服端的请求方式,根据不同请求方式调用不同方法,如果是get请求,则调用doGet()方法,如果是post请求,则调用doPost()方法。我们可以看到里面的请求方式有HEADGETPOSTDELETEOPTIONSTRACE

  根据不同的请求会调用不同方法,当我们使用这些方法时根据不同的需求重写方法实现业务逻辑。如果请求不是以上的所有请求方式,该方法就会响应501错误,也就是不支持这种请求。处理完请求后自然要返回响应,最后调用destory()方法销毁Servlet


2、doGet()和doPost()方法源码解析

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取协议 
        String protocol = req.getProtocol();
//获取http.method_get_not_supported的国际化字符串
        String msg = lStrings.getString("http.method_get_not_supported");
        if(protocol.endsWith("1.1")) {
//如果是HTTP/1.1,返回405禁止访问方法错误
            resp.sendError(405, msg);
        } else {
//如果不是HTTP/1.1,返回400错误的请求错误  
            resp.sendError(400, msg);
        }
 
    }
 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String protocol = req.getProtocol();
        String msg = lStrings.getString("http.method_post_not_supported");
        if(protocol.endsWith("1.1")) {
            resp.sendError(405, msg);
        } else {
            resp.sendError(400, msg);
        }
 
}

两个方法如果不被重写,那执行时默认会调用HttpServlet的代码,首先获取协议,然后获取国际化字符串,最后判断协议,如果协议为HTTP/1.1,返回405禁止访问方法错误,//如果不是HTTP/1.1,返回400错误的请求错误


© 著作权归作者所有

共有 人打赏支持
寻找丢失的草帽儿
粉丝 1
博文 5
码字总数 4136
作品 0
程序员
Servlet中doGet和doPost等方法

Serlvet接口只定义了一个服务方法就是service,而HttpServlet类实现了该方法并且要求调用下列的方法之一: doGet:处理GET请求 doPost:处理POST请求 当发出客户端请求的时候,调用service 方...

june-映君 ⋅ 2014/04/19 ⋅ 0

Servlet doGet和doPost方法

首先你要明确servlet的生命周期和HTTP协议. Serlvet接口只定义了一个服务方法就是service,而HttpServlet类实现了该方法并且要求调用下列的方法之一: doGet:处理GET请求 doPost:处理POST请...

xiahuawuyu ⋅ 2012/08/02 ⋅ 0

关于servlet的学习日志

servlet是使用Java servlet应用程序设计接口(API)及相关类和方法的Java程序,除了Java servlet API,它还可以用于扩展和添加API的Java类软件的包。servlet主要用于处理客户端传来的HTTP请求...

my_only ⋅ 2015/07/12 ⋅ 2

Servlet 生命周期、工作原理

Servlet 生命周期:Servlet 加载--->实例化--->服务--->销毁。 init():在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet 对象。可以配...

ArlenXu ⋅ 2015/01/24 ⋅ 0

Eclipse+Tomcat配置中遇到的错误

1 eclipse发布项目报错:Multiple Contexts hava a path of “/xxx“ 1.1在Eclipse的Servers中单击“server.xml”文件并打开 1.2在"server.xml"文件中,可以看到重复定义的context,删掉1个即...

510202 ⋅ 2015/03/10 ⋅ 0

Java Servlet API(主要的方法)

Java Servlet 开发工具(JSDK)提供了多个软件包,在编写Servlet时需要用到这些软件包,下面主要介绍HTTP Servlet应用编程接口。 HttpServlet类包含init()、destroy()、Service()等方法...

晨曦之光 ⋅ 2012/05/16 ⋅ 0

servlet(二)

servlet(二) 2015-12-25 by Damon servlet(一)中提到实现servlet接口,你可以写一个继承自javax.servlet.GenericServletr的genericServlet或继承自javax.servlet的HttpServlet,那GenericSe......

水天云黑白 ⋅ 2016/01/25 ⋅ 0

Servlet生命周期与工作原理

Servlet生命周期分为三个阶段:   1,初始化阶段 调用init()方法   2,响应客户请求阶段  调用service()方法   3,终止阶段  调用destroy()方法 Servlet初始化阶段:   在下列时...

№贪↗恋♂ ⋅ 2012/08/08 ⋅ 0

Servlet生命周期与工作原理

Servlet生命周期分为三个阶段:   1,初始化阶段 调用init()方法   2,响应客户请求阶段  调用service()方法   3,终止阶段  调用destroy()方法 Servlet初始化阶段:   在下列时...

罗荣熙 ⋅ 2012/12/01 ⋅ 2

Servlet学习基础

1.servlet的调用比较jsp jsp:把编译好的jsp页面发布到服务器,服务器编译成java文件,然后将java文件发送到页面上,页面上然后在对java代码中的网页文件进行提取。(我们可以查看tomcat中的缓...

西米火山 ⋅ 2016/12/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Greys Java在线问题诊断工具

Greys是一个JVM进程执行过程中的异常诊断工具。 在不中断程序执行的情况下轻松完成JVM相关问题排查工作 目标群体 有时候突然一个问题反馈上来,需要入参才能完成定位,但恰恰没有任何日志。回...

素雷 ⋅ 28分钟前 ⋅ 0

git从远程仓库拉取代码的常用指令

一种(比较麻烦的)拉代码的方法 git clone //克隆代码库,与远程代码库的主干建立连接,如果主干已经在就不用再clone啦,克隆路径为当前路径下的新创建的文件夹 git checkout -b //本地建立...

Helios51 ⋅ 42分钟前 ⋅ 0

005. 深入JVM学习—Java堆内存参数调整

1. JVM整体内存调整图解(调优关键) 实际上每一块子内存区域都会存在一部分可变伸缩区域,其基本流程:如果内存空间不足,则在可变的范围之内扩大内存空间,当一段时间之后,内存空间不紧张...

影狼 ⋅ 47分钟前 ⋅ 0

内存障碍: 软件黑客的硬件视图

此文为笔者近日有幸看到的一则关于计算机底层内存障碍的学术论文,并翻译(机译)而来[自认为翻译的还行],若读者想要英文原版的论文话,给我留言,我发给你。 内存障碍: 软件黑客的硬件视图...

Romane ⋅ 今天 ⋅ 0

SpringCloud 微服务 (七) 服务通信 Feign

壹 继续第(六)篇RestTemplate篇 做到现在,本机上已经有注册中心: eureka, 服务:client、order、product 继续在order中实现通信向product服务,使用Feign方式 下面记录学习和遇到的问题 贰 or...

___大侠 ⋅ 今天 ⋅ 0

gitee、github上issue标签方案

目录 [TOC] issue生命周期 st=>start: 开始e=>end: 结束op0=>operation: 新建issueop1=>operation: 评审issueop2=>operation: 任务负责人执行任务cond1=>condition: 是否通过?op3=>o......

lovewinner ⋅ 今天 ⋅ 0

浅谈mysql的索引设计原则以及常见索引的区别

索引定义:是一个单独的,存储在磁盘上的数据库结构,其包含着对数据表里所有记录的引用指针. 数据库索引的设计原则: 为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索...

屌丝男神 ⋅ 今天 ⋅ 0

String,StringBuilder,StringBuffer三者的区别

这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。 首先说运行速度,或者说是, 1.执行速度 在这方面运行速度快慢为:StringBuilder(线程不安全,可变) > StringBuffer...

时刻在奔跑 ⋅ 今天 ⋅ 0

java以太坊开发 - web3j使用钱包进行转账

首先载入钱包,然后利用账户凭证操作受控交易Transfer进行转账: Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/Credentials credentials = Wallet......

以太坊教程 ⋅ 今天 ⋅ 0

Oracle全文检索配置与实践

Oracle全文检索配置与实践

微小宝 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部