首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Servlet 4.0 入门(2)

Servlet 4.0 入门(2)

将服务器推送与 JSF 结合使用JavaServer Faces                已经将每个页面的资源需求标识为页面呈现生命周期的一部分,所以它非常适合用于服务器推送。就开发人员而言,比较好的一方面是,您不必为了激活此功能而煞费苦心。您可以免费升级到                JSF 2.3。
清单 4 展示了JSF 和服务器推送的集成情况。
清单 4. 在 JSF                页面中使用服务器推送
1
2
3
4
5
6
7
8
9
10
11
<h:head>
   <hutputStylesheet library="css" name="logo.css"/>
   <hutputScript library="js" name="logo.js"/>
   <title>JSF 2.3 ServerPush Example</title>
</h:head>
<h:body>
   <h:form>
       <h:graphicImage library="images" name="logo.jpg"/>
   </h:form>
</h:body>
</html>




清单 4 中的 JSF 页面需要以下三种资源:
  • 名为 logo.css 的 CSS 文件。
  • 名为 logo.js 的 JavaScript 文件。
  • 名为 logo.jpg 的图像。
当 JSF 引擎正在处理和呈现页面时,这些资源将被逐个推送到客户端。这发生在 JSF 的呈现响应阶段。然后,会为每个资源调用                ExternalContextImpl.encodeResourceURL() 方法,并向其传递资源的新 URL。从与                ExternalContext 相关联的 HttpServletRequest 实例获取新的                PushBuilder 对象。如果支持服务器推送,那么会在向客户端呈现页面之前将资源推送到客户端。


JSP 中的服务器推送
由于 JavaServer Pages                    是一项传统技术,服务器推送尚未集成到 JavaServer Pages 中。但您可以在 JSP 中利用服务器推送,通过使用 servlet                    过滤器来缓存和推送资源。请查看 Jetty 9 的 PushCacheFilter,获取工作方式示例。

HttpServletMapping 接口Servlet 4.0 的全新   API 使服务器能够对 URL(可调用 servlet)执行运行时检查。例如,对                file.ext, /path 和 /path/file.ext 的请求将通过 URL 模式                /path/* 和 *.ext 激活 servlet。
HttpServletMapping 接口支持运行时发现 servlet 的映射 URL。您可以在                HttpServletRequest 实例上调用                getHttpServletMapping(),获取接口的实例。您可以使用以下方法获取有关 servlet 映射 URL                的信息:
  • getMatchValue() 返回部分 URI 路径,该路径会导致请求匹配。
  • getPattern() 返回 URL 模式的 String 表示形式。
  • getServletName() 返回 servlet 名称的 String                    表示形式。
  • getMappingMatch() 返回匹配的类型,表示为 MappingMatch                    枚举值,该枚举值将为以下值之一:CONTEXT_ROOT、DEFAULT、EXACT、EXTENSION                    或 PATH。
清单 5 展示了四种 API 方法的实际应用。
清单 5. Servlet 4.0 中的运行时 servlet                    映射发现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@WebServlet({"/path/*", "*.ext"})
public class ServletMapping extends HttpServlet {

    protected void doGet(HttpServletRequest request,
                         HttpServletResponse response)
                         throws IOException {

        HttpServletMapping mapping = request.getHttpServletMapping();
        String mapping = mapping.getMappingMatch().name();
        String value = mapping.getMatchValue();
        String pattern = mapping.getPattern();
        String servletName = mapping.getServletName();
   }

}






Servlet 4.0 的细微变化除了服务器推送和全新 HttpServletMapping 接口,Servlet 4.0                还包括少量值得注意的新增功能和变更。
  • Trailer                    响应标头支持发送方在分块消息的末尾包含额外字段。这用于提供在发送消息主体时可能会动态生成的元数据,例如,消息完整性检查、数字签名或后期处理状态。
  • Servlet 4.0 添加了 GenericFilter 和 HttpFilter                    抽象类,这些抽象类通过最低限度地实现生命周期方法 init() 和                    destroy(),简化了编写过滤器。
  • Servlet 4.0 还集成了全新的                    HTTP Trailer,支持发送方在分块消息的末尾包含额外的字段。
  • ServletContext 接口采用了一些新方法:
    • addJspFile() 可将带有给定 JSP 文件的 servlet 添加到 servlet                            上下文中。
    • getSessionTimeout() 和                            setSessionTimeout() 可提供对会话超时的访问权限。
    • getRequestCharacterEncoding() 和                            setRequestCharacterEncoding() 可为当前的 servlet                            上下文提供访问权限,并改变默认的请求字符编码。
  • HttpServletRequest 接口上的                    isRequestedSessionIdFromUrl() 方法已被弃用。
  • 由于升级到 Java SE 8,默认方法已被添加到侦听器接口中。
结束语Servlet 4.0 已经发布,主要用于整合全新 HTTP/2 协议及其众多性能增强功能。PushBuilder                接口对推送到客户端的资源提供细粒度控制,使交叉实现生动有趣。例如,Jetty 9 在 PushCacheFilter                Web 过滤器中使用 PushBuilder API                实现了服务器推送功能。此过滤器在首次请求时缓存了资源。即使仍在服务器端处理请求,它也能够将后续请求推送到客户端。
虽然 JSF 2.3 内置了服务器推送功能,但 JavaServer Pages 并没有此功能。JSF                与服务器推送的集成十分有用,开发人员因而可减少对性能问题的关注,而更加着力于设计动态网页。对于想要在 JSP 中实现相似功能的开发人员,就需要使用                Web 过滤器这样的定制解决方案,例如 Jetty 9 中的 PushCacheFilter Web 过滤器。
返回列表