request请求讲解

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

文章目录

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

原理

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

  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请求讲解_第2张图片

请求头

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

Enumeration getHeaderNames()

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

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

request请求讲解_第3张图片
  但是我们在使用的时候往往不会这样使用,因为这样一股脑把所有的请求头都获取出来,我们要用其中某个请求头还要进行筛选,所以该方法了解即可
  既然我们已经学习了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 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");

你可能感兴趣的:(JavaEE)