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/616370/

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

(0)

大家都在看

  • 关于ThreadLocal最直白的解释

    ThreadLocal 底层原理如下:实线是强引用,虚线是弱引用Thread 持有 ThreadLocal 对象的引用,ThreadLocalMap 是 Thread 的成员变量,…

    Java 2023年6月9日
    081
  • Abot 爬虫分析-整体结构

    1. 引言 在Github 上搜索下Web Crawler 有上千个开源的项目,但是C#的仅仅只有168 个,相比于Java 或者Python 确实少的可怜。如果按照Stars 排…

    Java 2023年6月5日
    083
  • 待学习

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月6日
    084
  • SpringSecurity

    SpringSecurity 11.1 SpringSecurity简介 Spring 是一个非常流行和成功的 Java 应用开发框架。Spring Security 基于 Spr…

    Java 2023年6月5日
    067
  • Nginx 负载均衡

    Nginx简单实现网站的负载均衡 地址:http://www.cnblogs.com/alvin_xp/p/4161162.html Original: https://www.c…

    Java 2023年5月30日
    067
  • xampp相关配置文件所在路径

    环境: Xampp3.2.4一般来讲,可以在xampp的控制面板打开先关的配置文件,但是出现有些问题的时候,还是需要到别的路径下找到相关配置文件修改才行。 todo:更改xampp…

    Java 2023年6月7日
    087
  • java AWT弹球游戏

    java AWT弹球游戏 1 package io.guanghe; 2 3 import javax.swing.*; 4 import java.awt.*; 5 import…

    Java 2023年5月29日
    074
  • java excel多sheet页导出

    (1)百度网盘提取地址: 链接:https://pan.baidu.com/s/1J6evfiVALhNX_xLzT7dLtg提取码:8888 (2)下载后,解压,idea打开,配…

    Java 2023年6月5日
    074
  • 【Java面试手册-基础篇】Java中的main()方法能否被重载?

    答案是肯定的,我们可以重载main()方法,一个Java类可以有任意数量的main()方法,比如下面的 MainDemo 类,就有多个 main() 方法。 package com…

    Java 2023年6月8日
    096
  • Spring官网下载dist.zip的几种方法

    Spring官网改版后,很多项目的完整zip包下载链接已经隐掉了,虽然Spring旨在引导大家用更”高大上”的maven方式来管理所依赖的jar包,但是完全…

    Java 2023年5月30日
    072
  • Java对象序列化全面总结

    Java允许我们在内存中创建可复用的Java对象,但一般情况下,这些对象的生命周期不会比JVM的生命周期更长。但在现实应用中,可能要求在JVM停止运行之后能够保存(持久化)指定的对…

    Java 2023年5月29日
    069
  • 学习进度第二次报告

    学习课程以及部分学习知识总结: 我的目标计划: 通过学习CSS基础知识,准备对我之前写的一些网页进行精细修饰。然后再去B站以及CSDN等技术网站上 多找找关于网页修饰这一类的课程和…

    Java 2023年6月6日
    070
  • Android 11 使用 BroadcastReceiver 监听短消息

    使用装有MIUI系统的小米手机,静态注册的广播接收器监听短消息。 在 AndroidManifest.xml中声明权限 <uses-permission android:na…

    Java 2023年6月7日
    076
  • Springboot循环依赖实践纪实

    测试的Springboot版本: 2.6.4,禁止了循环依赖,但是可以通过 application.yml开启(哈哈) @Lazy注解解决循环依赖 情况一:只有简单属性关系的循环依…

    Java 2023年6月7日
    087
  • 戏说领域驱动设计(十五)——内核元素

    前面细讲了基于CQS的4层架构,其中的领域模型层也就是六边型架构中的内核在整个开发流程中工作占比最大,也是需要工程师最需要关注地方。那么话说回来了,里面到底包含了什么东西需要投入如…

    Java 2023年6月7日
    091
  • 设计模式之备忘录模式

    备忘录模式又叫做快照模式,属于行为型模式。是指使用一个备忘录对象来存储另一个对象内部状态的快照。备忘录模式的用以是在不破坏封装的条件下,将一个对象的状态捕捉住,并外部化,存储起来,…

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