一、Response体系结构


1.ServletResponse

        Java提供的请求对象根接口

2.HttpServletResponse(★)

        Java提供的对HTTP协议封装的请求对象接口

3.ResponseFacade

        Tomcat定义的实现类

二、Response设置响应数据

1.设置响应行的数据

void setStatus(int sc)
设置响应状态码sc

2.设置响应头的数据

void setHeader(String name, String value)
设置响应头键值对

3.设置响应体的数据

        使用IO流设置响应体的数据。
ServletOutputStream  getOutputStream()
获取字节输出流
PrintWriter getWriter() 获取字符输出流
(1)响应字符数据
        ①获取字符输出流:
PrintWriter writer = response.getWriter();
        ②写数据:
writer.write("数据内容");
(2)中文乱码问题:
        因为通过Response获取的字符输出流默认编码为ISO-8859-1,所以会出现中文乱码问题。可以使用setContentType()方法来设置编码:
response.setContentType("text/html;charset=UTF-8");
【tips】setContentType方法有两个功能:
                ①设置响应头content-type的值;
                ②设置编码,默认为ISO-8859-1
(3)响应字节数据
        ①获取字节输出流:
ServletOutputStream os = response.getOutputStream();
        ②写数据:
os.write(bys, 0, len);
【tips】IOUtils工具类:提供了输入流输出流的常用工具方法,如数据复制等:
                ①在pom.xml中导入坐标:
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>
                ②数据复制:
IOUtils.copy(输入流对象, 输出流对象);

三、Response完成重定向

        重定向(Redirect):一种资源跳转方式。

1.重定向的实现

(1)设置响应状态码302:
resp.setStatus(302);
(2)在响应头设置资源位置:location:xxx:
resp.setHeader("location","资源B的路径");
【tips】★★★因为每次重定向的状态码(302)和响应头的键(location)都是一样的,只是键值(资源路径)不一样,所以还有一种简易的重定向写法:
resp.sendRedirect("资源B的路径");

2.重定向的特点


(1)浏览器地址栏路径发生变化
(2)可以重定向到任意资源(服务器内外皆可);
(3)两次请求(所以地址栏发生变化),在多个资源间不能使用request共享数据,可使用会话跟踪技术共享数据。
【tips】资源路径问题
:什么时候加虚拟目录ContextPath,什么时候不加虚拟目录?
        明确该目录是谁来使用:
                ①浏览器使用:需要加虚拟目录(即项目路径);
                ②服务器使用:不加。