一、Request 和 Response 的概述
Request 是请求对象, Response 是响应对象。
request: 获取 请求数据
(1)浏览器会发送 HTTP 请求到后台服务器 [Tomcat]
(2)HTTP 的请求中会包含很多请求数据 [ 请求行 + 请求头 + 请求体 ]
(3)后台服务器 [Tomcat] 会对 HTTP 请求中的数据进行解析并把解析结果存入到一个对象中
(4)所存入的对象即为 request 对象,所以我们可以从 request 对象中获取请求的相关参数
(5)获取到数据后就可以继续后续的业务,比如获取用户名和密码就可以实现登录操作的相关业务Request 继承体系
response: 设置 响应数据
(1)业务处理完后,后台就需要给前端返回业务处理的结果即响应数据
(2)把响应数据封装到 response 对象中
(3)后台服务器 [Tomcat] 会解析 response 对象 , 按照 [ 响应行 + 响应头 + 响应体 ] 格式拼接结果
(4)浏览器最终解析结果,把内容展示在浏览器给用户浏览
二、Request对象
1. Request继承体系
(1)Tomcat 需要解析请求数据,封装为 request 对象 , 并且创建 request 对象传递到 service 方法
(2)使用 request 对象,可以查阅 JavaEE API 文档的 HttpServletRequest 接口中方法说明
2. Request获取请求数据
2.1 获取请求行数据
/**
* request 获取请求数据
*/
@WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// String getMethod():获取请求方式: GET
String method = req.getMethod();
System.out.println(method);//GET
// String getContextPath():获取虚拟目录(项目访问路径):/request-demo
String contextPath = req.getContextPath();
System.out.println(contextPath);
// StringBuffer getRequestURL(): 获取URL(统一资源定位符):http://localhost:8080/request-demo/req1
StringBuffer url = req.getRequestURL();
System.out.println(url.toString());
// String getRequestURI():获取URI(统一资源标识符): /request-demo/req1
String uri = req.getRequestURI();
System.out.println(uri);
// String getQueryString():获取请求参数(GET方式): username=zhangsan
String queryString = req.getQueryString();
System.out.println(queryString);
//------------
// 获取请求头:user-agent: 浏览器的版本信息
String agent = req.getHeader("user-agent");
System.out.println(agent);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取post 请求体:请求参数
//1. 获取字符输入流
BufferedReader br = req.getReader();
//2. 读取数据
String line = br.readLine();
System.out.println(line);
}
}
2.2 获取请求头数据
String getHeader(String name)/**
* request 获取请求数据
*/
@WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取请求头:user-agent: 浏览器的版本信息
String agent = req.getHeader("user-agent");
System.out.println(agent);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
2.3 获取请求体数据
(1)获取字节输入流,如果前端发送的是字节数据,比如传递的是文件数据,则使用该方法
ServletInputStream getInputStream()
(2) 获取字符输入流,如果前端发送的是纯文本数据,则使用该方法
BufferedReader getReader()
/**
* request 获取请求数据
*/
@WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取post 请求体:请求参数
//1. 获取字符输入流
BufferedReader br = req.getReader();
//2. 读取数据
String line = br.readLine();
System.out.println(line);
}
}
2.4 获取请求参数的通用方式
(1)获取所有参数Map集合
Map<String,String[]> getParameterMap()
(2)根据名称获取参数值(数组)
String[] getParameterValues(String name)
(3)根据名称获取参数值(单个值)
String getParameter(String name)
3. 请求参数中文乱码问题
/**
* 中文乱码问题解决方案
*/
@WebServlet("/req4")
public class RequestDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 解决乱码:POST,getReader()
//request.setCharacterEncoding("UTF-8");//设置字符输入流的编码
//2. 获取username
String username = request.getParameter("username");
System.out.println("解决乱码前:"+username);
//3. GET,获取参数的方式:getQueryString
// 乱码原因:tomcat进行URL解码,默认的字符集ISO-8859-1
/* //3.1 先对乱码数据进行编码:转为字节数组
byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
//3.2 字节数组解码
username = new String(bytes, StandardCharsets.UTF_8);*/
username = new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);
System.out.println("解决乱码后:"+username);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
4. Request请求转发
请求转发 (forward): 一种在服务器内部的资源跳转方式。
请求转发的实现方式 :
req.getRequestDispatcher("资源B路径").forward(req,resp);
请求转发资源间共享数据 : 使用 Request 对象:
(1)存储数据到 request 域 [ 范围 , 数据是存储在 request 对象 ] 中
void setAttribute(String name,Object o);
(2)根据 key 获取值
Object getAttribute(String name);
(3)根据 key 删除该键值对
void removeAttribute(String name);
三、Response对象
1. Response设置响应数据功能介绍
HTTP 响应数据总共分为三部分内容,分别是 响应行、响应头、响应体
(1)响应行
设置响应状态码 :
void setStatus(int sc);
(2)响应头
设置响应头键值对:
void setHeader(String name,String value);
(3)响应体
1️⃣获取字符输出流
PrintWriter getWriter();
2️⃣获取字节输出流
ServletOutputStream getOutputStream();
2. Respones请求重定向
Response 重定向 (redirect): 一种资源跳转方式。
重定向的实现方式 :
resp.setStatus(302);
resp.setHeader("location","资源B的访问路径");
response.sendRedirect("资源B的访问路径");
重定向的特点:
(1)浏览器地址栏路径发生变化
(2)可以重定向到任意位置的资源(服务器内部、外部均可)
(3)两次请求,不能在多个资源使用request共享数据
3. Respones 响应字符数据
要想将字符数据写回到浏览器,我们需要两个步骤 :
(1)通过 Response 对象获取字符输出流: PrintWriter writer = resp.getWriter();
(2)通过字符输出流写数据 : writer.write("aaa");
/**
* 响应字符数据:设置字符数据的响应体
*/
@WebServlet("/resp3")
public class ResponseDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//1. 获取字符输出流
PrintWriter writer = response.getWriter();
//content-type
//response.setHeader("content-type","text/html");
writer.write("你好");
writer.write("<h1>aaa</h1>");
//细节:流不需要关闭
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
4. Respones 响应字节数据
要想将字节数据写回到浏览器,我们需要两个步骤 :
(1)通过 Response 对象获取字节输出流: ServletOutputStream outputStream =
resp.getOutputStream();
(2)通过字节输出流写数据 : outputStream.write( 字节数据 );
/**
* 响应字节数据:设置字节数据的响应体
*/
@WebServlet("/resp4")
public class ResponseDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 读取文件
FileInputStream fis = new FileInputStream("d://a.jpg");
//2. 获取response字节输出流
ServletOutputStream os = response.getOutputStream();
//3. 完成流的copy
/* byte[] buff = new byte[1024];
int len = 0;
while ((len = fis.read(buff))!= -1){
os.write(buff,0,len);
}*/
IOUtils.copy(fis,os);
fis.close();
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}