变更历史
本文档是由Java社区进程SM (JCP)开发的Java Servlet 3.0 Servlet规范最终版本。
A.1 自Servlet3.0以后的变更
1. 章节2.3.3.3,“异步处理”,和AsyncContext的javadoc。
a. 阐明了AsyncListener.onStartAsync的行为。
b. 修复示例代码中的错误和注释。
c. 阐明了异步请求完成或分派之后的AsyncContext.getRequest和AsyncContext.getResponse的行为。
2. 添加章节2.3.3.5,“升级处理”,和新的类ProtocolHandler和WebConnection。
3. 章节3.2,“文件上传”,阐明了什么时候处理multi-part/form-data。
4. 添加章节3.7的异步IO、“非阻塞IO”、和章节5.7,“响应对象的生命周期”。
5. 章节5.1,“缓冲”,和ServletResponse的javadoc。阐明了ServletResponse.reset的行为。
6. 章节6.2.1,“过滤器生命周期”(4)。需要过滤器和Servlet在同一个线程中处理。
7. 章节9.4,“Forward方法”,阐明了当请求进入异步模式时response的行为。
8. 章节15.3.1,“EJB™调用中的安全身份传播”,阐明提到Servlet.init和Servlet.destroy。
9. 在ServletRequestWrapper、ServletResponseWrapper和HandlesTypes中添加泛型。
10. HttpServletResponse.sendRedirect的javadoc:支持的网络路径引用。
11. 添加新的方法ServletRequest.getContentLengthLong和ServletResponse.setContentLengthLong。
A.2 自Servlet 3.0 Proposed Final Draft以后的变更
1. 重构一些异步API — 移动addAsyncListener到AsyncContext 且重命名为addListener。移动setAsyncTimeout到AsyncContext且重命名为setTimeout。
2. 阐明了异步处理中并发访问请求和响应的一些语义。
3. 更新了资源引用元素的可插拔性规则。
4. 添加了新的注解 — @ServletSecurity (和用于字段的相关注解) 定义安全,而不重用@RolesAllowed、@PermitAll、@DenyAll
A.3 自Servlet 3.0 Public Review以后的变更
1. 更新了isAsyncStarted返回false,一旦分派到了容器或从异步处理器(async handler)中调用complete 完成了。
2. 添加了fragment的顺序支持。
3. 添加了文件上传支持。
4. 添加了从JAR文件中加载静态资源和JSP的支持,其包含在绑定在WEB-INF/lib目录中的JAR文件的META-INF/resources目录中。
5. 根据规范的Public Review的反馈变更了注解名称。
6. 添加了编程式登录/退出支持。
7. 添加了安全相关的通用注解支持 — @RolesAllowed、@PermitAll、@DenyAll。
8. 阐明了welcome file。
A.4 自Servlet 3.0 EDR以后的变更
1. suspend / resume API在规范中不再存在。它们已经被startAsync和现在有forward和complete的AsyncContext的所替代。
2. 注解名字已经改变为仅有顶层注解。生命Servlet方法的方法级注解不再被使用。
3. 描述了从fragment和注解装配web.xml的规则。
A.5 自Servlet 2.5 MR6以后的变更
1. 添加了注解和web fragment的支持
2. 添加了对suspend / resume的支持以允许在servlet中异步。
3. 添加了从ServletContext在初始化时初始化servlet和filter的支持。
4. 添加了HttpOnly cookie的支持并允许配置cookie。
5. 添加了简便方法到ServletRequest,以获取Response和ServletContext。
A.6 自Servlet 2.5 MR 5以后的变更
A.6.1 阐明SRV 8.4“Forward方法”
更改的本节最后一句目前是:
“在RequestDispatcher的forward方法返回之前,响应内容必须被发送和提交,且由Servlet容器关闭。”
改为:
“在RequestDispatcher接口的forward方法无异常返回之前,响应的内容必须被发送和提交,且由Servlet容器关闭。如果RequestDispatcher.forward()的目标发生错误,异常信息会传回所有调用它经过的过滤器和servlet,且最终传回给容器。”
A.6.2 更新部署描述符“http-method values allowed”
部署描述符中的http-method元素方面目前比http规范有更严格的限制。以下对描述符做出的改变,允许一组由HTTP规范定义的方法名。http-methodType模式的值从
<xsd:pattern value="[\p{L}-[\p{Cc}\p{Z}]]+"/>
改变为HTTP规范列出的允许的HTTP方法名的接近地匹配。
<xsd:pattern value="[!-~-[\(\)<>@,;:"/\[\]?=\{\}\\\p{Z}]]+"/>
A.6.3 阐明 SRV 7.7.1 “多线程问题”
更改的段落当前是:
“在同一时间多个Servlet执行请求的线程可能都有到同一会话的活跃访问。开发人员负责同步访问适当的会话资源。”
改为:
“在同一时间多个Servlet执行请求的线程可能都有到同一会话的活跃访问。容器必须确保,以一种线程安全的方式维护表示会话属性的内部数据结构。开发人员负责线程安全的访问属性对象本身。这样将防止并发访问HttpSession对象内的属性集合,消除了应用程序导致破坏集合的机会。”
A.7 自Servlet 2.5 MR 2以后的变更
A.7.1 更新JavaEE容器注解的要求
添加了15.5节“注解和资源注入”的描述列表所需的JavaEE容器注解EJBs、PreDestroy、PeristenceContext、PersistenceContexts、PersistenceUnit、和PersistenceUnits。
A.7.2 更新Java企业版的要求
更新注解到最终JavaEE注解名。也更新了web.xml的“full”属性为“metadata-complete”。
A.7.3 阐明HttpServletRequest.getRequestURL()
阐明了API文档中的javax.servlet.http.HttpServletRequest.getRequestURL()。
新增了斜体文本:
如果请求已使用RequestDispatcher.forward(ServletRequest, ServletResponse)转发,重新构建的URL中的服务器路径必须反映出得到的RequestDispatcher所使用的路径,且不是客户端指定的服务器路径。由于该方法返回一个StringBuffer,而不是一个String,你可以容易的修改此URL,例如,添加查询参数。