JavaWeb Response:设置响应数据

业务处理完后,后台就需要给前端返回业务处理的结果即响应数据,把响应数据封装到response对象中,后台服务器[Tomcat]会解析response对象,按照 [响应行+响应头+响应体] 格式拼接结果,浏览器最终解析结果,把内容展示在浏览器给用户浏览。

继承体系

在这里插入图片描述

Reponse的继承体系和Request的继承体系非常相似。

常用方法

设置响应行

在这里插入图片描述

  • void setStatus(int sc):设置响应状态码。

设置响应头

在这里插入图片描述

  • void setHeader(String name, String value):设置响应头键值对。

设置响应体

在这里插入图片描述

对于响应体,是通过字符、字节输出流的方式往浏览器写。

  • PrintWriter getWriter():获取字符输出流。
  • ServletOutputStream getOutputStream():获取字节输出流。

请求重定向

Response重定向(redirect),一种资源跳转方式。

重定向的特点:

  • 浏览器地址栏路径发送变化
  • 可以重定向到任何位置的资源(服务内容、外部均可)
  • 两次请求,不能在多个资源使用request共享数据

重定向的流程:

  1. 浏览器发送请求给服务器,服务器中对应的资源A接收到请求
  2. 资源A现在无法处理该请求,就会给浏览器响应一个302的状态码+location的一个访问资源B的路径
  3. 浏览器接收到响应状态码为302就会重新发送请求到location对应的访问地址去访问资源B
  4. 资源B接收到请求后进行处理并最终给浏览器响应结果,这整个过程就叫重定向

在这里插入图片描述

重定向的实现方式:

resp.setStatus(302);
resp.setHeader("location", "资源B的访问路径");

在这里插入图片描述

常用方法

  • setStatus(int status):设置状态码。
  • setHeader(String key, String value):设置响应头。
  • sendRedirect(String uri):重定向的快捷方法,直接传入uri即可。
@WebServlet("/resp1")
public class ResponseDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        System.out.println("resp1....");
        //重定向
        //1.设置响应状态码 302
        response.setStatus(302);
        //2. 设置响应头 Location
        response.setHeader("Location","/request-demo/resp2");

        // 重定向,简化写法
        // resposne.sendRedirect("/request-demo/resp2");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        this.doGet(request, response);
    }
}
@WebServlet("/resp2")
public class ResponseDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        System.out.println("resp2....");
    }

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

资源路径

  • 浏览器使用:需要加虚拟目录(项目访问路径)
  • 服务端使用:不需要加虚拟目录

相对路径:通过相对路径不可以确定唯一资源,如:./index.html 不以/开头,以 . 开头路径

规则: 找到当前资源和目标资源之间的相对位置关系

  • ./:当前目录
  • ../:后退一级目录

绝对路径:通过绝对路径可以确定唯一资源,如:http://localhost/arbor/responseDemo2,以/开头的路径。

规则:

  • 给客户端浏览器使用: 需要加虚拟目录(项目的访问路径)
  • 给服务器使用: 不需要加虚拟目录

响应字符数据

要想将字符数据写回到浏览器,需要两步:

  1. 通过Response对象获取字符输出流:PrintWriter writer = resp.getWriter();
  2. 通过字符输出流写数据:writer.write("aaa");

getWriter()获取的流的默认编码是ISO-8859-1,所以要设置流的默认编码格式(获取流之前设置)。

//设置响应的数据格式及数据的编码
// text/html:告诉浏览器返回的数据类型是HTML类型数据
response.setContentType("text/html;charset=utf-8");
// response.setHeader("content-type","text/html;charset=utf-8"); 和上面一行代码实现的效果一致
PrintWriter writer = resp.getWriter();
writer.write("你好");

响应字节数据

将字节数据写回到浏览器,需要两步:

  1. 通过Response对象获取字节输出流:ServletOutputStream outputStream = resp.getOutputStream();
  2. 通过字节输出流写数据:outputStream.write(字节数据);

返回一个图片文件到浏览器:

@WebServlet("/resp4")
public class ResponseDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        //1. 读取文件
        FileInputStream fis = new FileInputStream("d://a.jpg");
        //2. 获取response字节输出流
        ServletOutputStream os = response.getOutputStream();
        //3. 完成流的copy
        byte[] buff = new byte[1024];
        int len = 0;
        while ((len = fis.read(buff))!= -1){
            os.write(buff,0,len);
        }
        fis.close();
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        this.doGet(request, response);
    }
}
  • 28
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要获取响应正文内容,可以使用JavaWeb中的HttpServletResponse对象的getWriter()方法获取输出流,然后通过输出流将响应正文内容写入到响应中。示例代码如下: ```java protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.write("Hello World!"); out.close(); } ``` 要实现图片的下载,可以设置响应头信息,告诉浏览器这是一个文件下载,然后将图片的二进制数据写入到输出流中。示例代码如下: ```java protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取要下载的文件 String filePath = "path/to/image.jpg"; File file = new File(filePath); // 设置响应头信息 response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=" + file.getName()); // 将文件数据写入到输出流中 OutputStream out = response.getOutputStream(); FileInputStream in = new FileInputStream(file); byte[] buffer = new byte[1024]; int len = 0; while ((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); } in.close(); out.flush(); out.close(); } ``` 注意:在实际应用中,要根据具体情况设置响应头信息,比如文件类型、文件名等。同时也要注意文件路径的安全性,避免出现安全漏洞。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VincentHu_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值