
4.2 request对象
request对象主要用于接收客户端通过HTTP协议连接传输到服务器端的数据。在客户端的请求中如果有参数,则该对象就有一个参数列表,它通常是HttpServletRequest的子类,其作用域就是一次request请求。
4.2.1 request对象常用方法
request对象包括很多方法,它的主要方法及对应的说明如表4-2所示。
表4-2 request对象的主要方法

4.2.2 request对象应用实例
request对象包括很多方法,其中最主要的有getParameter(String name)、getParameterValues(String name)、getParameterNames()等方法,下面通过实例分别加以说明。
1. String getParameter(String name)
用表单和超链接、<jsp:param>传递参数的时候,使用getParameter(String name)接收传递的参数。
返回给定参数的值,当传递给此方法的参数名没有实际参数与之对应时,返回null。
使用getParameter(String name)取得的值都是字符串类型,需要转换为需要的类型。
【例4-1】request对象应用实例。在requestInfo.jsp页面中输入用户名和密码,在showInfo.jsp页面中将输入的用户名和密码显示出来。
requestInfo.jsp页面的代码如下:
<%@ page contentType="text/html; charset=GBK"%> <html> <head> <title>使用Request对象</title> </head> <body bgcolor="#ffc7c7"> <form name="form1" method="post" action="showInfo.jsp"> <p align="center">用户名:<input type="text" name="username"></p> <p align="center">密 码 :<input type="password" name="password"> </p> <p align="center"><input type="submit" name="Submit" value="提交"> <input name="cancel" type="reset" id="cancel" value="取消"> </p> </form> </body> </html>
showInfo.jsp页面的代码如下:

在这个实例中,requestInfo.jsp页面将表单中用户输入的信息提交给showInfo.jsp页面,showInfo.jsp页面利用getParameterNames()和getParameter(String name)这两个方法获取表单中传过来的参数名称和参数值。程序运行结果如图4-1和图4-2所示。

图4-1 requestInfo.jsp页面运行结果

图4-2 showInfo.jsp页面运行结果
通常客户端向服务器端提交数据的时候,有多种数据提交机制,最常用的就是get方法和post方法。get传送的数据量较小,不能大于2KB。get是把参数数据队列加到提交表单的action属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到;post传送的数据量较大,一般被默认为不受限制。post是通过http post机制,将表单内各个字段与其内容放置在html header内一起传送到action属性所指的URL地址,但用户看不到这个过程。这两种方式的参数都可以用request来获得。
本例中采用post来提交数据,有两种方法可以使客户端通过get方法来提交数据。
(1)如直接在浏览器中输入地址来获取JSP文件,则默认使用的提交方法是get方法:
http://localhost:8080/ch04/request/requestInfo.jsp
如果此时有数据传递给服务器,则可以采用以下方法:
http://localhost:8080/ch04/request/requestInfo.jsp?name1=value1$name2=value2...
从上面可以看到,通过get方法传递数据的时候,只要将需要传递的数值放在URL地址后面,之间通过?隔开。这种方法多用在超级链接中,当传递数据较少的时候,可以直接通过链接来传递数据。
(2)get方法提交表单数据。
如把【例4-1】requestInfo.jsp中的<form name="form1" method="post" action="showInfo.jsp">的post改为get,在输入数据提交的时候地址栏中显示http://localhost:8080/ch04/request/showInfo.jsp?username=majianhong&password=123&Submit=%CC%E1%BD%BB。其中,Submit后面的数据是该按钮的显示值,因为经过了编码,所以显示的是各种符号。从地址链接可以看到,通过get方法提交数据,会将所有数据都放在URL地址后面,当表单数据比较多的时候,会显得很难看。通过get方法提交,会将一些隐藏信息显示出来,比如密码password=123。
其实通过表单传递参数,采用getParameter(String name)接受传递参数的实例在第3章已经介绍过,如【例3-6】。
通过表单输入数据的代码如下:
<form action="dec-method.jsp" method="get" name="form"> <input type="text" name="radius"> <input type="submit" name="submit" value="开始计算"> </form>
通过
String str = request.getParameter("radius");
得到输入数据。
由于使用getParameter(String name)取得的值都是字符串类型,所以采用代码
double r; r = Double.parseDouble(str);
来转换数据类型。
由于在传递参数时,在表单中采用的方法method="get",此时运行如下程序会发现在地址栏中显示所输入的数据:
http://localhost:8080/ch04/Script/dec-method.jsp?radius=3
如果在页面中采用超级链接的方法,使用如下代码:
<a href="dec-method.jsp?radius=3">超级链接传递参数</a>
那么得到此超级链接所传递的参数,同样也可采用以下方法:
String str = request.getParameter("radius");
采用超级链接所传递的参数也是采用getParameter(String name)取得值。
通过<jsp:param>传递参数,同样使用getParameter(String name)接收传递的参数。
2. Enumeration getParameterNames()
返回值类型:枚举类型Enumeration。
得到客户端提交的所有参数的名称。
如【例4-1】中的通过循环可获取客户端提交的所有参数的名称:

3. void setCharacterEncoding(String chaen)
在form表单中采用post方式提交请求时,需要设置request对象的编码方式,保证能够正确地取到数据。例如:
<%request.setCharacterEncoding("gb2312");%>
关于解决汉字乱码问题将在6.5.2节介绍。
4. String [] getParameterValues(String name)
使用getParameterValues()能够取出变量的多个值,返回值类型为字符串数组String[]。
主要用于获取复选框的值或是下拉列表带multiple属性的值。
【例4-2】读取复选框数据。在hobby.html页面中选中多个选项,在hobbyInfo.jsp页面中将所选内容显示出来。
hobby.html页面的代码如下:

hobbyInfo.jsp页面的代码如下:

程序运行结果如图4-3和图4-4所示。

图4-3 hobby.html页面运行结果

图4-4 hobbyInfo.jsp页面运行结果
【例4-3】读取带multiple属性的下拉列表中的数据。在city.html页面中选中多个下拉列表选项,在cityInfo.jsp页面中将所选内容显示出来。
city.html页面的代码如下:

cityInfo.jsp页面的代码如下:

程序运行结果如图4-5和图4-6所示。

图4-5 city.html页面运行结果

图4-6 cityInfo.jsp页面运行结果
【例4-4】在request.jsp中利用request对象的一些方法,回显系统信息。
request.jsp页面的代码如下:

程序运行结果如图4-7所示。

图4-7 request.jsp回显系统信息