Servlet 之 Responses
1. HTTP 协议
超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应,分为:
-
请求消息:客户端发送给服务端的数据,数据格式包含:请求行、请求头、请求空行、请求体
-
响应消息:服务段发送给客户端的数据,数据格式:
- 响应行
- 组成:协议/版本 响应状态码 状态码描述
- 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态,都是 3 个数字
- 1xx:服务端接收客户端消息,但没有接收完成,等待一段时间后,发送 1xx 状态码
- 2xx:成功,如:200
- 3xx:重定向,如:302 重定向、304 访问缓存
- 4xx:客户端错误,如:404 请求路径没有对应的资源、405 没有对应的请求方式
- 5xx:服务端错误,如:500 服务器内部出现异常
- 响应头:格式(键值对形式):头名称: 值,常见的有:
Content-Type
:服务器告诉客户端本次响应体数据格式以及编码格式Content-disposition
:服务器告诉客户端以什么格式打开响应体数据,如in-line
默认值,表示在当前页面打开、attachment;filename=xxx
:以附件形式打开响应体如:文件下载
- 响应空行
- 响应体:传输的数据
- 响应行
响应字符串格式示例:
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 101
Date: Wed, 06 Jun 2018 07:08:42 GMT
<html>
<head>
<title>$Title$</title>
</head>
<body>
hello , response
</body>
</html>
2. Response 对象
Response
对象可以设置响应消息,比如:
- 设置响应行:如:格式:HTTP/1.1 200 ok、设置状态码:
setStatus(int sc)
- 设置响应头:
setHeader(String name, String value)
- 设置响应体:使用步骤:
- 获取输出流:字符输出流获取方法
PrintWriter getWriter()
、字节输出流获取方法ServletOutputStream getOutputStream()
- 使用输出流,将数据输出到客户端浏览器显示
- 获取输出流:字符输出流获取方法
2.1 重定向和转发
两者区别
- 重定向
redirect
- 地址栏发生变化
- 访问其他站点(服务器)的资源
- 是两次请求,不能使用
request
对象来共享数据
- 转发
forward
- 地址栏路径不变
- 只能访问当前服务器下的资源
- 是一次请求,可以使用
request
对象来共享数据
RedirectServlet1.java
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;
@WebServlet("/responseDemo1")
public class RedirectServlet1 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get 请求!");
// 请求 responseDemo1,重定向到 responseDemo2
// 方法一
resp.setStatus(302); // 1. 设置状态码为 302
resp.setHeader("location", "responseDemo2"); // 2. 设置响应头
// 方法二:动态获取虚拟目录(推荐)
String contextPath = req.getContextPath();
System.out.println(contextPath);
resp.sendRedirect(contextPath + "/responseDemo2"); // 重定向
//response.sendRedirect("https://www.baidu.com");
}
}
RedirectServlet2.java
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;
@WebServlet("/responseDemo2")
public class RedirectServlet2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("responseDemo2 doPost......");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("responseDemo2......");
}
}