Http协议是基于请求响应模型的协议,在上节的servlet中也重点谈到了doGet方法和doPost方法,这两个方法中的参数就是request和response,request就是http请求的抽象,一起来学习一下
在学习该参数之前,有必要了解一下request的原理,在这里把response和request放到一块来进行讲解,先来看一幅图:
总结:所以request,response都是Tomcat创建出来的,并且是Tomcat与程序员交流的中间参数
在前面我们讲到了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 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 getParameterMap()
该方法获取所有参数的map集合,这里补充一个知识点,在我们使用dao模式进行开发时,需要将数据封装成bean的形式,所以从前端读到的所有属性都需要赋值给一个Java对象,而一个一个读然后再一个一个赋值会使代码变得非常复杂,引入BeanUtils来解决这个问题
上面的getParameterMap返回一个map对象,然后传给方法populate即可,object是需要被赋值的对象。需要主要的是,在赋值时,是给属性赋值,不是成员变量,也就是根据setter方法来进行赋值
populate(object,map)
setProperty(...):设置某个属性
getProperty(...):获得某个属性
首先需要明确的是,要使用request共享数据,那么必须是同一个request,一般用于共享数据的案例就是请求的转发,使用request进行请求转发的api:
void setAttribute(String name,Object obj):存储数据
Object getAttribute(String name):通过键获取值
void removeAttribute(String name):通过键移除键值对
Tomcat8已经将Get方式的乱码问题解决了,但是Post方式仍然会有乱码,只需要设置一下编码即可:
request.setCharacterEncoding("utf-8");