doGet或doPost请求
一、HTTP实现doGet或doPost请求原理介绍
1、浏览器发送请求到HttpSevr类调用HttpServ的service(servletRequest, servletReponse)方法
2、由于没有找到这个方法,去调用父类(HttpServlet) 的同名方法。
3、父类的service方法将ServletRequest req请求转换成HttpServletRequest请求,再去调用service(request, response) 方法。
将ServletRequest req请求转换成HttpServletRequest请求再调用service(request, response) 方法源码如下:
public void service(ServletRequest req, ServletResponse res)throws ServletException, IOException {HttpServletRequest request;HttpServletResponse response;try {request = (HttpServletRequest) req;response = (HttpServletResponse) res;} catch (ClassCastException e) {throw new ServletException("non-HTTP request or response");}service(request, response);}
4、 调用的service(request, response) 方法功能是判断用户发出是什么请求,如果是get则调用子类(HttpSevr)的doGet方法,如果是post则调用子类(HttpSevr)的doPost方法。
service(request, response) 方法源码如下:
protected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {String method = req.getMethod();if (method.equals(METHOD_GET)) {long lastModified = getLastModified(req);if (lastModified == -1) {// servlet doesn't support if-modified-since, no reason// to go through further expensive logicdoGet(req, resp);} else {long ifModifiedSince;try {ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);} catch (IllegalArgumentException iae) {// Invalid date header - proceed as if none was setifModifiedSince = -1;}if (ifModifiedSince < (lastModified / 1000 * 1000)) {// If the servlet mod time is later, call doGet()// Round down to the nearest second for a proper compare// A ifModifiedSince of -1 will always be lessmaybeSetLastModified(resp, lastModified);doGet(req, resp);} else {resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);}}} 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 {//// Note that this means NO servlet supports whatever// method was requested, anywhere on this server.//String errMsg = lStrings.getString("http.method_not_implemented");Object[] errArgs = new Object[1];errArgs[0] = method;errMsg = MessageFormat.format(errMsg, errArgs);resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);}}
5、调用关系图
二、注意事项:
1、如果在HttpServ中覆盖了service(ServletRequest,SerlvetResonse)方法则这个类的所实现的doGet/doPost都不会再执行了。
因为service(ServletRequest,SerlvetResonse)是最高接口Servlet定义规范。在tomcat调用时,一定会在最终的子类中去找这个方法且调用它。
如果最终的子类没有则会调用父的service(ServletRequest,SerlvetResonse)。
2、如果覆盖了serivce(HttpServletRequest,HtpServletResponse)则会执行httpServlet中的service(ServletRequest,SerlvetResonse),但是由于子类中已经覆盖了serivce(HttpServletRequest,HtpServletResponset)所以,httpServlet中的serivce(HttpServletRequest,HtpServletResponset)就不再执行了,而是直接执行子类中同名同参数方法,且doXxxx也不会执行了,因为子类的serivce(HttpServletRequest,HtpServletResponset)没有调用doXxxx.
3、如果继承了HttpServlet没有实现任何的doXxx方法则会抛出一个异常
三、客户端请求和返回数据用到的常用方法:
javaweb学习总结(十)——HttpServletRequest对象(一) - 孤傲苍狼 - 博客园 (cnblogs.com)
doGet或doPost请求相关推荐
- okHttp拦截器放在doGet和doPost请求中
public class OkHttp3Util { /** * 懒汉 安全 加同步 * 私有的静态成员变量 只声明不创建 * 私有的构造方法 * 提供返回实例 ...
- 执行Http请求时doGet和doPost的区别
应用方式\提交方式 doGet doPost 请求方式 通过URL附带参数发送请求,从服务器上获取数据.在url中可以看到传递的参数. 通过url发送请求,从服务器上提交数据,但不通过url传递数据, ...
- android doGet和doPost
doGet和doPost的区别 get和post是http协议的两种方法,另外还有head, delete等 这两种方法有本质的区别,get只有一个流,参数附加在url后,大小个数有严格限制且只能是字 ...
- java中的doget_java servlet中doGet()和doPost()方法的用法和区别
一般来说我们是用不到doGet方法的,doGet方法提交表单的时候会在url后边显示提交的内容,所以不安全.而且doGet方法只能提交256个字符(1024字节),而doPost没有限制,因为get方 ...
- Service 和 doGet 和 doPost 方法的区别
Service 和 doGet 和 doPost 方法的区别 新建一个JSP文件: get方式 post方式 service方法.doGet方法和doPost方法的区别: 在上面的步骤中,把下图中的m ...
- HttpServlet的doGet()和doPost()方法
由于,大多数客户端的请求方式都是GET和POST 因此,HttpServlet中提供了doGet()和doPost()方法 示例程序 在目录D:\cn\itcast\firstapp\servlet中 ...
- JavaWeb第二讲 重定向与转发 doGet()与doPost()
(一)重定向与转发 转发**(服务器行为)** request.getRequestDispatcher("url").forward(request, response); 重定 ...
- Myeclipse中快速插入HttpServlet子类中doGet和doPost方法
Myeclipse中快速插入HttpServlet子类中doGet和doPost方法 鼠标右键-source-Override/Implment Methods 参考自:https://blog.cs ...
- 对doget和dopost区别的理解
doget与dopost的区别 GET方法用于获取固定资源,一般并不用于传参数,但是实际开发过程中很多都是在用GET方法来传递参数. get直接访问:http://write.blog.csdn.ne ...
最新文章
- 反激qr工作原理_锂电池均衡电路的工作原理
- 北京市常用和便民电话
- oracle 12c创建归档,实测创建 Oracle 12C Dataguard
- 机器阅读理解 / 知识库 / 深度学习 / 对话系统 / 神经机器翻译 | 本周值得读
- opencv_contrib4.4安装
- python字典导入mongodb_Python语言生成内嵌式字典(dict)-案例从python提取内嵌json写入mongodb...
- git version是什么软件_Deepin 15.11 安装 ZoneMinder 视频监控软件
- Kewail-邮件短信接口的基础教程
- anaconda新建python2环境安装不了jupyterlab_在Mac下安装anaconda及配置jupyterLab和PyTorch的方法...
- Java设计模式学习总结(9)——结构型模式之过滤器模式(标准模式)
- Carrot2 in action 初步印象
- 怎样安装计算机病毒,台式机电脑中病毒如何重装系统图文教程
- freenas 11.2踩过的坑
- 2020-12-20
- SiT3373:220 -725MHz 低抖动压控差分振荡器VCXO
- 学习java随堂练习-20220621
- 裁剪rplidar的扫描数据
- postgresql_internals-14 学习笔记(二)常规vacuum
- python期末考试题目及答案_Python语言基础答案试题题目及答案,期末考试题库,章节测验答案...
- 第三次入手卡版掉毛飞翼
热门文章
- [unity] Tween和IEnumerator
- SpringBoot仿牛客论坛项目实战
- 【线性代数的本质是42】
- 蓝桥杯迷宫 python实现
- iTunes Connect 基本使用说明
- zk-web框架的学习之路,重新认识Java,Eclipse安装zk插件
- 自动驾驶技术综述1:自动驾驶算法软件架构介绍
- 2018计算机网络考试,2018本科《计算机网络》期末考试试卷及答案
- 小米3 android8,小米8 Miui10.3 最新稳定版(10.3.6.0 Android 9.0)稳定版 快过闪电 AI加持 高级工具箱 黑域 精简 流畅 省电 实用...
- Idea上传项目到gitee