Java Request和Response对象 - Response篇
创始人
2025-05-30 22:22:28

文章目录

    • Response
      • Response体系结构
      • Response设置响应数据
      • Response完成重定向
      • Response响应字符数据
      • Response 响应字节数据

Request: 使用 request对象来获取请求数据

Response: 使用 response对象来设置响应数据

Response

Response体系结构

Response体系结构和Request体系结构是一样的

在这里插入图片描述

Response设置响应数据

响应数据同样分为3部分

响应头

响应行

响应体

设置响应头的方法:

方法名描述
void setStatus(int sc)设置响应状态码

设置响应行的方法:

方法名描述
void setHeader(String name, String value)设置响应头键值对

设置响应体的方法:

方法名描述
PrintWriter getWriter()获取字符输出流
ServletOutputStream getOutputStream()获取字节输出流

Response完成重定向

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

如下图: 浏览器向资源A发送请求, 资源A响应给浏览器, 响应状态码302告知浏览器资源A处理不了, 去找另一个资源, 通过location: xxx的方式告知浏览器去找哪一个资源; 浏览器收到响应后, 再向其他资源发送请求

!在这里插入图片描述

实现方式:

基本方式

// 设置响应状态码
resp.setStatus(302);
// 设置另一个资源的访问路径
resp.setHeader(“location”,“资源B的路径");

简化方式

resp.sendRedirect("资源B的路径");

示例代码:

基本方式

@WebServlet("/reps1")
public class ResponseDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("reps1...");// 重定向基本方式// 1. 设置响应状态码302response.setStatus(302);// 2. 设置响应头response.setHeader("location", "/request-demo/reps2"); // 注意重定向需要添加虚拟目录}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

简化方式

@WebServlet("/reps1")
public class ResponseDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("reps1...");// 重定向简化方式response.sendRedirect("/request-demo/reps2");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

重定向的特点:

重定向后浏览器地址栏路径发生变化

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

两次请求,不能在多个资源使用request共享数据

路径问题: 明确路径谁使用?

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

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

一旦虚拟路径发生了改变, 我们重定向的固定路径便无法访问, 所有我们需要动态获取虚拟路径:

@WebServlet("/reps1")
public class ResponseDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("reps1...");// 动态获取虚拟路径String contextPath = request.getContextPath();// 重定向response.sendRedirect(contextPath + "/reps2");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

Response响应字符数据

响应字符数据也就是设置字符数据的响应体, 通过Response对象获取字符输出流, 写数据

PrintWriter writer = resp.getWriter();
writer.write("aaa");

示例代码:

@WebServlet("/reps3")
public class ResponseDemo3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 获取字符输出流PrintWriter writer = response.getWriter();// 告诉浏览器, 响应的数据是html的文件response.setHeader("content-type", "text/html");// 写入html数据writer.write("

abc

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

细节注意

该流不需要关闭,随着响应结束,response对象销毁,由服务器关闭

中文数据乱码:原因通过Response获取的字符输出流默认编码:ISO-8859-1, 解决中文编码问题, 我们只需修改字符输出流的编码为: utf-8

@WebServlet("/reps3")
public class ResponseDemo3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 告诉浏览器, 响应的数据是html的文件, 且设置输出流为utf-8编码response.setHeader("content-type", "text/html;charset=utf-8");// 获取字符输出流PrintWriter writer = response.getWriter();// 写入html数据writer.write("

你好啊

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

Response 响应字节数据

通过Response对象获取字节输出流, 写数据

ServletOutputStream outputStream = resp.getOutputStream();
outputStream.write(字节数据);

示例代码: 读取一张图片到网页

@WebServlet("/reps4")
public class ResponseDemo4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 读取图片文件的字节输入流FileInputStream fis = new FileInputStream("/Users/chenyq/Documents/a.png");// 获取字节输出流ServletOutputStream os = response.getOutputStream();// 完成流的copybyte[] buffer = new byte[1024];int len = 0;while ((len = fis.read(buffer)) != -1) {os.write(buffer, 0, len);}fis.close();}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

以前为了联系, 我们是自己编写的流的copy, 现在我们可以使用IOUtils工具类完成copy, 使用方式如下:

导入坐标


commons-iocommons-io2.6

使用IOUtils的copy方法, 该方法接收一个输入流和一个输出流IOUtils.copy(输入流,输出流);

@WebServlet("/reps4")
public class ResponseDemo4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 读取图片文件的字节输入流FileInputStream fis = new FileInputStream("/Users/chenyq/Documents/a.png");// 获取字节输出流ServletOutputStream os = response.getOutputStream();// IOUtils工具类完成流的复制IOUtils.copy(fis, os);fis.close();}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

相关内容

热门资讯

真正的“冬日顶流”!维 C 含... 四川的冬天,餐桌上必不可少的一样绿色蔬菜便是——豌豆尖。作为餐桌上的“顶流”,四川人到底有多爱呢? ...
【二十四节气•韩城味道】一口暖... 开栏语: 春风化雨,夏露凝珠,秋叶纷飞,冬雪皑皑。立春、雨水、惊蛰、春分……从立春之始,到大寒之终,...
原创 腊... 腊月一到,年味儿就渐渐浓起来了。农历腊月初一,在咱们老传统里是个特别的日子——叫“咬灾节”。听着这名...
北京冬天不知去哪玩?来这能逛花... 近日,记者来到顺义区赵全营镇北郎中年宵花展这里不仅能选购年宵花、DIY盆栽还可采摘新鲜蓝莓吸引众多市...
漫步云霄丨云霄的营地慢生活 -广告- 向东渠红色景区营地 向东渠露营地位于向东渠畔,这里风景如画,能让人远离城市喧嚣,享受大自...