HTTP中的响应消息和请求消息一样,分成四部分
- 响应行——格式:
协议/版本 状态码 状态码描述
,比如:HTTP/1.1 200 OK
关于状态码:
▶ 理解:服务器告诉客户端本次请求和响应的情况。
▶ 3位数字
▶ 分类:1xx(服务器接受客户端消息,但没接受完全,等待一会后发送1xx进行询问);
2xx(成功);
3xx(重定向。302重定向,304访问缓存)
4xx(客户端错误。404路径没有对应资源,405请求方式没有对应的doXxx方法)
5xx(服务器端错误)- 响应头——格式:
键值对
。是服务器告诉客户端的信息。
▶ Content-Type:本次响应体数据格式以及编码格式。比如 text/html utf-8
▶ Content-disposition:以什么格式打开响应体数据(inline默认当前页面打开;attachment;filename=xxx 以附件形式打开响应体,文件下载)- 响应空行
- 响应体:传输的数据。流的形式获取
response
▶ response对象的功能
与request相比比较单一 ——— 设置相应信息:
- 设置相应行:
setStatus(int sc)
,设置状态码 - 设置响应头:
setHeader(String name, String value)
- 设置响应体:
getWriter()
返回PrintWriter /getOutputStream()
返回ServletOutputStream
虽然用到的方法很少,但可以完成下面的强大功能 ↓
▶ 重定向
// 1.设置状态码为302
response.setStatus(302);
// 2.设置响应头location
response.setHeader("location", "/虚拟目录/资源路径");
// 简单的重定向写法
response.sendRedirect("/虚拟目录/资源路径");
// 极推荐写法 (虚拟目录是动态的)
response.sendRedirect(request.getContextPath() + "/资源路径");
转发和重定向都实现了资源的跳转。
重定向(redirect)的特点:地址栏改变;可以访问其他站点(服务器)的资源;两次请求,因此不能使用request对象来共享数据
转发(forward)的特点:地址栏不变;只能访问当前服务器下的资源;一次请求,因此可以使用request对象来共享数据
其实,资源路径就是相对路径,虚拟目录就是绝对路径(的一部分)
重定向可以访问当前服务器之外的资源,因此必须写虚拟目录+资源路径——虚拟目录用来映射到服务器;
转发是在服务器内部的资源跳转,服务器已知,自然就不需要虚拟目录了
给 浏览器 使用的资源,用 绝对路径——虚拟目录 + 资源路径
给 服务器 使用的资源,用 相对路径——资源路径
▶ 服务器输出字符流到浏览器
// 1.获取字符输出流
PrintWriter pw = response.getWriter();
// 2.输出数据
pw.write("<h1>hello<h1>");
(★) 中文乱码问题:
response对象是从tomcat自动创建的,response的流的编码方式默认是不支持中文的;
退一步讲,即使流采用支持中文的编码方式,浏览器也不一定能采用相同的解码方式。
解决方案: response.setContentType("text/html;charset=utf-8"); (▲ 注意写在获取流之前! ! !)
这行代码有两层含义:
1. 服务器端的流采用utf-8编码
2. 浏览器端也要使用utf-8解码
▶ 服务器输出字节流到浏览器
ServletOutputStream sos = response.getOutputStream();
sos.write("<h1>hello<h1>".getBytes());
关于request&response的一些理解
- request的作用主要是传递信息和参数,因此它的方法一般都是get,且较多,且只是用来获取信息、参数、对象,功能并不强大;response的作用数设置响应的信息,因此它们的方法一般是set,且较少,有一些完成业务的强大功能
- request&response遇到的中文乱码问题一般都出现在请求体/响应体中——request的解决方案是:
request.setCharacterEncoding("utf-8")
,response的解决方案是response.setContentType("text/html;charset=utf-8")
End ♬
by a Lolicon ✪