response

服务器处理请求的流程:
服务器每次收到请求,都会为这个请求开辟一个新的线程
服务器会把客户端的请求数据封装到request对象中,request就是请求数据的载体
服务器还会创建response对象,这个对象与客户端连接在一起,它可以用来向客户端发送响应

1.response状态码、响应头
状态码:200表示成功、302表示重定向、404表示客户端错误、500表示服务器端错误

sendError(int v)发送错误状态码,例如404、500
sendError(int v,String msg) 例如resp.sendError(404,”就不给你看”)
setStatus(int v)发送成功的状态码,可以用来发送302

响应头:Content-Type、Refresh、Location等等

setHeader(String name,String value)适用于单值的响应头
resp.setHeader(“aaa”,”ASDF”);
addHeader(String name,String value)适用于多值的响应头
resp.setHeader(“aaa”,”ASDF”);
resp.addHeader(“aaa”, “BJKF”);
setIntHeader(String name,int value)适用于单值的int类型的响应头
resp.setIntHeader(“Content-Length”, 888);
addIntHeader(String name,int value)适用于多值的int类型的响应头
setDateHeader(String name,long value)适用于单值的毫秒类型的响应头
resp.setDateHeader(“expires”,1000*60*60*24);
addDateHeader(String name,long value)适用于多值的毫秒类型的响应头

发送302,设置Location头,完成重定向!
定时刷新,设置Refresh头
禁用浏览器缓存:Cache-Control、pragma、expires

2.response之重定向
重定向两次请求

google工具查看运行情况

BServlet.java

       @WebServlet("/Bservlet")
public class Bservlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.getWriter().append("Served at: ").append(request.getContextPath());
        response.setHeader("Location", "/jsp/CServlet");
        response.setStatus(302);
    }
}

CServlet.java

    @WebServlet("/CServlet")
public class CServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.getWriter().append("Served at: ").append(request.getContextPath());
    }

}

发送请求:http://localhost:8080/jsp/Bservlet
结果: 客户端地址栏变成:http://localhost:8080/jsp/CServlet
页面显示:Served at: /jsp

3.response之定时刷新(可以理解成定时重定向)
DServlet.java

     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      /**
       * 下面是用来发送响应体!
       */
        PrintWriter out=resp.getWriter();
        out.print("欢迎登陆成功!,5秒自动跳转到主页。您看到的是一定是乱码。");
        /**
         * 设置名为Refresh的响应头
         */
        resp.setHeader("Refresh","5;URL=/jsp/EServlet");
    }

EServlet.java

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.getWriter().append("Served at: ").append(request.getContextPath());
        response.getWriter().print("还是乱码lll");
    }

发送请求:http://localhost:8080/jsp/DServlet
结果: 先显示Servlet处理的响应内容,
5秒钟之后地址栏变成http://localhost:8080/jsp/EServlet

4.response之禁止缓存
Cache-Control pragma expires

  response.setHeader("Cache-Control", "no-cache");
  response.setHeader("pragma", "no-cache");
  response.setDateHeader("expires",-1);//过期时间,马上过期
<meta>标签可以代替响应头
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">

5.response响应体
response虽然有两种流,getOutputStream()和getWriter(),但是不能同时使用

     1.PrintWriter,用来向客户端发送字符数据!需要设置编码
       PrintWriter out=response.getWriter();

     2.ServletOutputStream,用来向客户端发送字节数据。
       ServletOutputStream st=response.getOutputStream();
案例:
   1.1使用PrintWriter发送字符数据
   1.2使用ServletOutputStream发送字节数据(图片)
    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("pragma", "no-cache");
    response.setDateHeader("expires",-1);//过期时间,马上过期
    String s="Hello outputStream中文";//字符
    byte[] bytes=s.getBytes(); //转成字节
    response.getOutputStream().write(bytes);//字节流是万能的

    请求内容:http://localhost:8080/jsp/FServlet
    结果:Hello outputStream中文

打印出照片

 String path="F:/A.png";
 FileInputStream in=new FileInputStream(path);
 byte[] bytes=IOUtils.toByteArray(in);//读取输入流内容的字节到字节数组中
 response.getOutputStream().write(bytes);

发送请求:http://localhost:8080/jsp/GServlet
结果:在页面打印出照片

6.重定向
设置302,设置Location
另外一种方法是sendRedirect(“/项目名/cservlet”);

### Spring Boot Response 使用方法 在 Spring Boot 应用程序中,`ResponseEntity<T>` 是一种常用的方式来自定义 HTTP 响应的状态码、头信息以及主体内容。这使得开发者能够灵活控制返回给客户端的信息。 对于简单的场景,可以直接从控制器方法返回 `String`, `void` 或者 POJO 对象。当返回这些类型的对象时,Spring MVC 会自动将其转换成 JSON 或 XML 形式的响应体[^2]。 然而,在更复杂的情况下,比如需要修改默认的行为或是添加额外的头部字段,则应该考虑使用 `HttpServletResponse` 参数或者封装到 `ResponseEntity<?>` 中去实现。下面是一个利用 `ResponseEntity<String>` 来构建自定义响应的例子: ```java @GetMapping("/custom-response") public ResponseEntity<String> customResponse() { HttpHeaders headers = new HttpHeaders(); headers.add("Custom-Header", "HeaderValue"); String body = "{ \"message\": \"This is a custom message\" }"; return new ResponseEntity<>(body, headers, HttpStatus.OK); } ``` 另外,为了满足某些特殊需求,可能还需要对原始的 `HttpServletResponse` 进行扩展或替换。由于直接操作 `HttpServletResponse` 的输出流存在局限性——即无法读取已经写出的数据——因此可以通过创建一个装饰器模式下的包装类来解决这个问题[^4]。 #### 自定义 HttpServletResponseWrapper 示例 通过继承 `HttpServletResponseWrapper` 类并覆盖相应的方法,可以在不改变原有接口的前提下增强功能。这里展示了一个简单版本的实现方式: ```java import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; // 定义一个新的 Wrapper 类 class CustomHttpResponse extends HttpServletResponseWrapper { private final ByteArrayOutputStream capture = new ByteArrayOutputStream(); public CustomHttpResponse(HttpServletResponse response) throws IOException { super(response); } @Override public OutputStream getOutputStream() throws IOException { return this.capture; // 替换原有的输出流为内存中的字节数组 } // 可以在此处添加更多逻辑... } // 控制器内调用此包装后的响应对象 @PostMapping("/wrap-response") @ResponseBody public void wrapResponse(HttpServletRequest request, HttpServletResponse response) throws Exception { try (var wrappedResp = new CustomHttpResponse(response)) { // 执行业务逻辑并将结果写入wrappedResp byte[] outputBytes = wrappedResp.getCapture().toByteArray(); // 获取最终要发送出去的内容 // 将捕获的数据重新设置回原responseresponse.getOutputStream().write(outputBytes); response.flushBuffer(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值