Servlet | Response 对象详解


1、写在前面

Response对象,需要先了解HTTP协议的响应信息的格式,如果这部分知识还没有了解过,请点击这些字先行学习HTTP协议

点击这些字学习Request对象详解


2、Response 概述

Respoinse的功能是:设置响应消息,可以分为以下三类:

  • 设置响应行:
    • 格式:HTTP/1.1 200 OK
    • 设置状态码:setStatus(int sc)
  • 设置响应头:setHeader(String name,String value)
  • 设置响应体的步骤:
    • 获取输出流:
      • 字符输出流:PrintWriter getWriter()
      • 字节输出流:ServletOutputStream getOutputStream()
    • 使用输出流,将数据输出到客户端浏览器

下面通过四个案例学习Response对象的使用


3、重定向

画一张图理解一下什么是重定向:
在这里插入图片描述
现在浏览器要访问 A 资源,但是 A 资源发现需要 B 资源才能完成浏览器的要求,于是 A 资源告诉浏览器:你需要访问 B 资源,于是浏览器就去访问 B 资源了,重定向成功。

A 需要告诉浏览器两点信息,分别是状态码302和 B 的路径。下面演示一下重定向操作:

需求:ResponseServlet01重定向到ResponseServlet02,分别在两个Servlet中打印1被访问了2被访问了

IDEA中,新建一个模块,然后新建一个包,再新建两个Servlet,分别是ResponseServlet01ResponseServlet02
在这里插入图片描述
ResponseServlet01中,打印一句话:

System.out.println("responseServlet01被访问了...");

然后设置状态码为302

response.setStatus(302);

最后设置响应体location

response.setHeader("location","/ResponseDemo/responseServlet02");

同样的,在ResponseServlet02中打印:

System.out.println("responseServlet02被访问了...");

ResponseServlet01代码展示:

package com.wzq.response;

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("/responseServlet01")
public class ResponseServlet01 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //打印一句话
        System.out.println("responseServlet01被访问了...");

        //1. 设置状态码为302
        response.setStatus(302);
        //2. 设置响应头location
        response.setHeader("location","/ResponseDemo/responseServlet02");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request,response);
    }
}

运行一下:
在这里插入图片描述
页面重定向成功!

但是我们发现每次重定向都要设置状态码,可不可以省略这个步骤呢?

答:可以,Response对象提供了一个重定向的方法:sendRedirect(String path),只需要填一个重定向的路径就可以了,所以上面的两句代码可以替换为:

response.sendRedirect("/ResponseDemo/responseServlet02");

下表展示了重定向请求转发区别

重定向 请求转发
Response调用 Request调用
地址栏发生变化 转发地址栏路径不变
可以访问其他站点的资源 只能访问当前服务器下的资源
两次请求,不能使用Request共享数据 一次请求,可以使用Request共享数据

4、服务器输出字符数据到浏览器

步骤:

  1. 设置编码
  2. 获取字符输出流
  3. 输出数据

新建一个类,代码如下:

package com.wzq.response;

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;
import java.io.PrintWriter;

@WebServlet("/responseServlet03")
public class ResponseServlet03 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //1. 设置编码
        response.setContentType("text/html;charset=utf-8");
        //2. 获取字符输出流
        PrintWriter pw = response.getWriter();
        //3. 输出数据
        pw.write("<h1>你好,Response</h1>");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request,response);
    }
}

输出结果:
在这里插入图片描述


5、服务器输出字节数据到浏览器

一般我们用字节流向浏览器输出图片之类的资源,现在只演示输出一些字

步骤:

  1. 获取字节输出流
  2. 输出数据

新建一个类,代码如下:

package com.wzq.response;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/responseServlet04")
public class ResponseServlet04 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //1. 获取字节输出流
        ServletOutputStream sos = response.getOutputStream();
        //2. 输出数据
        sos.write("你好".getBytes());
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request,response);
    }
}

输出结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lesileqin/article/details/112534406