购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.2 请求

请求对象封装了客户端请求的所有信息。在HTTP协议中,这些信息包含在从客户端发送到服务器请求的HTTP头部和消息体中。

2.2.1 HTTP协议参数

Servlet请求参数以字符串的形式作为请求的一部分,从客户端发送到Servlet容器。当请求是一个HttpServletRequest对象,且符合“参数可用时”描述的条件时,容器从URI查询字符串和POST数据中填充参数。参数以一系列的名-值对(name-value)的形式保存。任何给定的参数名称可存在多个参数值。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组成,得到的参数集合顺序将是a=(hello, goodbye, world)。

这些API不会暴露GET请求(HTTP 1.1所定义的)的路径参数。路径参数必须从getRequestURI方法或getPathInfo方法返回的字符串值中解析。

将POST数据填充到参数集(Paramter Set)必须满足4个条件:第一,该请求是一个HTTP或HTTPS请求;第二,HTTP方法是POST;第三,内容类型是application/x-www-form-urlencoded;第四,该Servlet已经对请求对象的任意getParameter方法进行了初始调用。如果不满足这些条件,且参数集中不包括POST数据,那么Servlet必须通过请求对象的输入流得到POST数据。如果满足这些条件,那么从请求对象的输入流中直接读取POST数据将不再有效。

2.2.2 属性

属性是与请求相关联的对象。属性可以由容器设置来表达信息,或者由Servlet设置将信息传达给另一个Servlet(通过RequestDispatcher)。属性通过ServletRequest接口的以下方法来访问。

·getAttribute

·getAttributeNames

·setAttribute

一个属性名称只能关联一个属性值。

前缀以“java.”“javax.”开头的属性名称是Java规范的保留定义;前缀以“sun.”“com.sun.”“oracle”“com.oracle”开头的属性名称是Oracle公司的保留定义。

2.2.3 请求头

通过以下HttpServletRequest接口方法,Servlet可以访问HTTP请求的头信息。

·getHeader

·getHeaders

·getHeaderNames

getHeader方法返回给定头名称的头。多个头可以具有相同的名称,如HTTP请求中的Cache-Control头。如果多个头的名称相同,getHeader方法返回请求中的第一个头。getHeaders方法允许访问所有与特定头名称相关的头值,返回一个String对象的Enumeration(枚举)。

头可包含String形式的int或Date数据。HttpServletRequest接口提供以下方法访问这些类型的头数据。

·getIntHeader

·getDateHeader

如果getIntHeader方法不能转换为int的头值,则抛出NumberFormatException异常。如果getDateHeader方法不能把头转换成一个Date对象,则抛出IllegalArgumentException异常。

2.2.4 请求路径元素

引导Servlet服务请求的路径由许多重要部分组成:

下面分别进行说明。

(1)Context Path:与ServletContext相关联的路径前缀是这个Servlet的一部分。如果这个上下文是基于Web服务器的URL命名空间的“默认”上下文,那么这个路径将是一个空字符串。如果上下文不是基于服务器的命名空间,那么这个路径就会以“/”字符开始,但不以“/”字符结束。

(2)Servlet Path:路径部分直接与激活请求的映射对应。这个路径以“/”字符开头,如果请求与“/*”或“”(空字符串)模式匹配,它将是一个空字符串。

(3)PathInfo:请求路径的一部分,不属于Context Path或Servlet Path。如果没有额外的路径,它要么是null,要么是以“/”开头的字符串。

使用HttpServletRequest接口中的以下方法来访问这些信息。

·getContextPath

·getServletPath

·getPathInfo

表2-1所示为请求路径元素的使用例子。

表2-1 请求路径示例

2.2.5 路径转换方法

在Servlet API中有两个简便的方法,允许开发者获得与某个特定路径等价的文件系统路径。具体如下。

·ServletContext.getRealPath

·HttpServletRequest.getPathTranslated

getRealPath方法需要一个String参数,并返回一个String形式的路径,这个路径对应一个在本地文件系统上的文件。getPathTranslated方法推断出请求的PathInfo的实际路径。

这些方法在Servlet容器无法确定一个有效文件路径的情况下必须返回null,如Web应用程序不能访问远程文件系统。jar文件中META-INF/resources目录下的资源,只有当调用getRealPath方法时,才认为容器已经从包含这些资源的jar文件中解压,在这种情况下,必须返回解压缩后的位置。

2.2.6 请求数据编码

目前,许多浏览器并不随着Content-Type头一起发送字符编码限定符,而是读取HTTP请求来确定字符编码。如果客户端没有指定请求默认的字符编码,容器用来创建请求读取器和解析POST数据的编码必须是“ISO-8859-1”。在客户端没有指定请求默认的字符编码的情况下,客户端发送字符编码失败,容器从getCharacterEncoding方法返回null。

如果客户端没有设置字符编码,并使用不同的编码来请求数据,而不是使用上面描述的默认字符编码,那么可能会发生问题。为了避免这种情况,开发人员可以通过以下方法来覆盖由容器提供的字符编码。

(1)*ServletContext提供的setRequestCharacterEncoding(String enc)。

(2)web.xml提供的元素。

(3)ServletRequest接口提供的setCharacterEncoding(String enc)。

必须在解析任何POST数据或从请求中读取任何输入之前调用上述方法。调用上述方法不会影响已经读取的数据编码。 kbc2mqY6ISMlJqZ/bvEUst+Yn5qygVG/qT9hTjGOKBpQKEDwMmIDqB+NSA1qBGok

点击中间区域
呼出菜单
上一章
目录
下一章
×