文章目录

  • Response 继承体系
  • Response 设置响应数据
    • 设置响应行数据
    • 设置响应头数据
    • 设置响应体数据
    • Response 重定向
  • Response 响应字符数据
  • Response 响应字节数据

Response 继承体系

前面说到,我们使用 Request 对象来获取请求数据,使用 Response 对象来设置响应数据。如图:

其实 Response 的继承体系和 Request 有很多相似的地方,如图:

Java 语言提供了响应对象根接口和封装了 HTTP 协议的响应对象接口,两者都是接口,并且两者属于继承关系。

Servlet 类中的 services() 方法,doGet() 方法,doPost() 等方法,都是由 Web 服务器 TomCat 来调用的,所以 TomCat 提供了方法参数接口的具体实现类,并完成了对象的创建,这个实现类就是 ResponseFacade 类。

学习 Response 对象,主要从以下几个方面入手:

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

Response 设置响应数据

HTTP 响应数据总共分为三部分内容,分别是响应行,响应头和响应体。通过对应的 API 就可以简单的实现设置响应数据的功能。

设置响应行数据

对于响应行的数据的设置,主要是设置响应状态码,如下:

void setStatus(int sc);

设置响应头数据

响应头的数据格式为 key : value 。Response 提供了方法设置响应头的键值对数据,如下:

void setHeader(String name,String value);

设置响应体数据

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

获取字符输出流:

PrintWriter getWriter();

获取字节输出流:

ServletOutputStream getOutputStream();

Response 重定向

Response 重定向也是一种资源的跳转方式,与请求转发不同的是,重定向时浏览器发送了两次请求,所以浏览器地址栏的路径会发生变化,并且我们可以重定向到任何位置的资源,不管是服务器内部的还是外部的。

浏览器发送请求给服务器,服务器中对应的资源 a 接收到了请求,如果资源 a 无法处理该请求,就会响应给浏览器一个 302 状态码和一个访问资源 b 的路径 location 。

浏览器接收到状态码 302 以后就会重新发送请求到 location 对应的访问地址其访问资源 b。资源 b 接收到了请求以后进行处理步最终给浏览器返回响应结果,这一个过程就叫做重定向。

重定向的实现方式:

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

下面练习 Response 重定向。

  1. 创建一个 ResponseDemo1 类,接收 /res1的请求,在 doGet() 方法中打印 resp1…
  2. 创建一个 ResponseDemo2 类,接收 /res2 的请求,在 doGet() 方法中打印 resp2…
  3. 在 ResponseDemo1 的方法中实现重定向
  4. 测试

第一步:创建 ResponseDemo1 类

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

第二步:创建 ResponseDemo2 类

@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);}
}

第三步:在 ResponseDemo1 类方法中实现重定向

//重定向
//1.设置响应状态码302
response.setStatus(302);
//2.设置响应头 location
response.setHeader("location","/servlet-project/resp2");

第四步:测试

启动服务器,访问 http://location:8080/servlet-project/resp1,此时控制台输出:

这里 /resp1 和 /resp2 都被访问到了,表示重定向成功了。其实 Response 还提供了一种更加简便的方式来实现重定向,如下:

resposne.sendRedirect("/servlet-project/resp2")

Response 响应字符数据

服务器接收到浏览器发送的请求之后经过一系列的逻辑处理后就要发送响应给浏览器,而把数据写回浏览器是十分重要的一部分,我们一般使用输出流的方式将响应数据写回浏览器。

Response 对字符数据和字节数据的响应方式是不同的,要想将字符数据写到浏览器,需要完成下面两个步骤:

  1. 获取字符输出流
  2. 通过字符输出流写数据

下面练习将一个简单的字符串写到浏览器。

@WebServlet("/demo")
public class ServletDemo extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();writer.write("helloWorld");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

下面练习将一个 html 字符串返回给浏览器,并且被浏览器解析。

PrintWriter writer = response.getWriter();
//content-type 告诉浏览器返回的数据类型是HTML类型数据,这样浏览器才会解析HTML标签
response.setHeader("content-type","text/html");
writer.write("<h1>helloWorld</h1>");

注意:返回的中文字符数据时要把字符编码方式设置为 utf-8。在一次请求结束后,response 对象会被销毁,所以这里的流对象不需要手动释放。

Response 响应字节数据

要想将字节数据写到浏览器,只需要下面两个步骤:

  1. 获取字节输出流对象
  2. 通过字节输出流写数据

下面练习将一个图片文件写回到浏览器。

@WebServlet("/demo")
public class ResponseDemo 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. 完成流的复制byte[] 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);}
}

Java 的 IO 流操作是开发中比较常用的技术,但是如果每次都使用原生的 IO 流来操作会显得比较繁琐。我们可以使用 commons-io 来简化操作,commons-io 是一个工具包,用来帮助 IO 功能的开发,感兴趣的朋友可以去了解一下。

使用前我们要先往 pom.xml 配置文件中添加对应的依赖坐标。

<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version>
</dependency>

此时,将图片返回给浏览器的代码可以优化为:

@WebServlet("/demo")
public class ServletDemo extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {FileInputStream fis  = new FileInputStream("C:\\Users\\24091\\Desktop\\46cfac1918ae3f7831e746684c0bd42.jpg");ServletOutputStream os = response.getOutputStream();IOUtils.copy(fis,os);fis.close();}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

你问我青春还剩几年?我的回答是,趁现在,正当时。身边朋友都在问我怎样学好一门编程语言,怎样学好Java?怎样通过 Java 找到一份满意的工作?推荐学习此专栏:Java编程基础教程系列(零基础小白搬砖逆袭)

下期见。

【Servlet篇】Response对象详细解读相关推荐

  1. Servlet中response对象Commit状态的分析

    response是服务端对客户端请求的一个响应,其中封装了响应头.状态码.内容(也就是最终要在浏览器上显示的HTML代码或者其他数据格式)等. 服务端在把response提交到客户端之前,会使用一个缓 ...

  2. 【Servlet】response对象给用户返回数据

    response对象学习 * response对象学习:* 作用:* 用来响应数据到浏览器的一个对象* 使用:* 设置响应头* setHeader(String name,String value); ...

  3. PHP中的类与对象详细解读

    1. 类与对象 类是面向对象程序设计的基本概念,是一类东西的结构描述 , 是一种抽象的概念 . 对象是一类东西的一个具体的实例 , 是具体事物 . 对象通过new关键字进行实例化: 比如汽车可以抽象为 ...

  4. 博途PLC 1200/1500PLC 工艺对象PID PID_Compact详细解读

    这篇博文我们详细解读博途PLC自带的PID功能块PID_Compact,大部分工业闭环调节过程,我们采用系统自带的PID功能块基本都能胜任,一些特殊的被控对象,我们可能需要采用一些先进PID算法,比如 ...

  5. CSS 详细解读定位属性 position 以及参数

    Css 详细解读定位属性 position 以及参数 position 定位属性,是CSS中非常重要的属性.除了文档流布局,就是定位布局了.本来我对这个问题没有放在心上,毕竟写了这么多年的css,对p ...

  6. 重温Servlet学习笔记--response对象

    在用户浏览网页时,服务器对于客户端浏览器做出的响应被封装成一个HttpServletResponse对象,要对浏览器操作只需要操作这个response对象即可.response的功能分类及介绍: 响应 ...

  7. response对象在servlet中的常用方法讲解

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象. request和response对象即然代表请求和响应,那我们 ...

  8. 等保测评2.0超详细解读,收藏这一篇就够了

    一.等级保护介绍 1.1什么是等级保护 网络安全等级保护是指对国家重要信息.法人和其他组织及公民的专有信息以及信息和存储.传输.处理这些信息的信息系统分等级实行安全保护,对信息系统中使用的信息安全产品 ...

  9. Servlet中的response对象

    目录 目录 前言 简介 向客户端输出数据 response对象的getOutputStream方法 response对象的getWriter方法 实现文件下载 生成图片验证码 实现浏览器定时刷新 控制 ...

最新文章

  1. 防止标题或者特定内容长度溢出wordcut
  2. java 二分查找_计算机入门必备算法——二分查找法
  3. reids 源码 zipmap.c 压缩map的实现
  4. 【必懂C++】第一个程序当然是HelloWorld呀 01
  5. bootstrap-multiselect加载本地数据
  6. 记一次MBR锁机病毒分析
  7. SDK Manager配置
  8. oracle 10g oci.dll 下载,Oracle 11g oci.dll下载
  9. 常用的非线性激励函数
  10. 运筹优化(十三)--大规模优化方法
  11. 美团外卖订单小票打印规范
  12. mcake蛋糕预订图片
  13. 完全背包(背包问题)
  14. 【盲解调】基于频率和滤波器参数估计的FH-GFSK调制信号盲解调算法matlab仿真
  15. XPwn黑客破解秀,16位网红见证黑掉小米
  16. JMS JMS背景 概述 JMS术语
  17. 超越FPN和NAS-FPN! FPG:《Feature Pyramid Grids》特征金字塔网格强势登场!
  18. excel转制定格式
  19. A+CLUB活动预告 | 2023年5月
  20. 录音语音识别系统功能图

热门文章

  1. 2021年焊工(初级)报名考试及焊工(初级)免费试题
  2. 经典常用SQL语句大全(绝对的经典)
  3. P6 Vue双向绑定 v-model
  4. 【学神】1-15 linux启动及常见故障的排除
  5. 【译】css动画里的steps()用法详解
  6. linux sed替换文件,linux的sed命令替换文件
  7. 保护小程序,防止反编译:打造不怕反编译的小程序
  8. Dr.com 新版 Ver 5.2.0 本地 密码 读取 查看 破解
  9. Python科研数据分析专题之正态性检验
  10. 支持向量机专题——线性可分支持向量机