概述
HttpServletRequest 对象代表客户端的请求,当客户端通过 HTTP 协议访问服务器时,HTTP 请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。
获得客户机信息
| 方法 | 说明 |
|---|---|
getRequestURL() | 返回客户端发出请求时的完整 URL |
getRequestURI() | 返回请求行中的资源名部分 |
getQueryString() | 返回请求行中的参数部分 |
getPathInfo() | 返回请求 URL 中的额外路径信息(位于 Servlet 路径之后和查询参数之前,以 / 开头) |
getRemoteAddr() | 返回发出请求的客户机的 IP 地址 |
getRemoteHost() | 返回发出请求的客户机的完整主机名 |
getRemotePort() | 返回客户机所使用的网络端口号 |
getLocalAddr() | 返回 WEB 服务器的 IP 地址 |
getLocalName() | 返回 WEB 服务器的主机名 |
获得客户机请求头
| 方法 | 返回类型 | 说明 |
|---|---|---|
getHeader(String name) | String | 获取指定请求头的值 |
getHeaders(String name) | Enumeration | 获取指定请求头的所有值 |
getHeaderNames() | Enumeration | 获取所有请求头的名称 |
示例:
String value = request.getHeader("Accept-Encoding"); // 获取Accept-Encoding请求头对应的值Code language: JavaScript (javascript)
获得客户机请求参数(客户端提交的数据)
| 方法 | 说明 |
|---|---|
getParameter(String) | 获取指定名称的参数值(常用) |
getParameterValues(String name) | 获取指定名称的所有参数值,返回字符串数组(常用) |
getParameterNames() | 获取所有参数名称(不常用) |
getParameterMap() | 获取所有参数的 Map(编写框架时常用) |
表单示例与参数接收
HTML 表单代码:
<form action="/register" method="post">
<!-- 输入文本框,SIZE表示显示长度,maxlength表示最多输入长度 -->
编号(文本框):
<input type="text" name="userid" value="NO." size="2" maxlength="2"><br>
<!-- 输入文本框,通过value指定其显示的默认值 -->
用户名(文本框):<input type="text" name="username" value="请输入用户名"><br>
<!-- 密码框,其中所有输入的内容都以密文的形式显示 -->
密码(密码框):
<input type="password" name="userpass" value="请输入密码"><br>
<!-- 单选按钮,通过checked指定默认选中,名称必须一样,其中value为真正需要的内容 -->
性别(单选框):
<input type="radio" name="sex" value="男" checked>男
<input type="radio" name="sex" value="女">女<br>
<!-- 下拉列表框,通过<option>元素指定下拉的选项 -->
部门(下拉框):
<select name="dept">
<option value="技术部">技术部</option>
<option value="销售部" SELECTED>销售部</option>
<option value="财务部">财务部</option>
</select><br>
<!-- 复选框,可以同时选择多个选项,名称必须一样,其中value为真正需要的内容 -->
兴趣(复选框):
<input type="checkbox" name="inst" value="唱歌">唱歌
<input type="checkbox" name="inst" value="游泳">游泳
<input type="checkbox" name="inst" value="跳舞">跳舞
<input type="checkbox" name="inst" value="编程" checked>编程
<input type="checkbox" name="inst" value="上网">上网
<br>
<!-- 大文本输入框,宽度为34列,高度为5行 -->
说明(文本域):
<textarea name="note" cols="34" rows="5">
</textarea>
<br>
<!-- 隐藏域,在页面上无法看到,专门用来传递参数或者保存参数 -->
<input type="hidden" name="hiddenField" value="hiddenvalue"/>
<!-- 提交表单按钮,当点击提交后,所有填写的表单内容都会被传输到服务器端 -->
<input type="submit" value="提交(提交按钮)">
<!-- 重置表单按钮,当点击重置后,所有表单恢复原始显示内容 -->
<input type="reset" value="重置(重置按钮)">
</form>Code language: HTML, XML (xml)
在 Servlet 中接收参数:
String userid = request.getParameter("userid"); // 获取填写的编号
String username = request.getParameter("username"); // 获取填写的用户名
String userpass = request.getParameter("userpass"); // 获取填写的密码
String sex = request.getParameter("sex"); // 获取选中的性别
String dept = request.getParameter("dept"); // 获取选中的部门
// 获取选中的兴趣,因为可以选中多个值,所以获取到的值是一个字符串数组
String[] insts = request.getParameterValues("inst");
String note = request.getParameter("note"); // 获取填写的说明信息
String hiddenField = request.getParameter("hiddenField"); // 获取隐藏域的内容Code language: JavaScript (javascript)
使用 getParameterNames 方法接收所有表单参数:
Enumeration<String> paramNames = request.getParameterNames(); // 获取所有的参数名
while (paramNames.hasMoreElements()) {
String name = paramNames.nextElement(); // 得到参数名
String value = request.getParameter(name); // 通过参数名获取对应的值
System.out.println(MessageFormat.format("{0}={1}", name, value));
}Code language: JavaScript (javascript)
中文乱码问题
POST 方式提交
客户端以 UTF-8 编码传输数据到服务器端,需要设置服务器端以 UTF-8 编码进行接收:
request.setCharacterEncoding("UTF-8");
String userName = request.getParameter("userName");Code language: JavaScript (javascript)
GET 方式提交
对于 GET 方式传输的数据,request.setCharacterEncoding() 设置无效,默认仍使用 ISO-8859-1 编码接收。需手动转换:
String name = request.getParameter("name"); // 接收数据
name = new String(name.getBytes("ISO8859-1"), "UTF-8"); // 先获取ISO8859-1原始字节,再以UTF-8构建字符串Code language: JavaScript (javascript)
doPost 中接收表单参数示例
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String userid = request.getParameter("userid");
String username = request.getParameter("username");
String userpass = request.getParameter("userpass");
String sex = request.getParameter("sex");
String dept = request.getParameter("dept");
String[] insts = request.getParameterValues("inst");
String note = request.getParameter("note");
String hiddenField = request.getParameter("hiddenField");
response.getWriter().append(username);
}Code language: JavaScript (javascript)
Previous: HttpServletResponse的一些常见应用
Next: Servlet之间的参数传递