Servlet4.0 Response

Servlet4.0 Response对象

Response对象封装Server返回Client的所有信息。在HTTP协议中,Server传达给Client信息转换到HTTP Header或者HTTP BODY中。

Serverlet Container可以但不强制缓冲发送给客户端的内容。默认得,Servlet Container会开放接口设置缓冲区。如ServletResponse对象的方法可以设置缓冲区:

  • getBufferSize
  • setBufferSize
  • isCommitted
  • reset
  • resetBuffer
  • flushBuffer

当Servlet Container使用ServletOutputStream或者Write时,可以使用这些方法配置缓冲区。

getBufferSize返回缓冲区大小,若没有缓冲区,则返回0。

setBufferSize servlet可以使用该方法设置缓冲区大小。

申请的大小可以不是servlet请求的大小,但是至少要是请求的大小。这样,容器才能重使用该缓冲区,也能够提供足够的缓冲区。该方法需要在Servlet Container使用ServletOutputStream或者是Writer输出响应之前调用。

isCommitted方法表示内容是否已经响应给客户端。

flushBuffer方法强制将缓冲区数据输出至客户端。

reset方法强制清空缓冲区的数据若内容未提交至客户端。

resetBuffer方法强制清空缓冲区的数据但不包括请求头和响应码若内容未提交至客户端。

若内容已经输出至客户端,调用reset方法或resetBuffer方法都会抛出异常。但是不会改变缓冲区内容。

若缓冲区已经满需要立即输出响应内容给客户端。

Servlet可以通过ServletResponse接口的方法设置HTTP响应头。方法如下:

  • setHeader
  • addHeader

setHeader使用指定的名称替换已经存在的值,若header的值是集合,则集合的值被清空,使用新值替换。

addHeader添加指定名称的值到集合,该名称未存在,则会创建新集合。

若header的值是int类型或Date类型,则ServletResponse接口提供下述方法:

  • setIntHeader
  • setDateHeader
  • addIntHeader
  • setIntHeader

HTTP响应头需要比响应体输出至客户端,若响应体已经输出再输出响应头,Servlet Container会忽略响应头。

对于Servlet生成的内容Servlet 编程者有义务设置Content-Type。HTTP/1.1不要求必须设置Content-Type请求头。

推荐Servlet Container 使用X-Powerd-By请求头发布自身的实现。

这个请求头的值起码是一个以上。如”Servlet/4.0″。

HTTP Trailer是发送在响应体之后的响应头集合。适用于chunked编码发送的场景或者是其他额外的协议。

如果HTTP Trailer 请求头已经就绪则调用isTrailerFieldsReady()方法会返回true。

servlet可以通过HttpServletRequest接口的getTrailerFields()方法读取 Trailer 请求头。

servlet可以输出HTTP Trailer头通过提供Supplier给HttpServletResponse接口提供的setTrailerFields()方法。也可以通过提供的Supplier使用HttpServletResponse接口的getTrailerFields()方法获取HTTP Trailer请求头。

非阻塞IO只能在异步处理请求中使用。否则ServletInputStream.setReadListener和ServletOutputStream.setWriteListener调用时,需要抛出IllegalStateException异常。

为了支持在Web 容器支持非阻塞写,引入如下改变:

WriteListener提供下述回调方法:

  • void onWritePossible() 当WriteListener注册到ServletOutputStream

后,当ServletOutputStream能写时会第一次调用WriteListener.onWritePossible()方法。

只有当ServletOutputStream.isReady()方法返回true才会调用WriteListener.onWritePossible()方法。

  • onError(Throwable t)处理响应失败时会调用该方法。

伴随着WriteListener还有ServletOutputStream的其他方法帮助WebApplication判断是否准备好写内容至客户端。

  • boolean isReady()如果写ServletOutputStream成功则会返回true。如果这个方法返回true,则ServletOutputStream写操作可以继续完成。若没有后续内容需要写,则该方法返回false。
  • void setWriteListener(WriteListener listener) 关联WriteListener和ServletOutputStream。当可以写入数据时容器会调用WriteListener的方法。

注册的WriteListener会开始非阻塞IO,此时禁止转为阻塞IO。Servlet Container需要保证WriteListener的线程安全

每个Response对象都只能在service或者doFilter方法中生效,异步处理请求除外。

异步处理请求情况下,Response对象一直有效直到Servlet Container 调用AsyncContext.complete方法后。Servlet Container会回收Response对象为了提供性能,

研发需要明白,在这些作用域外引用Response对象都会引发未知错误。

Original: https://www.cnblogs.com/code-for-me/p/16745077.html
Author: 夕琴
Title: Servlet4.0 Response

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/714221/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 我的笔记本电脑瞬间扩大一个T的容量!

    前言 不知道有多少人在家里搭建中央存储设备的,也就是NAS。这个东西在我日常生活中,存储了大量的个人资料,家人们的照片,技术的资料,还有各种高清影视剧。搭配公网的IP,可以真正做到…

    技术杂谈 2023年7月11日
    0214
  • 我是如何用IDEA调试BUG的?

    最近小明的bug有点多,忙的连王者荣耀都顾不上玩了,导致现在不得不抽点时间研究一下作为当前大多Java程序员开发工具的IDEA DEBUG功能,以提高效率。 一、条件断点 场景:我…

    技术杂谈 2023年7月25日
    087
  • Python 可迭代对象和迭代器

    可迭代对象:是一个私有的方法比较多,操作灵活(比如列表,字典的增删改查,字符串的常用操作方法等),比较直观,存储数据相对少(几百万个对象,8G内存是可以承受的)的一个数据集。 当你…

    技术杂谈 2023年6月21日
    061
  • HTML:1.初识web

    认识WEB 「网页」主要是由 文字、 图像和 超&#x94FE…

    技术杂谈 2023年7月11日
    061
  • 微信公众平台开发(121) 微信二维码海报

    关键字:微信公众平台 二维码 海报作者:方倍工作室原文: http://www.cnblogs.com/txw1958/p/weixin-poster.html 本文介绍微信公众平…

    技术杂谈 2023年5月31日
    0144
  • requests上传文件进度条

    python;gutter:true; import os import requests</p> <p>class ChunkIO:</p> …

    技术杂谈 2023年6月21日
    074
  • 编程四大件

    现在这个互联网时代,很多人都想往这方面发展,然后就开始疯狂学习什么 C/C++、python、Java等语言,学了一大堆语言,可到了实际项目还是什么都不会。本人也是经历过后才发现,…

    技术杂谈 2023年7月25日
    071
  • ENDIAN的由来及BIG-EDIAN 和LITTLE-ENDIAN(转)

    在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送…

    技术杂谈 2023年7月10日
    056
  • HDFS机架感知

    Hadoop版本:2.9.2 什么是机架感知 通常大型 Hadoop 集群是以机架的形式来组织的,同一个机架上的不同节点间的网络状况比不同机架之间的更为理想,NameNode 设法…

    技术杂谈 2023年7月24日
    069
  • 简单易懂讲注解

    注解是什么 简单的说,注解就是一种将元数据信息从 xml 剥离开来,然后保存在 java 源代码中,这将使得代码更加清晰易懂,无需维护两个地方: java 源代码以及 xml 配置…

    技术杂谈 2023年7月25日
    081
  • GCC编译C:C++的四个过程

    从源码到可执行程序,经历四个过程: 预处理、编译、汇编和链接,前三步由使用编译器来完成、链接由链接来完成。 编译器将编译工作主要分为预处理,编译和汇编三部 连接器的工作是把各个独立…

    技术杂谈 2023年7月11日
    057
  • 【新特性速递】表格行分组(EnableRowGroup)

    FineUIPro/Mvc/Core的下个版本(v7.0.0),我们会为表格新增行分组功能,这也是很多用户期待的功能。 为了支持表格行分组功能,我们为表格添加了一些属性: 新增En…

    技术杂谈 2023年6月1日
    082
  • 基于zookeeper集群的云平台-配置中心的功能设计

    最近准备找工作面试,就研究了下基于zookeeper集群的配置中心。 下面是自己设想的关于开源的基于zookeeper集群的云平台-配置中心的功能设计。大家觉得哪里有问题,请提出宝…

    技术杂谈 2023年7月11日
    077
  • hdu 4324 Triangle LOVE 拓扑排序

    #include #include #include #include using namespace std; int mp[2000 + 5][2000 + 5], in[20…

    技术杂谈 2023年6月1日
    090
  • aardio 调用 python将图片放上界面

    在 aardio 中显示图片 在 aardio 中显示图片 显示图片的控件 使用 IO 库 在 aardio 中使用 plus 显示图片的控件 在 aardio 中我们显示图片也有…

    技术杂谈 2023年7月10日
    0100
  • Microsoft帐户无法登录怎么办,换个dns试试

    最近系统设置老提示Microsoft账户重新登录,但始终是无法登录上去,一直转圈并提示请稍等…,最后还提示发生了错误,”请重试,或选择”取消&#…

    技术杂谈 2023年5月30日
    0188
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球