- 浏览: 21436243 次
- 性别:
博客专栏
-
跟我学spring3
浏览量:2405437
-
Spring杂谈
浏览量:2998016
-
跟开涛学SpringMVC...
浏览量:5631699
-
Servlet3.1规范翻...
浏览量:257622
-
springmvc杂谈
浏览量:1593292
-
hibernate杂谈
浏览量:249006
-
跟我学Shiro
浏览量:5847847
-
跟我学Nginx+Lua开...
浏览量:698249
-
亿级流量网站架构核心技术
浏览量:780592
文章分类
- 全部博客 (329)
- 跟我学Nginx+Lua开发 (13)
- 跟我学spring (54)
- 跟开涛学SpringMVC (34)
- spring4 (16)
- spring杂谈 (50)
- springmvc杂谈 (22)
- 跟我学Shiro (26)
- shiro杂谈 (3)
- hibernate杂谈 (10)
- java开发常见问题分析 (36)
- 加速Java应用开发 (5)
- Servlet 3.1规范[翻译] (21)
- servlet3.x (2)
- websocket协议[翻译] (14)
- websocket规范[翻译] (1)
- java web (6)
- db (1)
- js & jquery & bootstrap (4)
- 非技术 (4)
- reminder[转载] (23)
- 跟叶子学把妹 (8)
- nginx (2)
- 架构 (19)
- flume架构与源码分析 (4)
最新评论
-
xxx不是你可以惹得:
认真看错误代码,有时候重启电脑就行了 醉了 我把数据库配置写死 ...
第十六章 综合实例——《跟我学Shiro》 -
dagger9527:
holyselina 写道您前面说到能获取调用是的参数数组,我 ...
【第六章】 AOP 之 6.6 通知参数 ——跟我学spring3 -
xxx不是你可以惹得:
Access denied for user 'root'@' ...
第十六章 综合实例——《跟我学Shiro》 -
dagger9527:
只有@AspectJ支持命名切入点,而Schema风格不支持命 ...
【第六章】 AOP 之 6.5 AspectJ切入点语法详解 ——跟我学spring3 -
dagger9527:
支持虽然会迟到,但永远不会缺席!
【第四章】 资源 之 4.3 访问Resource ——跟我学spring3
Request
请求对象封装了客户端请求的所有信息。在HTTP协议中,这些信息是从客户端发送到服务器请求的HTTP头部和消息体。
3.1 HTTP协议参数
servlet的请参数以字符串的形式作为请求的一部分从客户端发送到servlet容器。当请求是一个HttpServletRequest对象,且符合第24页中“参数可用时”描述的条件时,容器从URI查询字符串和POST数据中填充参数。参数以一系列的名-值对的形式保存。任何给定的参数的名称可存在多个参数值。ServletRequest接口的下列方法可访问这些参数:
■ getParameter
■ getParameterNames
■ getParameterValues
■ getParameterMap
getParameterValues方法返回一个String对象的数组,包含了与参数名称相关的所有参数值。getParameter方法的返回值必须是getParameterValues方法返回的String对象数组中的第一个值。getParameterMap方法返回请求参数的一个java.util.Map对象,其中以参数名称作为map键,参数值作为map值。
查询字符串和POST请求的数据被汇总到请求参数集合中。查询字符串数据在POST数据之前发送。例如,如果请求由查询字符串a =hello和POST数据a=goodbye&a=world组成,得到的参数集合顺序将是=(hello,goodbye,world)。
这些API不会暴露GET请求(HTTP 1.1所定义的)的路径参数。他们必须从getRequestURI方法或getPathInfo方法返回的字符串值中解析。
3.1.1 当参数可用时
以下是在POST表单数据填充到参数集前必须满足的条件:
1。该请求是一个HTTP或HTTPS请求。
2。HTTP方法是POST。
3。内容类型是application/x-www-form-urlencoded。
4。该servlet已经对request对象的任意getParameter方法进行了初始调用。
如果不满足这些条件,而且参数集中不包括POST表单数据,那么servlet必须可以通过request对象的输入流得到POST数据。如果满足这些条件,那么从request对象的输入流中直接读取POST数据将不再有效。
3.2文件上传
当数据以multipart/form-data的格式发送时,servlet容器支持文件上传。
如果满足以下任何一个条件,servlet容器提供multipart/form-data格式数据的处理,。
■ servlet处理第8.1.5节,8-68页中定义的注解“@MultipartConfig”标注的请求。
■ 为了servlet处理请求,部署描述符包含了一个multipart-config元素。
如何使request中multipart/form-data类型的数据可用,取决于servlet容器是否提供multipart/form-data格式数据的处理:
■ 如果servlet容器提供multipart/form-data格式数据的处理,可通过HttpServletRequest中的以下方法得到:
■ public Collection<Part> getParts()
■ public Part getPart(String name)
译者注:Part类代表从multipart/form-data格式的POST请求中接收到的一个部分或表单项。 每个part都可通过Part.getInputStream方法访问头部,相关的内容类型和内容。
对于表单数据的Content-Disposition,即使没有文件名,也可使用part的名称通过HttpServletRequest的getParameter和getParameterValues方法得到part的字符串值。
■ 如果servlet的容器不提供multi-part/form-data格式数据的处理,这些数据将可通过HttpServletReuqest.getInputStream得到。
3.3 属性
属性是与请求相关联的对象。属性可以由容器设置来表达信息,否则无法通过API表示,或者由servlet设置将信息传达给另一个servlet(通过RequestDispatcher)。属性通过ServletRequest接口中下面的方法来访问:
■ getAttribute
■ getAttributeNames
■ setAttribute
只有一个属性值可与一个属性名称相关联。以前缀java.和javax.开头的属性名称是本规范的保留定义。同样地,以前缀sun.和com.sun.开头的属性名是Sun Microsystems的保留定义。建议属性集中所有属性的命名与Java编程语言的规范1为包命名建议的反向域名约定一致。
3.4 头
servlet可以通过HttpServletRequest接口的下面方法访问HTTP请求的头部信息:
■ getHeader
■ getHeaders
■ getHeaderNames
getHeader方法返回给定头名称的头。多个头可以具有相同的名称,例如HTTP请求中的Cache-Control头。如果多个头的名称相同,getHeader方法返回请求中的第一个头。 getHeaders方法允许访问所有与特定头名称相关的头值,返回一个String对象的枚举。
头可包含由String形式的int或Date数据。HttpServletRequest接口提供如下方便的方法访问这些类型的头数据:
■ getIntHeader
■ getDateHeader
如果getIntHeader方法不能转换为int的头值,则抛出NumberFormatException异常。如果getDateHeader方法不能把头转换成一个Date对象,则抛出IllegalArgumentException异常。
3.5 请求路径元素
引导servlet服务请求的请求路径由许多重要部分组成。以下元素从请求URI路径得到,并通过request对象公开:
■ Context Path:与ServletContext相关联的路径前缀是这个servlet的一部分。如果这个上下文是基于Web服务器的URL命名空间基础上的“默认”上下文,那么这个路径将是一个空字符串。否则,如果上下文不是基于服务器的命名空间,那么这个路径以/字符开始,但不以/字符结束。
■ Servlet Path:路径部分直接与激活请求的映射对应。这个路径以“/”字符开头,如果请求与“/ *”或“”模式匹配,在这种情况下,它是一个空字符串。
■ PathInfo:请求路径的一部分,不属于Context Path或Servlet Path。如果没有额外的路径,它要么是null,要么是以'/'开头的字符串。
使用HttpServletRequest接口中的下面方法来访问这些信息:
■ getContextPath
■ getServletPath
■ getPathInfo
重要的是要注意,除了请求URI和路径部分的URL编码差异外,下面的等式永远为真:
requestURI = contextPath + servletPath + pathInfo
举几个例子来澄清上述各点,请考虑以下几点:
表3-1 上下文设置的例子
Context Path |
/catalog |
Servlet Mapping |
Pattern: /lawn/* Servlet: LawnServlet |
Servlet Mapping |
Pattern: /garden/* Servlet: GardenServlet |
Servlet Mapping |
Pattern: *.jsp Servlet: JSPServlet |
遵守下列行为:
表3-2 遵守路径元素行为
请求路径 |
路径元素 |
/catalog/lawn/index.html |
ContextPath: /catalog ServletPath: /lawn PathInfo: /index.html |
/catalog/garden/implements/ |
ContextPath: /catalog ServletPath: /garden PathInfo: /implements/ |
/catalog/help/feedback.jsp |
ContextPath: /catalog ServletPath: /help/feedback.jsp PathInfo: null |
3.6 路径转换方法
在API中有两个方便的方法,允许开发者获得与某个特定的路径等价的文件系统路径。这些方法是:
■ ServletContext.getRealPath
■ HttpServletRequest.getPathTranslated
getRealPath方法需要一个字符串参数,并返回一个字符串形式的路径,这个路径对应一个在本地文件系统上的文件。getPathTranslated方法推断出请求的pathInfo的实际路径(译者注:把URL中servlet名称之后,查询字符串之前的路径信息转化成实际的路径)。
这些方法在servlet容器无法确定一个有效的文件路径 的情况下,如Web应用程序从归档中,在不能访问本地的远程文件系统上,或在一个数据库中执行时,这些方法必须返回null。JAR文件中META-INF/resources目录下的资源,只有当调用getRealPath()方法时才认为容器已经从包含它的JAR文件中解压,在这种情况下,必须返回解压缩后位置。
3.7 非阻塞IO
Web容器中的非阻塞请求处理有助于提高对改善Web容器可扩展性不断增加的需求,增加Web容器可同时处理请求的连接数量。servlet容器的非阻塞IO允许开发人员在数据可用时读取数据或在数据可写时写数据。
ReadListener为非阻塞IO提供了下面的回调方法:
■ ReadListener
■ onDataAvailable().当可从传入的请求流中读取数据时ReadListener的onDataAvailable方法被调用。容器将调用该方法。每一组可用数据该方法将被调用一次。
■ onAllDataRead().当读取完注册了此监听器的ServletRequest的所有数据时调用onAllDataRead方法。
■ onError(Throwable t). 处理请求时如果有任何错误或异常发生时调用onError方法。
除了上述ReadListener定义的方法外,下列方法已被添加到ServletInputStream类中:
■ ServletInputStream
■ boolean isFinished(). 与ServletReader/ServletInputStream相关的请求的所有数据已经读取完时isFinished方法返回true。否则返回false。
■ boolean isReady().如果可以无阻塞地读取数据isReady方法返回true。如果没有数据可以无阻塞地读取该方法返回false。如果isReady方法返回false,不能够调用read方法。
■ void setReadListener(ReadListener listener). 设置上述定义的ReadListener,调用它以非阻塞的方式读取数据。一旦把监听器与给定的ServletInputStream关联起来,当数据可以读取,所有的数据都读取完或如果处理请求时发生错误,容器调用ReadListener的方法。注册一个ReadListener将启动非阻塞IO。在那时不能切换到传统的阻塞IO。
3.8 Cookies
HttpServletRequest接口提供了getCookies方法来获得请求中的cookie的一个数组。这些cookie是从客户端发送到服务器端的客户端发出的每个请求上的数据。典型地,客户端发送回的作为cookie的一部分的唯一信息是cookie的名称和cookie值。当cookie发送到浏览器时可以设置其他cookie属性,诸如注释,这些信息不会返回到服务器。该规范还允许的cookies是HttpOnly cookie。HttpOnly cookie暗示客户端它们不会暴露给客户端脚本代码(它没有被过滤掉,除非客户端知道如何查找此属性)。使用HttpOnly cookie有助于减少某些类型的跨站点脚本攻击。
3.9 SSL属性
如果请求已经通过一个安全协议发送过,如HTTPS,必须通过ServletRequest接口的isSecure方法公开该信息。Web容器必须公开下列属性给servlet程序员:
表3-3 协议属性
属性 |
属性名称 |
Java类型 |
密码套件 |
javax.servlet.request.cipher_suite |
String |
算法的位大小 |
javax.servlet.request.key_size |
Integer |
SSL会话id |
javax.servlet.request.ssl_session_id |
String |
如果有一个与请求相关的SSL证书,它必须由servlet容器以java.security.cert.X509Certificate类型的对象数组暴露给servlet程序员并可通过一个javax.servlet.request.X509Certificate类型的ServletRequest属性访问。
这个数组的顺序是按照信任的升序顺序。证书链中的第一个证书是由客户端设置的,第二个是用来验证第一个的,等等。
3.10 国际化
客户可以选择希望Web服务器用什么语言来响应。该信息可以和使用Accept-Language头与HTTP/1.1规范中描述的其他机制的客户端通信。ServletRequest接口提供下面的方法来确定发送者的首选语言环境:
■ getLocale
■ getLocales
的getLocale方法将返回客户端要接受内容的首选语言环境。要了解更多关于Accept-Language头必须被解释为确定客户端首选语言的信息,请参阅RFC 2616(HTTP/1.1)14.4节。
getLocales方法将返回一个Locale对象的枚举,从首选语言环境开始顺序递减,这些语言环境是可被客户接受的语言环境。
如果客户端没有指定首选语言环境,getLocale方法返回的语言环境必须是servlet容器默认的语言环境,而getLocales方法必须返回只包含一个默认语言环境的Local元素的枚举。
3.11 请求数据编码
目前,许多浏览器不随着Content-Type头一起发送字符编码限定符,而是根据读取HTTP请求确定字符编码。如果客户端请求没有指定请求默认的字符编码,容器用来创建请求读取器和解析POST数据的编码必须是“ISO-8859-1”。然而,为了向开发人员说明客户端没有指定请求默认的字符编码,在这种情况下,客户端发送字符编码失败,容器从getCharacterEncoding方法返回null。
如果客户端没有设置字符编码,并使用不同的编码来编码请求数据,而不是使用上面描述的默认的字符编码,那么可能会发生破坏。为了弥补这种情况,ServletRequest接口添加了一个新的方法setCharacterEncoding(String enc)。开发人员可以通过调用此方法来覆盖由容器提供的字符编码。必须在解析任何post数据或从请求读取任何输入之前调用此方法。此方法一旦调用,将不会影响已经读取的数据的编码。
3.12 Request对象的生命周期
每个request对象只在servlet的service方法的作用域内,或过滤器的doFilter方法的作用域内有效,除非该组件启用了异步处理并且调用了request对象的startAsync方法。在发生异步处理的情况下,request对象一直有效,直到调用AsyncContext的complete方法。容器通常会重复利用request对象,以避免创建request对象的性能开销。开发人员必须注意的是,不建议在上述范围之外保持startAsync方法还没有被调用的请求对象的引用,因为这样可能产生不确定的结果。
PS:希望大家不吝指正翻译中的错误,希望有兴趣的iteye朋友加入进来一起翻译和学习。
Servlet3.1(JSR340)规范目前处于早期草案阶段,目标是在Java EE 7或更高平台。 Servlet3.0(JSR 315)已经包含在Java EE 6平台。具体请参考本规范网站:http://jcp.org/en/jsr/detail?id=340
评论
现在没看规范 可能规范版本变了
3.1的和3.0的差不多 直接看3.1即可
已加
发表评论
-
Servlet3.1学习示例
2013-08-29 08:49 20686本系列是个人学习写的新特性的示例,喜欢的朋友可以一起学习 ... -
Servlet3.1规范(最终版)中文版下载
2013-07-24 06:19 70396最近JavaEE 7也发布了,其包含的Servlet 3. ... -
Servlet3.1规范(最终版)中文版下载
2013-07-23 22:19 0最近JavaEE 7也发布了, ... -
Servlet3.1规范翻译——Servlet接口
2013-07-21 07:19 9292补发之前遗漏的一章 ... -
Servlet3.1 edr 规范中文版下载
2013-01-26 07:53 16985第一次翻译英文资料,不当之处多多指正。 翻译者 穆茂强 ... -
Servlet3.1规范翻译——词汇表
2013-01-25 14:26 4584词汇表 A 应用开发人 ... -
Servlet3.1规范翻译——变更历史
2013-01-25 14:25 4821变更历史 本文档是由Java社区进程SM (JCP) ... -
Servlet3.1规范翻译——与其它规范有关的要求
2013-01-24 07:46 5092与其它规范有关的要求 本章列出对web容器的要求, ... -
Servlet3.1规范翻译——部署描述文件
2013-01-21 12:56 7660部署描述文件 本章指定的Java™Servlet ... -
Servlet3.1规范翻译——安全
2013-01-08 15:50 7183安全 应用开发人员创建Web应用,他给、销售或其他方式转入应 ... -
Servlet3.1规范翻译——映射请求到Servlet
2012-12-29 16:06 6723《Servlet3.1规范》翻译目录 映射请求到Serv ... -
Servlet3.1规范翻译——应用生命周期事件
2012-12-29 07:39 5978应用生命周期事件 11.1 介绍 应用事件设施给We ... -
Servlet3.1规范翻译——应用生命周期事件
2012-12-28 21:29 71应用生命周期事件 11.1 ... -
Servlet3.1规范翻译——Web应用
2012-12-25 08:56 10366Web应用 一个Web应用是由许多servlet、HTML页 ... -
Servlet3.1规范翻译——转发请求
2012-12-22 07:52 10406转发请求 构建Web应用时,把请求转发给另一个serv ... -
Servlet3.1规范翻译——注解和可插拔性
2012-12-20 09:11 15666注解和可插拔性 本章讨论Servlet 3.0规范定 ... -
Servlet3.1规范翻译——Session
2012-12-15 08:03 7302会话 超文本传输协议(HTTP)被设计为一种无状态协议 ... -
Servlet3.1规范翻译——过滤器
2012-11-28 07:26 11242过滤器 过滤器(Filter)是Java组件,允许运行 ... -
Servlet3.1规范翻译——Response
2012-11-26 14:58 9705Response 响应(response)对象封装了从 ... -
Servlet3.1规范翻译——Servlet Context
2012-11-24 07:33 140874.1 ServletContext接口 ...
相关推荐
5.4 一夫当关——配置并应用Servlet过滤器 5.4.1 过滤器的基本原理 5.4.2 过滤器的核心API 5.4.3 过滤器的创建与配置 5.4.4 JavaWeb中字符乱码分析 5.4.5 实现字符编码过滤器 5.5 实战检验 5.5.1 通过Servlet实现...
Spring Security-3.0.1 中文官方文档(翻译版) 这次发布的Spring Security-3.0.1 是一个bug fix 版,主要是对3.0 中存在的一些问题进 行修 正。文档中没有添加新功能的介绍,但是将之前拼写错误的一些类名进行...
3.2 实体EJB 的开发技术之二——BMP EJB 3.3 EJB 开发实例封装数据源 3.4 本章小结 第4 章 JSP 与J2EE 分布式处理技术 4.1 J2EE 和分布式处理技术 4.2 远程方法调用RMI 技术 4.3 CORBA 技术 4.4 JNDI 技术 4.5 本章...
3.2 实体EJB 的开发技术之二——BMP EJB 3.3 EJB 开发实例封装数据源 3.4 本章小结 第4 章 JSP 与J2EE 分布式处理技术 4.1 J2EE 和分布式处理技术 4.2 远程方法调用RMI 技术 4.3 CORBA 技术 4.4 JNDI 技术 4.5 本章...
3.1、认识XML 3.2、XML解析 3.2.1、DOM解析操作 3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4...
3.1、认识XML 3.2、XML解析 3.2.1、DOM解析操作 3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4...
3.1、认识XML 3.2、XML解析 3.2.1、DOM解析操作 3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4...
3.1、认识XML 3.2、XML解析 3.2.1、DOM解析操作 3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4...
3.1、认识XML 3.2、XML解析 3.2.1、DOM解析操作 3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4...
3.1、认识XML 3.2、XML解析 3.2.1、DOM解析操作 3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4...
3.1、认识XML 3.2、XML解析 3.2.1、DOM解析操作 3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4...
3.1、认识XML 3.2、XML解析 3.2.1、DOM解析操作 3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4...
7.4. 使用其他过滤器 —— 基于框架 8. 核心安全过滤器 8.1. FilterSecurityInterceptor 8.2. ExceptionTranslationFilter 8.2.1. AuthenticationEntryPoint 8.2.2. AccessDeniedHandler 8.3. ...
3.1面向对象的基本概念98 3.1.1对象98 3.1.2类99 3.1.3消息101 3.1.4面向对象的4个基本特征101 3.2类与对象104 3.2.1类的基本结构104 3.2.2类的声明104 3.2.3创建类体105 3.2.4对象的生命周期106 3.2.5...
7.4. 使用其他过滤器 —— 基于框架 8. 核心安全过滤器 8.1. FilterSecurityInterceptor 8.2. ExceptionTranslationFilter 8.2.1. AuthenticationEntryPoint 8.2.2. AccessDeniedHandler 8.3. ...
242 实例74 实现一个简单的代理服务器 246 实例75 C/S结构的分布式运算 248 第7章 Java B/S结构编程 253 实例76 简单的Servlet程序 254 实例77 简单的留言簿 256 实例78 JSP+Java Bean的计数器 ...