目录
Request
Request对象是用来封装请求数据的对象
作用:
1.获取请求的数据
2.浏览器发送请求到后台服务器
3.后台服务器会将请求来的数据存入到一个对象中
Response
response对象是用来封装响应数据的对象
作用:
1.设置响应数据
2.后台需要将处理完的数据结果返回给前端
3.后台会将服务器解析response对象,拼接结果
Request对象方法
获取请求方式:String getMethod()
获取虚拟目录(项目访问路径):String getContextPath()
获取URL(统一资源定位符):StringBuffer getRequtestURL()
获取URI(统一资源标识符):String getRequtestURI()
获取请求方式的请求参数:String getQueryString()
获取请求头的数据:String getHeader(String name)
获取请求体的数据:
字节数据:1.ServletInputStream getInputStream()
字符数据:2.BufferReader getReader()
注意:BufferReader流是通过request对象来获取的,请求完成后request对象会被销毁,BufferReader流也会自动关闭,不需要手动关闭流
获取请求参数的方法
1.先是去获取请求方式,再根据不同的请求类型。应用不同的参数获取方式
//获取请求方式
String method = req.getMethod();
//获取请求参数
String params = "";
if("GET".equals(method)){
params = req.getQueryString();
}else if("POST".equals(method)){
BufferedReader reader = req.getReader();
params = reader.readLine();
}
2.request对象已经将上述获取请求参数的方法进行了封装,只需要使用request的方法即可
先获取参数map集合,再根据名称获取参数数组值或者是参数值。
//获取所有参数Map集合
Map<String,String[]> map = request.getParameterMap()
//根据名称获取参数值(数组)
String[] map = request.getParameterValues(String name)
//根据名称获取参数值(单个值)
String name = request.getParameter(String name)
请求参数中文乱码的问题
post请求乱码
问题的由来
POST的请求参数是通过request的getReader()来获取流中的数据
TOMCAT在获取流的时候采用的编码是ISO-8859-1
ISO-8859-1编码是不支持中文的,所以会出现乱码
解决方法
将页面的编码格式改为UTF-8
将tomcat获取流数据的编码格式设置为UTF-8
通过request.setCharaterEncoding("UTF-8")设置编码
get请求乱码
应为浏览器发送请求的过程会对数据进行编码会采用UTF-8的方式编码,而后台接收到请求会按照默认的ISO-8859-1的方式进行解码。两种解码方式不一样,会导致乱码
//1. URL编码
String encode = URLEncoder.encode(username, "utf-8");
System.out.println(encode);
//2. URL解码
String decode = URLDecoder.decode(encode, "ISO-8859-1");
request请求转发
请求转发指的是一种在服务器内部的资源跳转方式
浏览器发送请求给服务器,服务器中对应的资源接收到请求
资源A处理完请求后将请求发送给资源B,请求从资源A到资源B的过程就叫请求转发
请求转发的实现方式:request.getRequestDispatcher("资源B的路径").forward(req,resp)
在请求转发之前,将数据存入到request域对象中,在转发过去的时候再从request对象中获取
可以实现转发多个资源数据共享
特点:浏览器的地址栏路径并不会发生变化、只能转发到当前的服务器内部资源
Response响应对象
response重定向
重定向:一种资源跳转的方式
(1)浏览器发送请求给服务器,服务器中对应的资源A接收到请求
(2)资源A现在无法处理该请求,就会给浏览器响应一个302的状态码+location的一个访问资源B的路径
(3)浏览器接收到响应状态码为302就会重新发送请求到location对应的访问地址去访问资源B
(4)资源B接收到请求后进行处理并最终给浏览器响应结果,这整个过程就叫==重定向==
重定向的实现
resp.setStatus(302);
resp.setHeader("location","资源B的访问路径");
简化方式:
resposne.sendRedirect("/request-demo/resp2")
重定向的路径选择
规则:
1.浏览器:需要加虚拟目录,就是项目访问的路径
2.服务器端:不需要添加虚拟目录
特点:
浏览器的地址栏路径会发生变化,因为重定向发生时候会发送两次请求,所以地址会发生变化
重定向动态添加虚拟目录
//简化方式完成重定向
//动态获取虚拟目录
String contextPath = request.getContextPath();
response.sendRedirect(contextPath+"/servlet路径");
Response响应字符数据
通过Response对象获取字符输出流:response.getWriter();
设置响应的数据格式及数据的编码
response.setContentType("text/html;charset=utf-8");
再通过字符输出流写数据:write("");
一次请求响应结束后,response对象就会被销毁掉,所以不要手动关闭流
Response响应字节数据
获取字节输出流:response.getOutputStream()
通过字节流写数据:write(字节数据)