1.Response 设置响应数据功能介绍
1.响应行:HTTP/1.1 200 OK
void setStatus(int sc) :设置响应状态
2.响应头:Content-Type: text/html
void setHeader(String name, String value) :设置响应头键值对
3. 响应体:<html><head>head><body></body></html>
PrintWriter getWriter():获取字符输出流
ServletOutputStream getOutputStream():获取字节输出流
2. Response 完成重定向
2.1 实现方式:
resp.setStatus(302);
resp.setHeader(“location”,“资源B的路径");
简化:
resp.sendRedirect("资源B的路径");
2.2 特点
- 浏览器地址栏路径发生变化
- 可以重定向到任意位置的资源(服务器内部、外部均可)
- 两次请求,不能在多个资源使用request共享数据
与请求转发(forward)的特点完全相反
2.3 代码实现功能
package com.itheima.web.response;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/resp1")
public class ResponseDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("resp1....");
//重定向
/*//1.设置响应状态码 302
response.setStatus(302);
//2. 设置响应头 Location
response.setHeader("Location","/request-demo/resp2");*/
//简化方式完成重定向
//动态获取虚拟目录
String contextPath = request.getContextPath();
response.sendRedirect(contextPath+"/resp2");
//response.sendRedirect("https://www.itcast.cn");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
3.路径问题
3.1 两种使用路径
浏览器使用:需要加虚拟目录(项目访问路径)
服务端使用:不需要加虚拟目录
4.Response 响应字符数据
4.1 使用
1.通过Response对象获取字符输出流
PrintWriter writer = resp.getWriter();
2.写数据
writer.write("aaa");
注意:
- 该流不需要关闭,随着响应结束,response对象销毁,由服务器关闭
- 中文数据乱码:原因通过Response获取的字符输出流默认编码:ISO-8859-1
解决:
resp.setContentType("text/html;charset=utf-8");
4.2 代码方面的实现
response.setHeader("content-type","text/html"); 原始的解决方法
resp.setContentType("text/html;charset=utf-8"); //升级
package com.itheima.web.response;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 响应字符数据:设置字符数据的响应体
*/
@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>");
//细节:流不需要关闭 原因:伴随着运行 response调用完会自动销毁 ,流也就不需要关闭
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
5.Response 响应字节数据
5.1使用:
1.通过Response对象获取字节输出流
ServletOutputStream outputStream = resp.getOutputStream();
2.写数据
outputStream.write(字节数据);
5.2 copy读取数据的两种方式
1.老版经典方式
2.使用IOUtils工具类
1.在pom.xml文件中
- <dependency>
- <groupId>commons-io</groupId>
- <artifactId>commons-io</artifactId>
- <version>2.6</version> </dependency>
2.IOUtils.copy(输入流,输出流);
5.3 代码演示运行
package com.itheima.web.response;
import org.apache.commons.io.IOUtils;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 响应字节数据:设置字节数据的响应体
*/
@WebServlet("/resp4")
public class ResponseDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 读取文件
FileInputStream fis = new FileInputStream("E://javaziliao//彼岸壁纸//女孩 手机 红裙子 白裤袜 好看的腿 二次元高清壁纸.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);
}
}