Servlet3.1规范翻译——变更历史
<filter-mapping> <filter-name>All Dispatch Filter</filter-name> <servlet-name>*</servlet-name> <dispatcher>FORWARD</dispatcher></filter-mapping>
?
?
在按名字或按路径获取的所有请求分派器的forward()调用时该代码将导致All Dispatch Filter被调用。
?
A.8.3 多次出现的Servlet映射
?
之前版本的Servlet schema仅允许每个servlet-mapping单个url-pattern或servelt-name。对于servlet映射到的多个URL,这导致整个映射项不必要的重复。
?
部署描述符servlet-mappingType更新为:
?
代码示例 A-2? servlet-mappingType描述符
<xsd:complexType name="servlet-mappingType"> <xsd:sequence> <xsd:element name="servlet-name" type="j2ee:servlet- nameType"/> <xsd:element name="url-pattern" type="j2ee:url-patternType" minOccurs="1" maxOccurs="unbounded"/> </xsd:sequence> <xsd:attribute name="id" type="xsd:ID"/></xsd:complexType>
??
A.8.4 多次出现Filter映射
?
之前版本的Servlet schema仅允许每个servlet-mapping单个url-pattern或servelt-name。对于servlet映射到的多个URL,这导致整个映射项不必要的重复。
?
部署描述符schema filter-mappingType更新为:
?
代码示例 A-3? 更新的filter-mappingType schema
?
<xsd:complexType name="filter-mappingType"> <xsd:sequence> <xsd:element name="filter-name" type="j2ee:filter-nameType"/> <xsd:choice minOccurs="1" maxOccurs="unbounded"> <xsd:element name="url-pattern" type="j2ee:url-patternType"/> <xsd:element name="servlet-name" type="j2ee:servlet-nameType"/> </xsd:choice> <xsd:element name="dispatcher" type="j2ee:dispatcherType" minOccurs="0" maxOccurs="4"/> </xsd:sequence> <xsd:attribute name="id" type="xsd:ID"/></xsd:complexType>?
此改变允许在单个映射中定义多个模式和servlet名字,下面的例子可以看出:
?
代码示例 A-4? Filter映射例子
?
<!--[if gte vml 1]><v:shapetype id="_x0000_t202" coordsize="21600,21600" o:spt="202" path="m,l,21600r21600,l21600,xe"> <v:stroke joinstyle="miter"/> <v:path gradientshapeok="t" o:connecttype="rect"/></v:shapetype><v:shape id="_x0000_s1026" type="#_x0000_t202" style='position:absolute; left:0;text-align:left;margin-left:0;margin-top:7.35pt;width:486pt;height:132.6pt; z-index:251683328'> <v:textbox style='mso-next-textbox:#_x0000_s1026'/></v:shape><![endif]--><!--[if !vml]-->
<!--[endif]-->
<filter-mapping> <filter-name>Demo Filter</filter-name> <url-pattern>/foo/*</url-pattern> <url-pattern>/bar/*</url-pattern> <servlet-name>Logger</servlet-name> <dispatcher>REQUEST</dispatcher> <dispatcher>ERROR</dispatcher></filter-mapping>
?
更新了6.2.4节,“在Web应用中配置过滤器”,使用以下文本来阐明多个映射的情况:
?
“如果过滤器映射同时包含了<servlet-name> 和 <url-pattern>,容器必须展开过滤器映射为多个过滤器映射(每一个<servlet-name> 和 <url-pattern>一个),保持<servlet-name>和<url-pattern>元素顺序。”
?
也提供了一个例子来阐明什么时候有多个映射的情况。
?
A.8.5 授权约束支持其他的HTTP方法
?
之前版本的Servlet 2.4 schema限制HTTP方法为GET、POST、PUT、DELETE、HEAD、OPTIONS、和TRACE。http-methodType schema 从
?
代码示例A-5? Servlet 2.4 http-methodType schema
?
<xsd:complexType name="http-methodType">...<xsd:simpleContent><xsd:restriction base="j2ee:string"> <xsd:enumeration value="GET"/> <xsd:enumeration value="POST"/> <xsd:enumeration value="PUT"/> <xsd:enumeration value="DELETE"/> <xsd:enumeration value="HEAD"/> <xsd:enumeration value="OPTIONS"/> <xsd:enumeration value="TRACE"/> </xsd:restriction> </xsd:simpleContent></xsd:complexType>
?改变为:
?
代码示例 A-6? Servlet 2.5 http-methodType schema
?
<!--[if gte vml 1]><v:shape id="_x0000_s1028" type="#_x0000_t202" style='position:absolute;left:0; text-align:left;margin-left:0;margin-top:4.75pt;width:486pt;height:163.8pt; z-index:251685376'> <v:textbox style='mso-next-textbox:#_x0000_s1028'/></v:shape><![endif]--><!--[if !vml]-->
<!--[endif]-->
<xsd:simpleType name="http-methodType"> <xsd:annotation> <xsd:documentation> A HTTP method type as defined in HTTP 1.1 section 2.2. </xsd:documentation> </xsd:annotation> <xsd:restriction base="xsd:token"> <xsd:pattern value="[\p{L}-[\p{Cc}\p{Z}]]+"/> </xsd:restriction></xsd:simpleType>??
http-method元素现在需要是描述在HTTP 1.1规范第2.2节的一个符号。
?
A.8.6 最低J2SE要求
?
Servlet 2.5 容器现在需要的最低Java版本是J2SE5.0。
?
1.2节,“什么是Servlet容器?” 进行了更新来反映此要求。
?
A.8.7 注解和资源注入
?
Java EE技术兼容的容器需要对Servlet、Filter和Listener注解和资源注入。15.5节,“注解和资源注入”进一步描述了注解和资源注入的细节。
?
A.8.8 移除了SRV.9.9(“错误处理”)要求
?
10.9.1节,“请求属性”定义了如下要求:
?
如果错误处理位于一个servlet或JSP页面:
?
?[...]
?
响应的setStatus方法被禁用,且如果调用则被忽略。
?
?[...]
?
JSP 2.1 EG提出了删除上述要求,以允许JSP错误页面更新响应状态。
?
A.8.9 阐明HttpServletRequest.isRequestedSessionIdValid()
?
API阐明了更好的描述客户端没有指定一个session id时发生什么。API文档进行了更新指定什么时候返回false。
?
API文档当前的描述:
?
如果客户端没有指定任何session ID,返回false。
?
A.8.10 阐明SRV.5.5 (“结束响应对象”)
?
第5.6节,“结束响应对象”的行为,响应的内容长度通过response.setHeader("Content-Length", "0")设置为0,则任何随后的setHeader()调用被忽略。
?
第5.6节,“结束响应对象”进行了更新以允许所有header被设置,通过改变:
?
“响应的setContentLength或setContentLengthLong方法指定了内容量,且已经写入到响应”
?
为如下:
?
“响应的setContentLength或setContentLengthLong方法指定了内容量大于零,且已经写入到响应”
?
A.8.11 阐明ServletRequest.setCharacterEncoding()
?
API进行了更新以描述如果此方法在getReader()方法调用之后调用的行为。如果getReader()已调用则此方法将无任何效果。
?
A.8.12 Java企业版要求
?
第15章,“其他规范相关的要求”详细介绍了JavaEE容器的所有要求。先前的要求被混入到每个章节。
?
A.8.13 新增了Servlet 2.4 MR 更新的变更历史
?
添加了自Servlet 2.4 Maintenance Review的变更。这些变更包括语法和排版的修正。
?
A.8.14 阐明同步访问Session对象
?
第7.7.1节,“线程问题”进行了更新以阐明将同步地访问session对象。
?
?
■ 可选的“X-Powered-By”header添加到响应 (5.2)
?
■ 明确“重叠的约束 (12.8.1, 12.8.2)
?
■ 添加明确在web应用部署时的处理顺序章节。(9.12)
?
■ 明确安全模型也应用到Filter (12.2)
?
■状态码从401改变为200,当FORM验证失败且因为HTTP/1.1中没有合适的状态码时 (12.5.3)
?
■ 明确包装对象(6.2.2)
?
■ 明确覆盖平台类 (9.7.2)
?
■ 明确welcome list (9.10)
?
■ 明确国际化 — setLocale、setContentType和setCharacterEncoding之间的关系 (5.4, 14.2.22)
?
■ 明确ServletRequestListener和ServletRequestAttributeListener描述(14.2.18, 14.2.20)
?
■ 添加HttpSessionActivationListener和HttpSessionBindingListener到表10-1。
?
■ 把单词“auth constraint”改为“authorization constraint” (12.8)
?
■ 添加“Since”标签到javadoc中新添加的方法 (14.2.16, 14.2.22)
?
■ 修复schema中的<session-timeout>数据类型为xsdIntegerType (13.3)
?
■ 阐明什么时候监听器抛出未处理的异常 (10.6)
?
■ 阐明“共享库” (9.7.1)
?
■ 阐明容器的扩展机制 (9.7.1, 第三段)
?
■ 移除HttpSession.logout方法。便携的身份验证机制将在此规范的下一个版本中解决,且logout也将在该范围进行讨论。(12.10)
?
■ 现在是建议,而不是要求,请求和响应对象的引用不应该传递给其他线程的对象 — 基于JSR-168的要求。当应用创建的线程使用容器管理的对象时添加警告。 (2.3.3.3)
?
■ 现在是建议,分派应该发生在原始请求所在的同一个JVM的同一个线程中 — 基于JSR-168的要求 (8.2)
?
■ 阐明“wrap” (6.2.2)
?
■ 阐明处理用于映射的路径参数 (11.1)
?
■ 在HTTPServlet.doGet为中添加了关于“HTTP chunk”的描述(15.1.2)
?
■ J2SE 1.3是构建servlet容器的基础Java平台的最低版本。(1.2)
?
■ 阐明ServletResponse.setBufferSize方法 (5.1)
?
■ 阐明ServletRequest.getServerName和getServerPort (14.2.16.1)
?
■ 阐明国际化 (5.4, 14.2.22)
?
■ 阐明重定向的welcome file (9.10)
?
■ 阐明ServletContextListener.contextInitialized (14.2.12.1)
?
■ 阐明HttpServletRequest.getRequestedSessionId — 明确它返回客户端指定的session ID (15.1.3.2)
?
■ 阐明用于扩展的class loader —在同一个JVM中用于所有web应用的class loader必须是同一个。(9.7.1)
?
■ 阐明什么时候ServletRequestListener抛出一个未处理的异常的情况 (10.6, 14.2.20)
?
■ 阐明ServletRequestListener的作用域(14.2.20)
?
■ 添加了关于什么时候容器有一个缓存机制的情况的描述 (1.2)
?
■ JavaEE容器需要使用schema验证部署描述符 (13.2)
?
■ <web-app>下的子元素可以是任意顺序 (13.2)
?
■ 容器的拒绝web应用的一个例子被移除,由于和SRV.11.1矛盾 (9.5)
?
■ url-patternType从j2ee:string改变为xsd:string (13)
?
■ 部署描述符中的<web-app>下的子元素可以是任意顺序 (13.2)
?
■ 当部署描述符文件包含一个非法字符或多个<session-config>、<jsp-config>或<login-config>元素时,容器必须以一个描述性错误消息通知开发人员。(13)
?
■ 移除了部署描述的可扩展性(13)
?
■ 添加SRV.1.6章节 — 描述了此规范与之前版本的兼容性问题 (1.6)
?
■ 在RequestDispatcher.forward 中添加了新的属性 (8.4.2)
?
■ 在ServletRequest接口和ServletRequestWrapper中新的方法 (14.2.16.1)
?
■ 不推荐接口SingleThreadModel((2.2.1, 2.3.3.1, 14.2.24)
?
■ 方法ServletRequestEvent.getRequest改为ServletRequestEvent.getServletRequest (14.2.19.2)
?
■ 阐明“request”访问WEB-INF目录 (9.5)
?
■ 阐明ServletRequest.setAttribute行为 — 在“如果传入的value是null”的情况下把“value”改为“object” (14.2.16.1)
?
■ 修正了此规范与HttpServletRequest.getServletPath之间的不一致 — 返回值以“/”开始 (15.1.3.2)
?
■ 修正了此规范与HttpServletRequest.getPathInfo之间的不一致 — 返回值以“/”开始 (15.1.3.2)
?
■ 修正了此规范与HttpServletRequest.getPathTranslated 之间的不一致 — 添加什么时候容器不翻译路径的情况(15.1.3.2)
?
■ 允许HttpServletRequest.getAuthType不仅返回预定义的四个身份认证方案,也可以返回容器特定的方案 (15.1.3.2)
?
■ HttpSessionListener.sessionDestroyed行为改变为在session失效之前触发 (15.1.14.1)
?
■ 修正错误状态码403为403 (9.5, 9.6)
?
■ 元素“taglib”应该是“jsp-config” (13.2)
?
■ 修正JSP规范版本号为2.0
?
■ 修正错误的排版(5.5, 6.2.5, 12.8.3, 12.9)
?
■ 现在需要HTTP/1.1 (1.2)
?
■ <web-resource-collection>中的<url-pattern>是必须的 (13.4)
?
■ 阐明分布式环境中的IllegalArgumentException (7.7.2)
?
■ 阐明错误页面处理(9.9.1, 9.9.2, 9.9.3, 6.2.5)
?
■ 阐明安全约束,尤其在重叠约束的情况(12.8)
?
■ 阐明什么时候<session-timeout>不指定的情况 (13.4)
?
■ 阐明什么时候资源是永久性的不可用的情况 (2.3.3.2)
?
■ 在枚举列表中添加缺失的getParameterMap() (4.1)
?
■ 阐明当访问/WEB-INF/resource时的状态码 (9.5)
?
■ 阐明当访问/WEB-INF/resource时的状态码 (9.5)
?
■ 在部署描述符中把xsd:string改为j2ee:string (13.4)
?
■ 可扩展的部署描述符 (SRV.13)
?
■ XML Schema定义部署描述符 (SRV.13)
?
■ 请求监听器 (SRV.10和API改变)
?
新的API:ServletRequestListener、ServletRequestAttributeListener和相关的事件类
?
■ 在Request Dispatcher情况下有能力使用Filter (6.2.5)
?
■ 必需的class loader扩展机制 (9.7.1)
?
■ Listener异常处理(10.6)
?
■ 阐明 Listener顺序 vs. servlet init()/destroy() (ServletContextListener javadoc 改变)
?
■ Servlet映射到的WEB-INF / 响应处理 (9.5)
?
■ Request dispatcher / 路径匹配规则 (8.1)
?
■ Welcome file可以是servlet (9.10)
?
■ 国际化增强(5.4, 14,2,22, 15.1.5)
?
■ 添加了SC_FOUND(302) (15.1.5)
?
■ 在getRequestDispatcher()中的“相对路径”必须相当于当前servlet (8.1)
?
■ XML例子中的Bug修复(13.7.2)
?
■ 阐明getResource访问 “仅到资源”(3.5)
?
■ 阐明getServerName()和getServerPort() 中的SERVER_NAME和SERVER_PORT (14.2.16)
?
■ 阐明:“run-as”身份必须应用到所有来自servlet包括init()和destroy()的调用(12.7)
?
■ 登录/退出的描述和添加的方法 (12.10, 15.1.7)
???