Java Specification Requirement 之 Servlet 第三章
翻译by:潘星臣
任何问题,发送到:
admin@optrees.org
admin@wewebos.com
request 对象封装了来自客户端请求的所有信息。在HTTP协议下,这些信息包括从客户端传向服务器的HTTP报头和请求的消息正文。
3.1 HTTP 协议参数
servlet的 Request 参数是一些由客户端传给 servlet 容器的字符串,这些字符串是 request 的一部分。当 request 是一个 HttpServletRequest 对象的时候,容器从URI查询字符串和POST数据获得参数。
参数通过一种“名字-值”对的形式保存。对于一个给定的参数名,可以同时存在多个值。以下是 ServletRequest 接口定义的用来访问参数的方法:
getParameter
getParameterNames
getParameterValues
getParameterMap
getParameterValues方法返回一个String对象数组,包含了关联到一个参数名的所有值。getParameter方法返回的是getParameterValues方法返回数组的第一个值。getParameterMap 方法返回一个 java.util.Map 的request参数Map,以名字作为key,参数的值作为map值。
从查询字符串和Post正文传输的数据都聚集到request参数集合里。查询字符串的数据先于Post正文呈现。例如,查询字符串传递了a=hello,post正文是:a=goodbye&a=world,那么在参数集合里将按照a=(hello,goodbye,world)的方式存放。
路径参数是Get request(在HTTP 1.1中定义)的一部分,但是在本API中并没有提供。必须通过分析 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的数据。如果条件满足,那么post的数据就不能直接从request对象的输入流里获得了。
3.2 属性
属性是关联在request上的对象们。属性可以是由容器设置的,用来表示那些不能通过API表达的信息,也可以是由 servlet 来设置,用来与其他servlet通讯(通过RequestDispatcher)。属性可以通过ServletRequest接口的以下函数来访问:
getAttribute
getAttributeNames
setAttribute
一个属性名只能关联一个属性值。
属性名以"java."或者"javax."为前缀开头的,在本规格说明书中都被保留。同样的,以"sun."或"com.sun."为前缀的属性也被Sun Microsystems保留。因此建议所有属性的命名遵照 Java Programming Language Spectificatiion里关于包命名的保留规则。
3.3 报头
servlet 能够访问到HTTP请求的报头,通过以下 HttpServletRequest 接口的方法。
getHeader
getHeaders
getHeaderNames
getHeader函数根据给定的名字返回一个报头。同一个名字可以关联多个报头,例如在HTTP请求里的Cache-Control报头。如果一个名字关联了多个报头,那么getHeader函数返回的是request中的第一个报头。getHeaders 函数允许访问报头名所关联的所有报头,它返回的是一个String对象组成的Enumeration。
报头可能会通过包含String而表示int或Date类型的数据。HttpServletReques接口提供了一些通过别的格式访问报头数据的方法:
getIntHeader
getDateHeader
如果 getIntHeader 方法不能转换报头的值到int,将会抛出一个 NumberFormatException 的异常。如果getDateHeader方法不能转换报头值到Date对象,那么就会抛出一个 IllegalArgumentException 异常。
3.4 请求路径(Request Path)的原理
请求路径是用来引导一个 servlet 处理一个请求,它由很多重要的部分构成。以下的内容是能从 request URI path获得的以及能通过request对象暴露的:
Context Path:这个路径前缀与 ServletContext 相关联。
翻译by:潘星臣
任何问题,发送到:
admin@optrees.org
admin@wewebos.com
The Request
request 对象封装了来自客户端请求的所有信息。在HTTP协议下,这些信息包括从客户端传向服务器的HTTP报头和请求的消息正文。
3.1 HTTP 协议参数
servlet的 Request 参数是一些由客户端传给 servlet 容器的字符串,这些字符串是 request 的一部分。当 request 是一个 HttpServletRequest 对象的时候,容器从URI查询字符串和POST数据获得参数。
参数通过一种“名字-值”对的形式保存。对于一个给定的参数名,可以同时存在多个值。以下是 ServletRequest 接口定义的用来访问参数的方法:
getParameter
getParameterNames
getParameterValues
getParameterMap
getParameterValues方法返回一个String对象数组,包含了关联到一个参数名的所有值。getParameter方法返回的是getParameterValues方法返回数组的第一个值。getParameterMap 方法返回一个 java.util.Map 的request参数Map,以名字作为key,参数的值作为map值。
从查询字符串和Post正文传输的数据都聚集到request参数集合里。查询字符串的数据先于Post正文呈现。例如,查询字符串传递了a=hello,post正文是:a=goodbye&a=world,那么在参数集合里将按照a=(hello,goodbye,world)的方式存放。
路径参数是Get request(在HTTP 1.1中定义)的一部分,但是在本API中并没有提供。必须通过分析 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的数据。如果条件满足,那么post的数据就不能直接从request对象的输入流里获得了。
3.2 属性
属性是关联在request上的对象们。属性可以是由容器设置的,用来表示那些不能通过API表达的信息,也可以是由 servlet 来设置,用来与其他servlet通讯(通过RequestDispatcher)。属性可以通过ServletRequest接口的以下函数来访问:
getAttribute
getAttributeNames
setAttribute
一个属性名只能关联一个属性值。
属性名以"java."或者"javax."为前缀开头的,在本规格说明书中都被保留。同样的,以"sun."或"com.sun."为前缀的属性也被Sun Microsystems保留。因此建议所有属性的命名遵照 Java Programming Language Spectificatiion里关于包命名的保留规则。
3.3 报头
servlet 能够访问到HTTP请求的报头,通过以下 HttpServletRequest 接口的方法。
getHeader
getHeaders
getHeaderNames
getHeader函数根据给定的名字返回一个报头。同一个名字可以关联多个报头,例如在HTTP请求里的Cache-Control报头。如果一个名字关联了多个报头,那么getHeader函数返回的是request中的第一个报头。getHeaders 函数允许访问报头名所关联的所有报头,它返回的是一个String对象组成的Enumeration。
报头可能会通过包含String而表示int或Date类型的数据。HttpServletReques接口提供了一些通过别的格式访问报头数据的方法:
getIntHeader
getDateHeader
如果 getIntHeader 方法不能转换报头的值到int,将会抛出一个 NumberFormatException 的异常。如果getDateHeader方法不能转换报头值到Date对象,那么就会抛出一个 IllegalArgumentException 异常。
3.4 请求路径(Request Path)的原理
请求路径是用来引导一个 servlet 处理一个请求,它由很多重要的部分构成。以下的内容是能从 request URI path获得的以及能通过request对象暴露的:
Context Path:这个路径前缀与 ServletContext 相关联。