🔎核心方法
方法 | 描述 |
(void) setStatus(int sc) | 为该响应设置状态码 |
(void) setHeader(String name, String value) | 设置一个带有给定的名称和值的 header. 如果 name 已经存在, 则覆盖旧的值 |
(void) addHeader(String name, String value) | 添加一个带有给定的名称和值的 header. 如果 name 已经存在, 不覆盖旧的值, 并列添加新的键值对 |
(void) setContentType(String type) | 设置被发送到客户端的响应的内容类型 |
(void) setCharacterEncoding(String charset) | 设置被发送到客户端的响应的字符编码(MIME 字符集). 例如 UTF-8 |
(void) sendRedirect(String location) | 使用指定的重定向位置 URL 发送临时重定向响应到客户端 |
(PrintWriter) getWriter() | 用于向 Body 中写入文本格式数据 |
(OutputStream) getOutputStream() | 用于向 Body 中写入二进制格式数据 |
- 注意
setHeader
类似于将键值对的key
进行覆盖
- 键值对为{1, tom}, 使用
setHeader
设置键值对为{1, homo} 后, 键值对数量为1, 键值对为{1, homo}
addHeader
类似于允许重复的key
- 键值对为{1, tom}, 使用
addHeader
设置键值对为{1, homo} 后, 键值对数量为2, 键值对为{1, tom}, {1, homo}
- 对于状态码 / 响应头的设置要放到 getWriter / getOutputStream 之前, 否则可能失效
setContentType && setCharacterEncoding
使用setContentType
可以设置被发送到客户端的响应的内容类型
使用setCharacterEncoding
可以设置被发送到客户端的响应的字符编码(MIME 字符集)
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("/getParameter") public class GetParameterServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //super.doGet(req, resp); // 预期浏览器会发送一个类似 /getParameter?studentId=10&classId=20 的请求 // 通过 req 的 getParameter 方法拿到 query string 中的内容 String studentId = req.getParameter("studentId"); String classId = req.getParameter("classId"); resp.getWriter().write("学生Id : " + studentId + ", " + "班级Id : " + classId); } }
上述代码的运行结果
出现乱码的原因是未设置响应的类型, 编码的格式
添加resp.setContentType("text/html");
, resp.setCharacterEncoding("utf8");
后的效果
也可以简写为resp.setContentType("text/html; charset=utf8");
sendRedirect
使用sendRedirect
可以将指定的重定向位置 URL 发送临时重定向响应到客户端
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("/redirect") public class RedirectServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //super.doGet(req, resp); } }
上述代码的运行结果
由于未填写对应的内容, 因此页面是空白的
添加resp.sendRedirect("https://www.sogou.com/");
后的效果
将指定的URL(https://www.sogou.com/)
发送临时重定向响应到客户端
抓包的效果🍭
- 此时的状态码为
302
- 此时的 Location 为
https://www.sogou.com/
- 根据上面的信息可以将
resp.sendRedirect("https://www.sogou.com/");
- 替换为
resp.setStatus(302);
,resp.setHeader("Location", "https:www.sogou.com/");
再次抓包, 查看替换后的运行效果🍭
效果与之前相同
关于Keep-Alive
- TCP 的特点
- 面向字节流
- 可靠传输
- 全双工
- 有连接
TCP 是有连接的, 连接可以划分为
- 短连接(每个连接只进行一次请求和响应的传输)
- 长连接(每个连接可进行多次请求和响应的传输)
Keep-Alive: 建议保持长连接
关于状态码 && Body
- 设置状态码, 未设置Body, 返回的是该状态码对应的默认的Body
- 设置状态码, 设置Body, 返回的是该状态码对应的自定义的Body
设置状态码, 未设置Body🍭
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("/status") public class StatusServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //super.doGet(req, resp); // 设置状态码为 404, 但是不设置 Body resp.setStatus(404); } }
设置状态码, 设置Body🍭
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("/status") public class StatusServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //super.doGet(req, resp); // 设置状态码为 404, 设置 Body resp.setStatus(404); resp.getWriter().write("<h1>404NotFound</h1>"); } }
返回 Tomcat 自带的错误页面🍭
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("/status") public class StatusServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //super.doGet(req, resp); // 返回 Tomcat 自带的错误页面 resp.sendError(404); } }
🔎结尾
创作不易,如果对您有帮助,希望您能点个免费的赞👍
大家有什么不太理解的,可以私信或者评论区留言,一起加油