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)前必须满足的条件:

  1. 该请求是一个 HTTP 或 HTTPS 请求。
  2. HTTP 方法是 POST。
  3. 内容类型是 application/x-www-form-urlencoded。
  4. 该 servlet 已经对请求对象的任意 getParameter 方法进行了初始调用。

如果不满足这些条件,而且参数集中不包括 post 表单数据,那么 servlet 必须可以通过请求对象的输入流得到 post 数据。如果满足这些条件,那么从请求对象的输入流中直接读取 post 数据将不再有效。