JAVA WEB DAY 03_响应对象(response) & 上下文域(ServletContext)

Response & ServletContext

学习目标

  • 能够使用使用浏览器开发工具查看响应
  • 能够理解响应行(状态行)的内容
  • 能够理解常见的状态码
  • 能够使用Response 对象操作HTTP 响应内容
  • 能够处理响应乱码
  • 能够完成文件下载案例
  • 能够使用ServletContext 域对象

01 HTTP 响应概述[★★★]

HTTP 响应的组成内容有:

  • 响应行、响应头、响应体
  • 浏览器查看响应内容

在这里插入图片描述

02 响应行概述[★★]

响应行的组成内容(3部分):

  • 协议和版本、状态码、状态描述信息
  • 状态码
状态码 含义
200 服务器正常响应数据给浏览器,没有问题
302 服务器告诉浏览器要进行页面重定向
304 服务器告诉浏览器使用本地缓存数据
404 代表请求的资源不存在
405 浏览器使用Get或Post请求时,服务器没有重写doGet或doPost方法时
500 服务器内部错误

03 响应头概述[★★]

  • 响应头信息
常见响应头信息 说明
Location: http://www.baiduc.cn 服务器告诉浏览器要重定向的页面地址
Server:apache tomcat 服务器的类型和名称
Content-Encoding: gzip 服务器告诉浏览器返回内容的压缩格式
Content-Length: 80 服务器返回内容长度:单位 字节
Content-Type: text/html; charset=utf-8 服务器返回内容的类型和编码
Refresh: 1;url=/day29/hello.html 1秒后跳转到指定的页面
Content-Disposition: attachment; filename=abc.zip 用于文件下载
attachment:服务器告诉浏览器返回的内容使用附件存储
filename:附件名字

04 响应体概述[★★★]

响应体:

  • 服务器返回给浏览器显示的数据

响应体数据格式:

  • 文本:纯字符串
  • 二进制:图片、视频、音频

服务器响应数据的方式:

  • 通过字节输出流响应
  • 通过字符输出流响应
  • 服务器响应数据方式
服务器响应数据的方式 描述
OutputStream getOutputStream() 字节输出流
可以操作任意类型的数据
PrintWriter getWriter() 字符输出流
只能操作文本数据

05 response 设置响应行状态码[★★★]

  • response对象设置状态码方法
response对象设置状态码方法 描述
void setStatus(int status) 设置响应行的状态码
单独设置状态码没有任何意义,一般会结合具体的功能设置
  • 设置 状态码 Java
// 目标:通过response对象方法设置状态码
@WebServlet(urlPatterns = "/status")
public class StatusCodeServlet extends HttpServlet {
   

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
         // 设置内容类型和编码
         response.setContentType("text/html;charset=utf-8");
         // 获得字符打印流
         PrintWriter out = response.getWriter();
         out.println("设置了状态码为404");
         // 设置状态码:404
         // 单独设置状态码没有任何意义,一般会结合具体的功能设置
         response.setStatus(404);
    }
}

06 常见状态码 404 和 405 出现的原因[★★]

出现 404 的常见原因:

  • 地址栏地址写错
  • 配置文件出差:web.xml 配置 servlet 地址出错或注解配置出错
  • 访问 WEB-INF 目录下的资源
  • 项目没有部署

出现 405 的常见原因:

  • 没有对应的 doGet 或 doPost

07 response 设置响应头方法介绍[★★★]

  • response对象与设置响应头相关方法
response对象与设置响应头相关方法 描述
void setHeader(String name, String value) 设置响应头信息
name:响应头名字
value:响应头的值
void setContentType(String type) 专门用来设置响应头Content-Type
setContentType(value)等价于setHeader(“Content-Type”,“value”)

08 响应头使用演示_01-refresh[★★]

  • 需求:过 3 秒跳转到另一个网站
  • 步骤:
    1.创建 RefreshServlet
    2.调用 setHeader,设置响应头:("refresh","3;url=http://www.baidu.com")
    3.调用 setStatus,设置响应状态码 200 (可选)
  • 实例代码
@WebServlet(urlPatterns = "/refresh")
public class RefreshServlet extends HttpServlet {
   
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
         // 设置内容类型和编码
         response.setContentType("text/html;charset=utf-8");
         // 获得字符打印流
         PrintWriter out = response.getWriter();

         out.println("3秒后跳转到百度");
         // 设置响应头refresh
         response.setHeader("refresh", "3;url=http://www.baidu.com");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
        this.doPost(request, response);
    }
}

问题
服务器可以通过设置哪个响应头实现浏览器在指定的时间后进行页面跳转?

  • 通过设置响应头 refresh:
    response.setHeader("refresh","3;url=http://www.baidu.com");

09 响应头使用演示_02-location[★★]

服务器如何告诉浏览器进行页面重定向?

  1. 设置状态码为 302
  2. 设置响应头 location 指定重定向页面地址
  • 需求:使用 location 进行页面跳转
  • 通过 response 设置响应头 location 实现页面跳转(页面重定向)
  • 步骤:
    1.创建 LocationServlet
    2.调用 setHeader,设置响应头:("location","http://www.baidu.com")
    3.调用 setStatus,设置相应代码 302
  • 实例代码
@WebServlet(urlPatterns = "/location")
public class LocationServlet extends HttpServlet {
   
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
         // 设置状态码为302
         response.setStatus(302);
         // 设置响应头:location 告诉浏览器进行页面重定向
         response.setHeader("location", "refresh");
         
         // 重定向的简化代码
        response.sendRedirect("http://www.baidu.com");
    }
}

面试
Location 需要与状态码 302 配合使用才能完成页面的转发,这句话正确吗?

  • 错误,是重定向,不是转发

10 响应头使用演示_03-Content-Encoding[★★]

服务器如何实现内容压缩返回给浏览器显示:

  1. 设置响应头Content-Encoding:告诉浏览器内容的压缩格式
  2. 创建压缩输出流对象:用来包装字节输出流(通过响应对象获取的)
  3. 调用压缩输出流对象的write方法输出数据:会对内容进行压缩
  4. 调用压缩流对象的finish方法:告诉浏览器数据返回完毕并释放资源
  • GZIPOutputStream类的方法
构造方法 说明
GZIPOutputStream(OutputStream out) 对传入的输出流进行压缩
并且使用这个传入的输出流输出数据
GZIPOutputStream类的方法 说明
public void write(byte[] b) 输出字节数组内容
使用GZIP格式对内容进行压缩
void finish() 告诉浏览器输出完成并关闭流释放资源
  • 需求:将数据压缩之后再从服务器传输数据到浏览器:可以减少网络的传输量,提高网页的下载速度。
  • 步骤:
    1.如果需要对数据进行压缩,需要使用压缩流,将响应的输出流做为参数。
    2.使用压缩流的write方法:首先会对数据进行压缩处理,然后调用传递进去OutputStream对象的write方法把压缩的数据写出去。
    3.完成将压缩数据写入输出流的操作,如果没有调用结束的方法,则浏览器上看不到东西。
  • 注意事项:
    1.要设置相应响应头信息,告诉浏览器目前内容是以压缩包的形式传输的,不然就会以附件的方式下载下来了。
    2.response.setHeader("Content-Encoding","gzip")
  • 实例代码
@WebServlet(urlPatterns = "/encoding")
public class ContentEncodingServlet extends HttpServlet {
   
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
         // 创建可变字符串
         StringBuilder sb = new StringBuilder();
         for (int i = 0; i < 10000; i++) {
   
             sb.append("abcde"); // 50000
         }
         System.out.println("没有压缩的长度:" + sb.length());

         // 设置响应头:Content-Encoding 告诉浏览器返回内容的压缩格式
        response.setHeader("Content-Encoding","gzip");

         // 获得字节输出流
        OutputStream out = response.getOutputStream();
        // 创建压缩字节输出流
        GZIPOutputStream gzipOut = new GZIPOutputStream(out);
        // 调用压缩流方法输出数据
        // 该方法内部会对数据进行压缩处理,会将压缩后的数据交给out输出
        gzipOut.write(sb.toString().getBytes());
        // 调用finish方法:告诉浏览器内容传输完毕并释放资源
        gzipOut.finish();
    }
}

11 response 设置响应体-响应中文[★★★]

响应数据中文乱码的原因:

  • Tomcat默认使用的码表是欧洲码表(ISO-889-1):不支持汉字

如何解决中文乱码问题

  1. 设置打印流的编码
  2. 告诉浏览器返回内容的类型和编码
    通过调用响应对象的setContentType("text/html;charset=utf-8")方法;

注意事项

  • 设置打印流编码的方法必须在获取打印流对象之前
  • 实例代码
@WebServlet(urlPatterns = "/body")
public class ResponseBodyServlet extends HttpServlet {
   
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   </
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值