servlet2.3规范之四——请求

本文深入探讨了Servlet中的请求处理机制,包括HTTP协议参数、请求路径组成、Cookie处理、国际化支持等内容,为开发者提供了全面的理解。

4 请求

request对象封装了所有来自客户端请求的信息。在HTTP协议中,这些信息以HTTP header和请求消息体的形式从客户端发送至服务器。

4.1 HTTP协议参数

Servlet的请求参数是一些由客户端发送给servlet容器的字符串,它是请求的一部分。当请求是HttpServletRequest对象且满足后文列出的条件时,容器从URI query字符串和POST提交的数据中封装这些参数。

参数存储成一组名-值对,同一个参数名称可以存在多个参数值。ServletRequest接口的下列方法用于访问这些参数:

getParameter

getParameterNames

getParameterValues

getParameterValues方法返回一个String对象数组,包含和参数名关联的所有参数值。getParameter方法返回的值必须是getParameterValues返回的String对象数组的第一个值。

来自query字符串和post体的数据组成请求参数集。query字符串数据位于post体数据之前。比如,如果发出的请求由query字符串a=helloposta=goodbye&a=world组成,那么组成的参数集顺序为a=(hello, goodbye, world)

这些API不会暴露作为GET请求(由HTTP 1.1定义)一部分的path参数。必须通过getRequestURI或者getPathInfo方法返回的字符串值进行解析才能获得。

4.1.1 参数何时可用

post表单数据被封装至参数集之前,必须满足下列条件:

1. HTTP或者HTTPS请求

2. HTTP方法是POST

3. 内容类型为application/x-www-form-urlencoded

4. servlet调用了request对象的任意一个getParameter系列方法。

如果条件不满足,post的表单数据不被包含在参数集中,但post数据仍然可以通过request对象的输入流获得。如果条件满足,post的表单数据将不再可以直接从request对象的输入流中获得。

4.2 属性

属性是一些和请求关联的对象。属性可以由容器设置来表示API所不能表示的信息,或者由servlet设置来和另一个servlet通信(通过RequestDispatcher)。属性可以通过ServletRequest接口的以下方法访问:

getAttribute

getAttributeNames

setAttribute

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

,amed in accerse reverse domain 以“java.”和“javax.”为前缀的属性名称是本规范的保留定义。同样,以“sun.”和“com.sun.”为前缀的属性名称是Sun Microsystems公司的保留定义。建议属性集中的所有属性命名符合Java编程语言规范1中推荐的关于包命名的反向域名约定。

4.3 Header

servlet可以通过HttpServletRequest接口的下列方法访问HTTP 的请求header

getHeader

getHeaders

• getHeaderNames

getHeader方法返回指定名称的header。在HTTP请求中同一名称可以有多个header,比如Cache-Control header。如果有同一个名称的多个headergetHeader方法返回请求中的第一个headergetHeaders方法允许访问与指定header名称关联的所有header值,以String对象的Enumeration形式返回。

header可能包含intDate数据的字符串形式。HttpServletRequest接口的以下便捷方法提供了对这些格式header数据的访问:

getIntHeader

getDateHeader

如果getIntHeader方法不能将header值转换成int类型,抛出NumberFormatException异常。如果getDateHeader方法不能将header值转换成Date对象,抛出IllegalArgumentException异常。

4.4 请求路径组成

请求路径由许多重要部分组成。以下元素从请求URI路径中获得,并通过request对象暴露:

上下文路径(Context Path):servlet所在的ServletContext路径前缀。如果上下文是以web服务器URL命名空间的根为“default”上下文,那么该路径将是一个空字符串。否则,如果上下文不是以服务器命名空间的根为根,那么该路径以“/”开头,但不以“/”结束。

Servlet路径(Servlet Path):这部分直接对应于激活该请求的映射。以“/”开头,除非以“/*”形式来匹配请求,这种情况下为空字符串。

PathInfo这部分请求路径不是上下文路径或Servlet路径的一部分。如果没有附加的路径,它为null,否则也可以是一个“/”开头的字符串。

HttpServletRequest接口的下列方法用来访问这些信息:

getContextPath

getServletPath

• getPathInfo

要注意这一点,不考虑请求URI和路径部分之间的URL编码差异,下列等式将总是为true

requestURI = contextPath + servletPath + pathInfo

给出一些例子来明确上述观点:

1:上下文设置示例

上下文路径

/catalog

Servlet映射

Pattern: /lawn/*

Servlet: LawnServlet

Servlet映射

Pattern: /garden/*

Servlet: GardenServlet

Servlet映射

Pattern: *.jsp

Servlet: JSPServlet

行为如下:

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

4.5 路径转译方法

API中有两个便捷方法让开发人员获得指定路径对应的文件系统路径。这些方法是:

• ServletContext.getRealPath

HttpServletRequest.getPathTranslated

getRealPath方法接受一个String参数,返回路径对应的本地文件系统表示文件的String形式。getPathTranslated方法计算出请求pathInfo的真实路径。

有些情况,servlet容器不能为这些方法判断是否文件路径有效,比如web应用以war的形式运行,或者是本地不能访问的远程文件系统,或者位于数据库中,这些方法都会返回null

4.6 Cookie

HttpServletRequest接口提供getCookies方法获得请求中的cookie数组。cookie是一些在客户端每次请求中由客户端发送给服务器的数据。通常客户端cookie名和cookie值的形式发送回。当cookie被发送回浏览器时设置的一些其他cookie,比如注释,通常不会返回。

4.7 SSL属性

如果请求基于安全协议传输,比如HTTPS,这些信息必须通过ServletRequest接口的isSecure方法来暴露。Web容器必须将下列属性暴露给servlet程序员:

3:协议属性

属性

属性名

Java类型

cipher套件

javax.servlet.request.cipher_suite

String

算法的位大小

javax.servlet.request.key_size

Integer

如果请求和SSL认证关联,那么它必须由servlet容器以java.security.cert.X509Certificate类型的对象数组形式暴露给servlet程序员,通过javax.servlet.request.X509CertificateServletRequest属性访问。

数组中的顺序定义为按可信任度升序排列。链表中的第一个certificate由客户端设置,下一个用来对第一个进行认证,以此类推。

4.8 国际化

客户端可能向web服务器提出它们倾向接受哪种语言的响应。这些信息可以由客户端使用Accept-Language header进行通信,这和HTTP/1.1规范描述的其他机制一样。ServletRequest接口提供下列方法来确定发送者倾向的locale

getLocale

getLocales

getLocale方法返回客户端接收内容时倾向采取的locale。关于如何解释Accept-Language header以确定客户端倾向语言的更多信息,参见RFC 2616 HTTP/1.114.4节。

getLocales方法返回客户端可接受的localeLocale对象的Enumeration形式,它以locale的接受程度降序排列。

如果客户端未指定所倾向的localegetLocale方法必须返回servlet容器的默认localegetLocales方法必须包含一个默认localeLocale元素的Enumeration形式。

4.9 请求数据编码

目前,许多浏览器不会使用Content-Type header限定字符编码,而让客户端来决定读取HTTP请求时采取的字符编码。如果客户端请求中未指定,容器使用默认的“ISO-8859-1 编码来创建请求请求reader,解析POST数据。不过为了提示开发人员这种发送字符编码的错误,容器将让getCharacterEncoding方法返回null

如果客户端没有设置字符编码,并且请求数据的编码和上述描述的默认编码不一致,则可能会发生数据损坏。为了避免这种情况,ServletRequest增加了一个新方法,setCharacterEncoding(String enc)。开发人员可以通过调用该方法重新设定容器所支持的字符编码。它必须在解析post数据或者从请求读取输出之前调用。一旦数据已被读取,调用该方法不会影响编码。

4.10 Request对象的生命周期

每一个request对象只在servletservice方法作用域,或者filterdoFilter方法作用域内有效。容器通常循环request对象以避免request对象创建所引起的性能开销。开发人员必须认识到在上述的作用域之外对request对象进行引用可能会导致无法预期的后果。

1. Java编程语言规范http://java.sun.com/docs/books/jls

潮汐研究作为海洋科学的关键分支,融合了物理海洋学、地理信息系统及水利工程等多领域知识。TMD2.05.zip是一套基于MATLAB环境开发的潮汐专用分析工具集,为科研人员与工程实践者提供系统化的潮汐建模与计算支持。该工具箱通过模块化设计实现了两大核心功能: 在交互界面设计方面,工具箱构建了图形化操作环境,有效降低了非专业用户的操作门槛。通过预设参数输入模块(涵盖地理坐标、时间序列、测站数据等),用户可自主配置模型运行条件。界面集成数据加载、参数调整、可视化呈现及流程控制等标准化组件,将复杂的数值运算过程转化为可交互的操作流程。 在潮汐预测模块中,工具箱整合了谐波分解法与潮流要素解析法等数学模型。这些算法能够解构潮汐观测数据,识别关键影响要素(包括K1、O1、M2等核心分潮),并生成不同时间尺度的潮汐预报。基于这些模型,研究者可精准推算特定海域的潮位变化周期与振幅特征,为海洋工程建设、港湾规划设计及海洋生态研究提供定量依据。 该工具集在实践中的应用方向包括: - **潮汐动力解析**:通过多站点观测数据比对,揭示区域主导潮汐成分的时空分布规律 - **数值模型构建**:基于历史观测序列建立潮汐动力学模型,实现潮汐现象的数字化重构与预测 - **工程影响量化**:在海岸开发项目中评估人工构筑物对自然潮汐节律的扰动效应 - **极端事件模拟**:建立风暴潮与天文潮耦合模型,提升海洋灾害预警的时空精度 工具箱以"TMD"为主程序包,内含完整的函数库与示例脚本。用户部署后可通过MATLAB平台调用相关模块,参照技术文档完成全流程操作。这套工具集将专业计算能力与人性化操作界面有机结合,形成了从数据输入到成果输出的完整研究链条,显著提升了潮汐研究的工程适用性与科研效率。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值