## Http 响应
与 Http 请求消息相对应,响应消息是指服务器发送给客户端浏览器的数据,可以分为响应行,响应头,响应空行,响应体。
### 响应行
* 响应协议/版本:例如 `HTTP/1.1`
* 响应状态码:服务器告知客户端浏览器本次请求和响应的状态
1. `1xx`:服务器收到客户端消息,但是需要客户端继续发送请求才能完成后续工作
2. `2xx`:成功,例如 `200`
3. `3xx`:重定向,例如 `302` 重定向,`304` 访问缓存
4. `4xx`:客户端错误,例如 `404` 请求路径没有对应的资源,`405` 请求方式没有对应的 `doXxx` 方法
5. `5xx`:服务器端错误,例如 `500` 服务器内部出现异常
* 状态码描述:例如,响应行中 `HTTP/1.1 200 OK`,OK 代表成功
### 响应头
响应头中封装着服务器传递给客户端浏览器的一些信息,使用键值对存储,格式为 `响应头名称:响应头值`,常见的响应头有
* Content-Type:服务器告知客户端浏览器本次**响应体**数据格式以及编码格式,响应头值例如 `text/html; charset=utf-8`
* Content-disposition:服务器告知客户端浏览器以什么格式打开响应体数据,响应值例如
* `in-line` 默认值,在当前页面内打开
* `attachment;filename=xxx` 以附件形式打开响应体,可以用于文件下载
### 响应空行
就是一个空行,用于分隔响应头和响应体
### 响应体
服务器要传输给客户端的数据
## ServletResponse
```java
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
```
`service()` 方法中需要传入的第二个参数,即 `ServletResponse` 对象,`ServletResponse` 的主要功能就是设置相应消息
1. 设置响应状态码
```java
void setStatus(int var1)
```
2. 设置响应头:入参分别为要设置的响应头的名称和值
```java
void setHeader(String name, String value)
```
3. 设置响应体
1. 获取输出流
```java
PrintWriter getWriter(); // 获取打印流,用于输出字符流
ServletOutputStream getOutputStream(); // 获取字节输出流,用于输出字节流
```
2. 使用输出流,将数据输出到客户端浏览器
### 使用 ServletResponse 完成重定向
重定向是区别于请求转发的另外一种资源跳转方式,当服务器接收到浏览器发来的请求时,通过响应告知浏览器要跳转的资源的路径,此时响应状态码为 `302`,然后浏览器使用新的资源路径重新发起请求

**方法一** 设置状态码和 `location` 响应头
```java
response.setStatus(302);
response.setHeader("location","/ServletResponse/demo2"); // 参数二为要跳转的资源路径
```
**方法二** 直接使用封装好的方法
```java
response.sendRedirect("/ServletResponse/demo2"); // 方法一中,只有资源路径是可变参数
```
重定向和请求转发作为两种资源跳转方式,有以下不同点
||请求转发|重定向|
|---|---|---|
|完成跳转的对象|`RequestDispatcher` 对象的 `forward()` 方法|`ServletResponse` 对象的 `senndRedirect` 方法|
|跳转的资源路径|只能跳转至当前服务器的资源|可以跳转至任意资源|
|浏览器地址栏|路径不会改变|路径会改变|
|请求是否是同一次|是,可以使用 `ServletRequest` 域对象共享数据|否,不可以使用 `ServletRequest` 域对象共享数据|
### 输出字符流到浏览器
```java
@WebServlet(urlPatterns = {"/demo3"})
public class ResponseDemo3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter pw = response.getWriter();
String str = "

Http响应和ServletResponse对象