request请求讲解

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

原理

  在学习该参数之前,有必要了解一下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. 获取请求URI
	String 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");
  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值