一、request继承体系结构
二、request的功能
A:获取请求消息数据(只有几个方法常用)
1、获取请求行数据
假设要获取的请求行为:GET /day14/demo1?name=zhangsan HTTP/1.1
获取请求方式 :GET
(String) getMethod()
(**)获取虚拟目录:/day14
(String) getContextPath()
获取Servlet路径: /demo1
(String) getServletPath()
获取get方式请求参数:name=zhangsan
(String) getQueryString()
(**)获取请求URI与URL:
(String) getRequestURI() //获取结果:/day14/demo1
(StringBuffer) getRequestURL() //获取结果:http:localhost/day14/demo1
- URL:统一资源定位符 : http://localhost/day14/demo1 中华人民共和国
- URI:统一资源标识符 : /day14/demo1 共和国 (能表示的范围更大)
获取协议及版本:HTTP/1.1
(String) getProtocol()
获取客户机的IP地址:
(String) getRemoteAddr()
2、获取请求头数据
根据请求头名称获取请求头的内容(*重要)
经常用来获取两个请求头:user-agent(获取浏览器版本) 、 referer(获取访问者的URL地址)
(String) getHeader(String name)
获取所有请求头名称
(Enumeration<String>) getHeaderNames()
3、获取请求体数据
请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
步骤:
- 获取流对象
BufferedReader getReader( ):获取字符输入流,只能操作字符数据
ServletInputStream getInputStream( ):获取字节输入流,可以操作所有类型数据,在文件上传知识点后讲解 - 再从流对象中拿数据
B:其它四类功能(都很常用)
1、获取请求参数(兼容GET和POST传输方式)
/*常用*/
(String) getParameter(String name)//根据参数名称获取参数值
(String[]) getParameterValues(String name)//根据参数名称获取参数值的数组,用于一键多值的情况
(Enumeration<String>) getParameterNames()//获取所有请求的参数名称
/*常用*/
(Map<String,String[]>) getParameterMap()//获取所有参数包括名称和值的map集合,常用!
map.keySet() //获取map集合的键数组
map.get(keys) //根据键数组获取map集合的值数组
//该方法的使用格式如下:
Map<String, String[]> map = request.getParameterMap();
Set<String> names = map.keySet(); //用keySet()获取参数的名称数组
for (String name : names) { //遍历打印参数的名称数组
System.out.println("参数名称" + name); //遍历打印参数的名称
String[] values = map.get(names); //用get()获取参数的值的数组
for (String value : values) { //遍历打印参数的值的数组
System.out.println("参数的值" + value);
}
}
//因为兼容GET和POST方法,所以将来只需要在doPost方法里面写一份代码,然后在doGet中调用doPost方法并且传入request和response这两个参数就行了!代码如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
获取参数的中文乱码问题:
如果获取到的是使用POST传输方式的参数的话,必须设置字符集编码为utf-8,否则会出现中文乱码问题,只需在doPost( )方法里获取参数之前添加一行代码即可:
request.setCharacterEncoding("utf-8");
因为我们不知道到底是Post方式还是Get方式获取,建议在获取参数的时候得必须加上这一行代码!因为我们是中国人啊!经常用中文!!懂?
2、请求转发
概念:
当客户端浏览器网页发送一次请求,然后需要使用Tomcat服务器里的多个Servlet资源文件,这时:
当前Tomcat服务器内的一个Servlet资源文件跳转到另一个Servlet资源文件的过程,就叫做请求转发!
使用步骤:
- 通过request对象获取请求转发器对象,然后转发器对象使用forward( request, response)方法即可!
request.getRequestDispatcher.forward(request, response);
//使用链式编程!
3、共享数据
域对象
概念:一个有作用范围的对象,可以在范围内共享数据
request域对象:
一次请求代表一个域,也就是说,多个Servlet资源文件需要进行请求转发的操作时,它们之间就可以共享数据!
如何操作
//存储数据
(void) setAttribute(String name,Object obj)
//name和obj都可以自由编写!name代表数据的名字,obj代表数据内容,该方法的作用就是存储该数据到request域中!
//通过数据的名字(键)获取值
(Object) getAttribute(String name)
//通过数据的名字(键)来移除键值对
(void) removeAttribute(String name)
4、获取ServletContext对象
(ServletContext) getServletContext()