一、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请求相关推荐

  1. okHttp拦截器放在doGet和doPost请求中

    public class OkHttp3Util { /**      * 懒汉 安全 加同步      * 私有的静态成员变量 只声明不创建      * 私有的构造方法      * 提供返回实例 ...

  2. 执行Http请求时doGet和doPost的区别

    应用方式\提交方式 doGet doPost 请求方式 通过URL附带参数发送请求,从服务器上获取数据.在url中可以看到传递的参数. 通过url发送请求,从服务器上提交数据,但不通过url传递数据, ...

  3. android doGet和doPost

    doGet和doPost的区别 get和post是http协议的两种方法,另外还有head, delete等 这两种方法有本质的区别,get只有一个流,参数附加在url后,大小个数有严格限制且只能是字 ...

  4. java中的doget_java servlet中doGet()和doPost()方法的用法和区别

    一般来说我们是用不到doGet方法的,doGet方法提交表单的时候会在url后边显示提交的内容,所以不安全.而且doGet方法只能提交256个字符(1024字节),而doPost没有限制,因为get方 ...

  5. Service 和 doGet 和 doPost 方法的区别

    Service 和 doGet 和 doPost 方法的区别 新建一个JSP文件: get方式 post方式 service方法.doGet方法和doPost方法的区别: 在上面的步骤中,把下图中的m ...

  6. HttpServlet的doGet()和doPost()方法

    由于,大多数客户端的请求方式都是GET和POST 因此,HttpServlet中提供了doGet()和doPost()方法 示例程序 在目录D:\cn\itcast\firstapp\servlet中 ...

  7. JavaWeb第二讲 重定向与转发 doGet()与doPost()

    (一)重定向与转发 转发**(服务器行为)** request.getRequestDispatcher("url").forward(request, response); 重定 ...

  8. Myeclipse中快速插入HttpServlet子类中doGet和doPost方法

    Myeclipse中快速插入HttpServlet子类中doGet和doPost方法 鼠标右键-source-Override/Implment Methods 参考自:https://blog.cs ...

  9. 对doget和dopost区别的理解

    doget与dopost的区别 GET方法用于获取固定资源,一般并不用于传参数,但是实际开发过程中很多都是在用GET方法来传递参数. get直接访问:http://write.blog.csdn.ne ...

最新文章

  1. 反激qr工作原理_锂电池均衡电路的工作原理
  2. 北京市常用和便民电话
  3. oracle 12c创建归档,实测创建 Oracle 12C Dataguard
  4. 机器阅读理解 / 知识库 / 深度学习 / 对话系统 / 神经机器翻译 | 本周值得读
  5. opencv_contrib4.4安装
  6. python字典导入mongodb_Python语言生成内嵌式字典(dict)-案例从python提取内嵌json写入mongodb...
  7. git version是什么软件_Deepin 15.11 安装 ZoneMinder 视频监控软件
  8. Kewail-邮件短信接口的基础教程
  9. anaconda新建python2环境安装不了jupyterlab_在Mac下安装anaconda及配置jupyterLab和PyTorch的方法...
  10. Java设计模式学习总结(9)——结构型模式之过滤器模式(标准模式)
  11. Carrot2 in action 初步印象
  12. 怎样安装计算机病毒,台式机电脑中病毒如何重装系统图文教程
  13. freenas 11.2踩过的坑
  14. 2020-12-20
  15. SiT3373:220 -725MHz 低抖动压控差分振荡器VCXO
  16. 学习java随堂练习-20220621
  17. 裁剪rplidar的扫描数据
  18. postgresql_internals-14 学习笔记(二)常规vacuum
  19. python期末考试题目及答案_Python语言基础答案试题题目及答案,期末考试题库,章节测验答案...
  20. 第三次入手卡版掉毛飞翼

热门文章

  1. [unity] Tween和IEnumerator
  2. SpringBoot仿牛客论坛项目实战
  3. 【线性代数的本质是42】
  4. 蓝桥杯迷宫 python实现
  5. iTunes Connect 基本使用说明
  6. zk-web框架的学习之路,重新认识Java,Eclipse安装zk插件
  7. 自动驾驶技术综述1:自动驾驶算法软件架构介绍
  8. 2018计算机网络考试,2018本科《计算机网络》期末考试试卷及答案
  9. 小米3 android8,小米8 Miui10.3 最新稳定版(10.3.6.0 Android 9.0)稳定版 快过闪电 AI加持 高级工具箱 黑域 精简 流畅 省电 实用...
  10. Idea上传项目到gitee