HttpServletRequest 对象

概述

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)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注