|
2017年JavaEE8正式发布了,这是自 2013 年 6 月以来 Java 企业平台的首次发布,是分成两部分的发布中的前半部分(后一部分是 Java EE 9)。Oracle 对 Java EE 进行了战略性重新定位,重点关注一些支持云计算、微服务和反应式编程的技术。反应式编程现在正融入到许多 Java EE API 的架构中,而 JSON 交换格式为核心平台提供了支撑。Java EE 8 中提供的主要特性重点包括 API 更新和引入、对 HTTP/2 的新支持、反应式编程,以及 JSON等。今天我们主要介绍一下JavaEE8中Servlet4.0 API所提供的一些新的特性以便大家有所了解。
Servlet从3.1到4.0是对Servlet的一次比较大的改动,而改动的关键之处在于对HTTP2的支持。HTTP2是继上世纪末HTTP1.1协议规范化以来首个HTTP协议新版本,相对于HTTP1.1,HTTP2将带来许多的增强。这些新特性如下:
1.请求/响应复用(Request/Response multiplexing)
2.流的优先级(Stream Prioritization)
3.服务器推送(Server Push)
4.HTTP1.1升级(Upgrade from HTTP 1.1)
(关于HTTP1.1和HTTP2.0协议的区别以及新特性的介绍,具体请参考附带资料。)
Java EE 8 中对 Servlet 进行了重大修订,主要是为了适应 HTTP2.0 的性能增强特性。服务器推送目前是这一领域的首要特,
另外新增了HttpServletMapping 接口,提供了对HTTP Trailer 的支持,还有新的 GenericFilter 和 HttpFilter 类简化了过滤器的编写,实现了对 Java SE 8 的一般性改进。下面我们一起来看一下。
1,服务器推送
服务器推送通过将客户端资源推送到浏览器的缓存中来预先满足对这些资源的需求. 客户端发送请求并收到服务器响应时,所需的资源已在缓存中。
在 Servlet 4.0 中,服务器推送是通过一个 PushBuilder 实例公开的。示例1展示了一个从 HttpServletResponse 实例获取的 PushBuilder 实例,该实例被传递到一个请求处理方法。
示例1:
在示例1 中,my.css 的路径是通过path() 方法在 PushBuilder 实例上设置的,并通过调用 push() 推送到客户端。
2, HttpServletMapping 接口
Servlet 4.0 提供了一个新的 API,用它来实现 URL 映射的运行时发现。HttpServletMapping 接口的用途是让确定导致 servlet 激活的映射变得更容易。
在该 API 内,会从一个HttpServletRequest 实例获得 servlet 映射,该实例包含 4 个方法:
getMappingMatch() 返回匹配的类型。
getPattern() 返回激活 servlet 请求的 URL 模式。
getMatchValue() 返回匹配的 String
getServletName() 返回通过该请求激活的 servlet 类的完全限定名称。
HttpServletMapping mapping = request.getHttpServletMapping();
String name = mapping.getMappingMatch().name();
String value = mapping.getMatchValue();
String pattern = mapping.getPattern();
String servletName = mapping.getServletName();
HttpServletMapping mapping = request.getHttpServletMapping();
String name = mapping.getMappingMatch().name();
String value = mapping.getMatchValue();
String pattern = mapping.getPattern();
String servletName = mapping.getServletName();
HttpServletMapping 接口上的所有 4 个方法
Servlet4.0发布的新特性介绍
请求/ServletMappingTest路径时
运行结果:
name:EXACT
value:ServletMappingTest
pattern:/ServletMappingTest
servletName:servletMap
运行在项目:/Servlet4Demo
请求/servlet/dd 路径时
运行结果:
name:PATH
value:dd
pattern:/servlet/*
servletName:servletMap
运行在项目:/Servlet4Demo
示例2的运行结果如下:
请求/ServletMappingTest路径时
运行结果:
name:EXACT
value:ServletMappingTest
pattern:/ServletMappingTest
servletName:servletMap
运行在项目:/Servlet4Demo
请求/servlet/dd 路径时
运行结果:
name:PATH
value:dd
pattern:/servlet/*
servletName:servletMap
运行在项目:/Servlet4Demo
Servlet4.0发布的新特性介绍
3, HTTP Trailer 的支持
首先要了解http协议中的trailer这个东东,这个header有关,根据http1.1协议,当response的Transfer-Encoding为chunked时,允许在消息体后面附加其它的Header, 这个附加的Header就叫Trailers。我们知道一般的http请求回应时,先是发送Headers(消息头), 再是发送body(消息体)。 但是有些情况下,消息头需要与消息体有关联,比如需要在header里附上消息体的Hash签名, 但是消息体并不总是预先就存在的,在动态产生消息体的情况下,如果在消息体产生完后再签好名,发送Headers和Body, 性能肯定会受影响。比较好的做法是,Server获得请求后,开始发送可以发送的Headers, 同时设置Transfer-Encoding: chunked, Trailer: XXXX。 然后对动态产生的消息体一个chunk,一个chunk的发完以后,再附加上Hash头.
在新版的Servlet4.0 API中提供了对trailer处理的支持。
程序猿的技术大观园:www.javathinker.net
|
|