当前位置: 首页 > news >正文

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 {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("resp1....");//重定向//1.设置响应状态码 302response.setStatus(302);//2. 设置响应头 Locationresponse.setHeader("Location","/request-demo/resp2");// 重定向,简化写法// resposne.sendRedirect("/request-demo/resp2");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}
@WebServlet("/resp2")
public class ResponseDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("resp2....");}@Overrideprotected 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 {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 读取文件FileInputStream fis = new FileInputStream("d://a.jpg");//2. 获取response字节输出流ServletOutputStream os = response.getOutputStream();//3. 完成流的copybyte[] buff = new byte[1024];int len = 0;while ((len = fis.read(buff))!= -1){os.write(buff,0,len);}fis.close();}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

相关文章:

  • 如何更好的引导大语言模型进行编程的高效开发流程?
  • Kali Linux 2024.1
  • Java多线程注意事项(初级程序员必看)
  • 蓝桥杯练习题——dp
  • Python图像处理【21】基于卷积神经网络增强微光图像
  • SpringBoot接口防抖(防重复提交)的一些实现方案
  • Apache Flink连载(三十九):Kuberneters 部署案例
  • TikTok企业认证教程:提升账号可信度的必备步骤
  • 项目中如何优雅的使用枚举类型
  • Gif动图体积太大怎么办?1分钟极速压缩gif体积
  • 【Python刷题】回文链表
  • 2024 Idea激活,分享几个IntelliJ IDEA激活的方案
  • Linux 学习笔记(12)
  • 深入了解 Android 中的 FrameLayout 布局
  • 如何应对IT服务交付中的问题?
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • co.js - 让异步代码同步化
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Django 博客开发教程 16 - 统计文章阅读量
  • Django 博客开发教程 8 - 博客文章详情页
  • es的写入过程
  • Flex布局到底解决了什么问题
  • JavaScript服务器推送技术之 WebSocket
  • JavaScript函数式编程(一)
  • Java方法详解
  • JSDuck 与 AngularJS 融合技巧
  • sessionStorage和localStorage
  • 彻底搞懂浏览器Event-loop
  • 仿天猫超市收藏抛物线动画工具库
  • 基于web的全景—— Pannellum小试
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 每天10道Java面试题,跟我走,offer有!
  • Hibernate主键生成策略及选择
  • 阿里云ACE认证学习知识点梳理
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 我们雇佣了一只大猴子...
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (3)llvm ir转换过程
  • (Matlab)使用竞争神经网络实现数据聚类
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转载)利用webkit抓取动态网页和链接
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET6 命令行启动及发布单个Exe文件
  • .net和php怎么连接,php和apache之间如何连接
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .NET业务框架的构建
  • @取消转义