response
用来设置响应数据
响应数据结构
-
响应行
HTTP/1.1 200 OK
-
响应头
Content-Type: text/html
-
响应体
<h1>Hello World!</h1>
重定向(Redirect)
一种资源跳转方式
// 重定向
// 1. 设置响应状态码
response.setStatus(302);
// 2. 设置响应头
response.setHeader("Location", "/HelloServlet/resp2");
// 简化方式重定向 可替换1.2.两步
response.sendRedirect("/HelloServlet/resp2");
特点对比
重定向 | 转发 |
---|---|
浏览器地址栏路径发生变化 | 浏览器地址栏路径不发生变化 |
可以重定向到任意位置的资源(服务器内部、外部均可) | 只能转发到当前服务器的内部资源 |
两次请求,不能在多个资源使用request共享数据 | 一次请求,可以在转发的资源间使用request共享数据 |
路径问题
浏览器操作 | 服务端操作 |
---|---|
浏览器和服务器之间如:重定向 | 服务器内部发生如:转发 |
需要添加虚拟目录 | 不需要加虚拟目录 |
<a href="www.baidu.com"\/> |
request.getRequestDispatcher("/sendtarget"); |
但是问题出现了,写死的路径会导致程序耦合性增加
所以要动态获取虚拟目录
String contextPath = request.getContextPath();
response.sendRedirect(contextPath + "/resp2");
响应字符数据
// 1. 获取字符输出流
PrintWriter writer = response.getWriter();
writer.write("Use writer!");
// 2. 设置头部信息 这里 content-type 是响应数据的类型
response.setHeader("content-type", "text/html");
writer.write("<a href=\"http:\\\\www.baidu.com\">百度</a>");
// 注:响应输出流不需要手动关闭
中文乱码
默认解码为 ISO-8859-1
在使用流之前设置编码为 utf-8 即可
response.setContentType("text/html;charset=utf-8");
响应字节数据
使用工具类
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
// 响应字节流
// 1. 读取文件
FileInputStream inputStream = new FileInputStream("C:\\pic1.png");
// 2. 获取response字节输出流
ServletOutputStream outputStream = response.getOutputStream();
// 3. 进行流 copy
// byte[] buffer = new byte[1024];
// int len = 0;
// while ((len = inputStream.read(buffer)) != -1) {
// outputStream.write(buffer, 0, len);
// }
// 3. 使用 commons-io 对流进行 copy
IOUtils.copy(inputStream, outputStream);
inputStream.close();