Servlet的常用Api—HttpServletResponse

文章详细介绍了Servlet中HttpServletResponse接口的关键方法,包括设置状态码、内容类型、字符编码、重定向以及Keep-Alive机制。通过示例代码解释了如何使用这些方法来处理响应,如避免乱码问题和实现临时重定向。同时,讨论了状态码与响应体的关系。
摘要由CSDN通过智能技术生成

🔎核心方法


方法描述
(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);
    }
}

在这里插入图片描述

🔎结尾

创作不易,如果对您有帮助,希望您能点个免费的赞👍
大家有什么不太理解的,可以私信或者评论区留言,一起加油

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值