写点什么

【JavaWeb】一文搞懂 Response

作者:游坦之
  • 2022-11-27
    山东
  • 本文字数:3460 字

    阅读完需:约 11 分钟

1 Response 继承体系

response 和 request 一样


2 Response 响应

2.1 响应行


2.2 响应头


2.3 响应体


3 Response 重定向

3.1 什么是重定向

重定向(Redirect):一种资源跳转方式


3.1.1 重定向实现的步骤

  1. 告诉浏览器,这件事我处理不了:状态码 302

  2. 你去找别人吧,告诉别人的位置 location:xxx

3.1.2 例子

两个核心的方法:


  • SetStatus(302 ):用来设置状态码

  • SetHeader("location","虚拟路径/资源 B 的路径"):用来让服务器找下家


package com.you.web.response;
import javax.jws.WebService;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(urlPatterns = "/webResponse01")public class webResponse01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("webResponse01...."); /*1、设置状态码*/ resp.setStatus(302); /*2、设置重定向资源目录*/ resp.setHeader("location","/JavaWeb_Demo_05_war/webResponse02"); }
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req,resp); }}
复制代码


package com.you.web.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(urlPatterns = "/webResponse02")public class webResponse02 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("webResponse02...."); }
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req,resp); }}
复制代码


3.2 重定向简化

基于 3.1 重定向需要两个核心方法,但是都是固定的代码,只有资源路径需要更改,所以 Java 的开发者替我们封装了一个代码只需要传入资源路径即可。



如下


 resp.sendRedirect("/JavaWeb_Demo_05_war/webResponse02");
复制代码

3.3 重定向的特点

  1. 浏览器地址栏路径发生变化

  2. 可以重定向到任意位置(服务器内部、外部均可)

  3. 两次请求,不能再多个资源适用 request 共享数据

3.4 资源路径(要不要加虚拟目录)

3.4.1 两种情况

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


  • 服务端使用:不需要加虚拟目录

3.4.2 动态配置虚拟目录

上一章:一文搞懂 Request http://t.csdn.cn/8FGMd 提到一个方法可以获取虚拟目录



将 WebResponse01 修改成 如下代码



【效果】



简单提一下为什么要动态配置虚拟目录?


因为在项目开放过程中,我们很有可能修改项目的访问路径,这样的话重定向的可维护性非常的差,所以需要配置虚拟目录。

4 Response 响应字符数据

4.1 使用

  1. 通过 Response 对象获取字符输出流。


   PrintWriter writer = resp.getWriter();
复制代码


  1. 写数据


   wirter.write("aaa")
复制代码


​ 这个流是不需要关闭的,随着响应结束,response 对象销毁,由服务器关闭

4.1.1 实战

写一段如下的代码


@WebServlet("/webResponse03")public class webResponse03 extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        PrintWriter writer = resp.getWriter();        writer.write("aaa");        writer.write("<h1>aaa</h1>");    }
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req,resp); }}
复制代码


效果



4.2 设置格式

浏览器默认认为所有的字符串都是文本格式,若是想渲染前端标签,需要设置格式


加上这一句,设置成 html 格式就可以了



resp.setHeader("content-type","text/html");
复制代码


效果图:


4.3 解决中文乱码

getWriter 的默认编码规则是 ISO-8859-1,使用中文字符会乱码。


核心方法:不仅可以设置格式,还可以设置编码


void setContentType(String type)
复制代码


设置编码需要在获取之前


@WebServlet("/webResponse03")public class webResponse03 extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        /* 解决中文乱码 */        resp.setContentType("text/html;charset=UTF-8");
PrintWriter writer = resp.getWriter(); writer.write("若风"); writer.write("<h1>aaa</h1>"); }
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req,resp); }}
复制代码


5 Response 响应字节数据

5.1 使用

  1. 通过 Response 对象,获取字节输出流


   ServletOutputStream outputStream = resp.getOutputStream();
复制代码


  1. 写数据


   outputStream.write(字节数据);
复制代码

5.2 例子

5.2.1 准备图片

首先找到一张石原里美的图片放到一个地方

5.2.2 代码

package com.you.web.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.FileInputStream;import java.io.IOException;
@WebServlet("/webResponse04")public class webResponse04 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { /* 1、读取文件 */ FileInputStream fis = new FileInputStream("D:\\Project\\Pro\\JavaWeb-Demo-05\\src\\main\\resources\\static\\1.jpg"); /* 2、获取字节输出流 */ ServletOutputStream os = resp.getOutputStream(); /* 3、完成流的Copy */ byte[] buff = new byte[1024]; int len = 0; while((len = fis.read(buff))!=-1) { os.write(buff); } fis.close();
}
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req,resp); }}
复制代码

5.2.3 效果

可以看到美美的石原里美了!


5.2.4 IOUtils 的使用

IOUtils 包含一些工具类,用于处理读,写和拷贝。这些方法基于 InputStream, OutputStream, Reader 和 Writer 工作。


此处用到了 IOUtils 流的 Copy

5.2.4.1 导入依赖

 <dependency>      <groupId>commons-io</groupId>      <artifactId>commons-io</artifactId>      <version>2.11.0</version></dependency>
复制代码

5.2.4.2 使用 IOUtils 代替手写的 Copy


@WebServlet("/webResponse04")public class webResponse04 extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        /* 1、读取文件 */        FileInputStream fis = new FileInputStream("D:\\Project\\Pro\\JavaWeb-Demo-05\\src\\main\\resources\\static\\1.jpg");        /* 2、获取字节输出流 */        ServletOutputStream os = resp.getOutputStream();        /* 3、完成流的Copy */        IOUtils.copy(fis,os);                fis.close();
}
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req,resp); }}
复制代码

5.2.4.3 效果图

美美的石原里美还在!



用户头像

游坦之

关注

还未添加个人签名 2022-10-14 加入

还未添加个人简介

评论

发布
暂无评论
【JavaWeb】一文搞懂Response_javaWeb_游坦之_InfoQ写作社区