Http协议是基于请求响应模型的协议,在上节的servlet中也重点谈到了doGet方法和doPost方法,这两个方法中的参数就是request和response,request就是http请求的抽象,一起来学习一下

文章目录

  • 原理
  • api介绍
    • 请求行
    • 请求头
    • 请求体
  • 使用request共享数据
  • 关于request的编码问题

原理

  在学习该参数之前,有必要了解一下request的原理,在这里把response和request放到一块来进行讲解,先来看一幅图:

  1. 浏览器访问Tomcat,Tomcat首先会根据用户的url,在第一次使用Servlet的时候创建Servlet,并在这个时候创建request和response,request对象中封装请求数据
  2. Tomcat将request和response两个对象传给对应Servlet的service方法
  3. 程序员通过操作request拿到浏览器的请求数据,然后将响应消息封装到response
  4. 服务器在给浏览器回应之前,从response中拿到响应消息

总结:所以request,response都是Tomcat创建出来的,并且是Tomcat与程序员交流的中间参数

api介绍

  在前面我们讲到了Http协议,Http协议报文分为请求报文和响应报文,请求报文的格式一起来回顾一下:

请求行
请求头
请求空行
请求体

request的api也是根据该报文来说的,request通过封装一系列方法来获取请求报文中的对应信息

请求行

请求行中的信息包括:请求方式(Get/Post),请求URL,协议版本

1. 获取请求方式(Get/Post)String getMethod()
2. 获取项目虚拟目录:Tomcat下可以部署多个项目,虚拟目录用来区分项目String getContextPath()
3. 获取Servlet路径:String getServletPath()
4. 获取get方式请求参数String getQueryString()
5. 获取请求URIString getRequestURI():不加前面的全路径,具体可以看下面的例子String getRequestURL():全路径
6. 获取协议版本String getProtocol()
7. 获取浏览器IP地址String getRemoteAddr()

看一下演示结果:

请求头

请求头都是以键值对的形式出现,request提供了一个返回所有请求的方法:

Enumeration<String> getHeaderNames()

Enumeration就相当于一个迭代器,下面通过代码演示:

        //获取请求头消息Enumeration<String> headerNames = request.getHeaderNames();while (headerNames.hasMoreElements()) {String headName = headerNames.nextElement();String headerValue = request.getHeader(headName);System.out.println(headName+":"+headerValue);}


  但是我们在使用的时候往往不会这样使用,因为这样一股脑把所有的请求头都获取出来,我们要用其中某个请求头还要进行筛选,所以该方法了解即可
  既然我们已经学习了http协议,那么对于其中的请求头也比较熟悉,在获取时直接传入键获取值

String getHeader("")
请求体

  在http中讲到了只有Post请求才会有请求体,获取请求体通过流的形式来进行

//1.获取字符流
BufferedReader br = request.getReader();
//2.读取数据
String line = null;
while((line = br.readLine()) != null) {System.out.println(line);
}

同样在实际过程中,我们不会这样使用,而是直接和前端沟通好键值对的键是什么,然后通过特定的键拿到对应的值

String getParameter(String name)
String[] getParameterValues(String name)

第一个方法和第二个方法的区别在于第二个方法一个键对应多个值,复选框就是这种情况

Map<String,String[]> getParameterMap()

  该方法获取所有参数的map集合,这里补充一个知识点,在我们使用dao模式进行开发时,需要将数据封装成bean的形式,所以从前端读到的所有属性都需要赋值给一个Java对象,而一个一个读然后再一个一个赋值会使代码变得非常复杂,引入BeanUtils来解决这个问题

  上面的getParameterMap返回一个map对象,然后传给方法populate即可,object是需要被赋值的对象。需要主要的是,在赋值时,是给属性赋值,不是成员变量,也就是根据setter方法来进行赋值

populate(object,map)
setProperty(...):设置某个属性
getProperty(...):获得某个属性

使用request共享数据

  首先需要明确的是,要使用request共享数据,那么必须是同一个request,一般用于共享数据的案例就是请求的转发,使用request进行请求转发的api:

void setAttribute(String name,Object obj):存储数据
Object getAttribute(String name):通过键获取值
void removeAttribute(String name):通过键移除键值对

关于request的编码问题

Tomcat8已经将Get方式的乱码问题解决了,但是Post方式仍然会有乱码,只需要设置一下编码即可:

request.setCharacterEncoding("utf-8");

request请求讲解相关推荐

  1. SpringMVC4.x源码分析(五):request请求寻址HandlerMethod原理

    2019独角兽企业重金招聘Python工程师标准>>> mvc:annotation-driven会将每一个Controllor内的被@RequestMapping注解标注的方法解析 ...

  2. 小程序简单封装 request 请求

    我在这里做了详细的介绍 : 小程序简单封装 request 请求 转载于:https://www.cnblogs.com/biangz/p/9984340.html

  3. 【OkHttp】OkHttp 源码分析 ( 同步 / 异步 Request 请求执行原理分析 )

    OkHttp 系列文章目录 [OkHttp]OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) [OkHttp]Android 项目导入 OkHttp ( 配置依赖 | 配置 ...

  4. Java-Web Response响应和Request请求

    一.请求响应流程图 二.response概述 response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletResponse.在客户 ...

  5. 爬虫进行request请求时User-Agent怎样写

    场景 在写爬虫进行request请求时,如果不能正常请求就要添加请求头. 常用的是修改User-Agent来伪装浏览器. 我们除了复制之外,这里可以参照一个库叫fake-useragent. 网址: ...

  6. 如何多次读取request请求里的数据

    问题场景 : 我们一般直接获取request请求里的参数进行数据处理,现在想在过滤器里获取请求参数并打印,方便做日志排查. 但是POST请求中的参数是存储在流中的,只能读一次,无法多次读取. 解决办法 ...

  7. 微信小程序php get_php处理微信小程序request请求

    微信小程序的js后台只能执行一些简单的逻辑,遇到比较复杂的处理表单数据的功能或者网络功能就需要连接服务器来远程处理,实现方式就是调用小程序的wx.request()这一接口. 小程序端 request ...

  8. 微信小程序正确的异步request请求,根据经纬度获取地理位置信息

    微信小程序的所有request请求都是异步的,不支持同步.但是在请求时可能会耗费一定时间,这样的话在获取返回数据时可能方法还没有执行完就已经进行赋值操作了.我遇到的就是拿到的数据为undefined. ...

  9. 微信小程序request请求封装;微信小程序封装request请求;uni-app小程序封装request请求;

    本片封装了微信小程序request请求:为别是post get put请求,重点在request.js文件 1.新增四个文件 2.根目录下的utils下的request.js封装uni.request ...

最新文章

  1. 利用async和await异步操作解决node.js里面fs模块异步读写,同步结果的问题
  2. XML解析-Dom4j的DOM解析方式更新XML
  3. 电子商务专业实习总结
  4. 18位身份证校验代码
  5. erlang Error in process with exit value: {undef,[{M,F,[A],[]}]}
  6. JAVA深度学习文本审核_内容审核-文本
  7. android地图方位角_Android获取经纬度,计算距离,方位角
  8. python3入门教程 pdf_Python基础教程第3版(Beginning Python From Novice to Professional 3th) pdf...
  9. 【c++程序】求解一元二次方程
  10. php 内网唤醒,手机微信实现网络唤醒电脑(WOL),远程开机,WakeOnLan
  11. arr和arr的区别以及数组首元素地址和整个数组地址的区别
  12. SQLServer系统函数之聚合函数
  13. 【无线通信协议笔记】蓝牙篇:BLE HID协议
  14. Bean 的生命周期
  15. 2.4G和5.8G的无线区别
  16. MODA 多目标蜻蜓算法
  17. html对颜色加深,css字体阴影如何加深?
  18. 计算机制作表格英语怎么说,表格用英语怎么说
  19. Windows 7之如何更改计算机名
  20. 芝麻小程序码基于设计原理提供免费美化小程序码

热门文章

  1. Pspice中分段线性电流源/电压源创建 IPWL VPWL多于8个点 stmfile
  2. 解决vue使用hight:100%没用,并不能全屏的问题
  3. 在web上呈现3D的语言VRML
  4. mfc中IDC、IDD等资源标识的含义
  5. Vs 调试插件 —OzCode 特性讲解+破解工具和教程
  6. 可以录音并将语音转文字助力高效办公的便签APP推荐
  7. 浏览器兼容性测试的分类
  8. python之String字符串处理库,文件/目录,日期和时间
  9. 年人均输液八瓶 这种解读不科学
  10. OpenJudge1.6答案