5.2 request内置对象
request对象用来包含客户端提交的各种信息。当客户端请求一个JSP页面时,JSP引擎会将客户端的请求信息封装在这个request对象中,request对象调用相应的方法就可以获取对应的封装信息了。该对象中封装的请求信息主要包括以下3部分。
❑ 请求的HTTP协议的传送文件头信息。
❑ 提交请求的客户端和服务器端信息。
❑ 用户提交的表单信息。
表5.2中列举了request对象中常用的方法。
表5.2 request对象中常用方法
5.2.1 获取用户提交的表单信息
request对象最主要的一个作用就是用来封装用户提交的表单信息,然后通过如下的两个方法来获取用户提交的表单信息。
❑ getParameter(String name):根据参数名获取唯一的参数值。
❑ getParameterValues(String name):根据参数名获取参数数组。
【实例5-1】接收用户提交的信息。
01 <%@ page contentType="text/html;charset=GB2312" %> 02 <HTML> 03 <BODY > 04 <FORM action="getinfo.jsp" method=post name=form> 05 姓名:<INPUT type="text" name="name"> 06 <P>您熟悉的语言:</P> 07 <P> 08 <!--供选取语言类型的复选框--> 09 <INPUT type="checkbox" name=box value="JSP">JSP 10 <INPUT type="checkbox" name=box value="PHP">PHP 11 <INPUT type="checkbox" name=box value="ASP.NET">ASP.NET 12 </P> 13 <INPUT TYPE="submit" value="Enter" name="submit"> 14 </FORM> 15 </FONT> 16 </BODY> 17 </HTML>
【代码说明】在实例5-1页面的第9行定义了提交单个值参数的文本框,第10~11行定义了提交多个值参数的复选框。并通过第4行的<form>表单提交给getinfo.jsp页面。
【运行结果】在如图5.1所示页面中输入用户的姓名及用户所熟悉的语言。
getinfo.jsp页面的具体代码如下:
01 <%@ page contentType="text/html;charset=GB2312" %> 02 <HTML> 03 <BODY > 04 <%String textContent=request.getParameter("name"); //获取用户提交的姓名信息 05 %> 06 <BR> 07 <%=textContent%> 08 <P> 熟悉的语言是: 09 <% 10 String box[] = request.getParameterValues("box"); //获取用户提交的熟悉的语言信息 并进行遍历 11 for(int i = 0; i < box.length ; i++) 12 out.println("<LI>" + box[i] + "</LI>"); //显示用户提交的复选框的选项 内容 13 %> 14 <BR> 15 </FONT> 16 </BODY> 17 </HTML>
【代码说明】该页面的第4 行使用getParameter()方法获取单值的参数,无论用户提交的信息是什么类型的,该方法的返回值都将是String类型,而第10行的getParameterValues ()方法则用来获取多值的参数,该方法的返回值将是一个String类型的数组。
【运行结果】该页面接收用户提交的参数后将如图5.2所示。
图5.1 提交信息的页面
图5.2 接收用户提交的参数
5.2.2 获取服务器端和客户端信息
使用request对象还可以获取提交请求的客户端信息及接收请求的服务器端信息,这些获取信息的方法如下所示。
❑ getProtocol():获取客户端向服务器端传送数据所依据的协议名称。
❑ getContentLength():获取HTTP请求的长度。
❑ getMethod():获取客户端提交信息的方式,如POST或者GET。
❑ getServletPath():获取客户端提交信息页面的路径。
❑ getRemoteAddr():获取客户端的IP地址。
❑ getRemoteHost():获取客户端计算机的名称。
❑ getServerName() :获取服务器的名称。
❑ getServerPort():获取服务器的端口号。
【实例5-2】获取客户端和服务器的信息。
01 <%@ page contentType="text/html;charset=GB2312"%> 02 <HTML> 03 <BODY> 04 <Font size=2> <BR> 05 客户使用的协议是: 06 <% 07 String protocol=request.getProtocol(); //获取客户端使用的协议的版本信息 08 out.println(protocol); 09 %> <BR> 10 获取接受客户提交信息的页面: 11 <% 12 String path=request.getServletPath(); //获取客户端提交信息的页面路径 13 out.println(path); 14 %> <BR> 15 接受客户提交信息的长度: 16 <% 17 int length=request.getContentLength(); //获取客户端提交请求的信息的长度 18 out.println(length); 19 %> <BR> 20 客户提交信息的方式: 21 <% 22 String method=request.getMethod(); //获取客户端提交信息的方式 23 out.println(method); 24 %> <BR> 25 获取客户的IP地址: 26 <% 27 String IP=request.getRemoteAddr(); //获取客户端的IP地址 28 out.println(IP); 29 %> <BR> 30 获取客户机的名称: 31 <% 32 String clientName=request.getRemoteHost(); //获取客户端计算机的名称 33 out.println(clientName); 34 %> <BR> 35 获取服务器的名称: 36 <% 37 String serverName=request.getServerName(); //获取服务器的名称 38 out.println(serverName); 39 %> <BR> 40 获取服务器的端口号: 41 <% 42 int serverPort=request.getServerPort(); //获取服务器的端口号 43 out.println(serverPort); 44 %> <BR> 45 </Font> 46 </BODY> 47 </HTML>
【代码说明】该页面的第7行使用getProtocol()方法获取客户端使用的协议名称和版本,第12行使用getServletPath()方法获取接受客户提交信息页面的路径,第17行使用getContentLength()方法获取客户端提交信息的长度,第22 行使用getMethod()方法获取客户端提交请求的方式,第27 行使用getRemoteAddr()方法获取客户端的IP地址,第32行使用getRemoteHost()方法获取客户端计算机的名称,如果得不到计算机名称就将返回客户端计算机的IP地址,第37行使用getServerName()方法获取服务器的名称,如果得不到服务器名称就将返回服务器的IP地址,第42 行使用getServerPort()方法获取服务器的端口号。
图5.3 显示获取的客户端和服务器端信息
【运行结果】实例5-2的JSP页面的执行结果如图5.3所示。
5.2.3 获取HTTP协议的传送文件头信息
使用request对象还可以获取提交信息时所使用的HTTP协议的传送文件头信息。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求,请求的头信息包含请求的方法、URI、协议版本、包含请求修饰符、客户信息及内容类似于MIME的消息结构。通过如下两个方法可以获取HTTP协议中的头信息。
❑ getHeaders(String name):可以获取传送请求信息的HTTP协议中指定的头信息。
❑ getHeaderNames():可以返回所有传送文件头信息的名字。
【实例5-3】获取HTTP头信息。
01 <%@ page contentType="text/html;charset=GB2312"%> 02 <%@ page import="java.util.*"%> 03 <HTML> 04 <BODY> 05 <Font size=2> <BR> 06 获取HTTP头文件中User-Agent的值: 07 <% 08 String header1=request.getHeader("User-Agent"); //获取HTTP头信息 User-Agent的值 09 out.println(header1); 10 %> <BR> 11 获取HTTP头文件中accept的值: 12 <% 13 String header2=request.getHeader("accept"); //HTTP头信息User-Agent的值 14 out.println(header2); 15 %> <BR> 16 获取HTTP头文件中Host的值: 17 <% 18 String header3=request.getHeader("Host"); //获取HTTP头信息Host的值 19 out.println(header3); 20 %> <BR> 21 获取HTTP头文件中accept-encoding的值: 22 <% 23 String header4=request.getHeader("accept-encoding");//获取HTTP头信息 accept-encoding的值 24 out.println(header4); 25 %> <BR> 26 获取头名字的一个枚举: 27 <% //获取HTTP所有头信息的关键字,并使用枚举对象进行遍历 28 Enumeration enum_headed=request.getHeaderNames(); 29 while(enum_headed.hasMoreElements()) 30 {String s=(String)enum_headed.nextElement(); 31 out.println(s); 32 } 33 %> <BR> 34 获取头文件中指定头名字的全部值的一个枚举: 35 <% //获取HTTP头信息cookie的全部值,并使用枚举对象进行遍历 36 Enumeration enum_headedValues=request.getHeaders("cookie"); 37 while(enum_headedValues.hasMoreElements()) 38 {String s=(String)enum_headedValues.nextElement(); 39 out.println(s); 40 } 41 %> <BR> 42 </Font> 43 </BODY> 44 </HTML>
【代码说明】该页面的第8行、第13行、第18行、第23行分别调用getHeaders()方法根据不同的头信息关键字获取对应的头信息。第28 行调用getHeaderNames()方法获取包含全部头信息关键字的一个枚举对象,并使用第29~32 行的while循环对该枚举对象进行遍历。第36行获取“cookie”关键字所对应的头信息并将其封装成一个枚举对象,使用第37~40行的while循环对其进行遍历。
【运行结果】实例5-3的JSP页面的执行结果如图5.4所示。
图5.4 显示获取的HTTP头信息
5.2.4 request中保存和读取共享数据
request对象不仅能够封装请求信息,而且还可以保存和读取某一范围内的共享数据。其实request本身就代表了一个范围,这个范围包括了提交信息的页面和接收提交信息的页面。request对象中定义了一对方法getAttribute(String name)和setAttribute(String name,Object object),用来在request对象中读取和保存共享数据。
说明
保存的数据必须是Object的子类,也就是说必须是类的对象,Java中的基本数据类型不能够直接保存,必须封装成对应的封装类。
【实例5-4】保存和读取共享数据。
01 <%@ page contentType="text/html;charset=GB2312" %> 02 <HTML> 03 <BODY > 04 <% 05 request.setAttribute("name","sun"); //将共享信息存储在request对象中 06 %> 07 <jsp:forward page="readAttribute.jsp" /> 08 </FONT> 09 </BODY> 10 </HTML>
【代码说明】该页面的第5行使用setAttribute()方法将共享数据保存到request对象中,然后在第7行中使用<jsp:forward>动作指令转向readAttribute.jsp页面。
readAttribute.jsp页面的具体代码如下:
01 <%@ page contentType="text/html;charset=GB2312" %> 02 <HTML> 03 <BODY > 04 从request中读取的共享信息是: 05 <% 06 out.println(request.getAttribute("name")); //从request对象中获取共享信息并 显示 07 %> 08 </FONT> 09 </BODY> 10 </HTML>
【代码说明】该页面的第6行使用getAttribute()方法来获取存储在request中的共享数据。
【运行结果】在浏览器中输入访问saveAttribute.jsp页面的URL地址后,页面将转向readAttribute.jsp页面,并读取request对象中的共享数据并显示在页面上,最后运行结果如图5.5所示。
图5.5 读取并显示request对象中的共享数据
5.2.5 正确接收用户提交的中文信息
在实例5-1 中,如果用户在输入姓名的文本框中输入中文字符,那么提交后的页面将显示什么内容呢?读者可以自己执行一下,看看是否显示如图5.6所示的乱码信息。
为什么会出现这种情况呢?这是因为JSP页面默认的接收字符集是英文,这里不要跟<%@ page contentType="text/html;charset=GB2312" %>指令中的“charset”属性混淆了,该属性是用来设置返回给浏览器的页面中所采用的字符集的,与接收提交信息的字符集没有任何关系。因此,要正确接收用户提交的中文信息,必须重新设置页面的接收字符集,通过调用request对象的setCharacterEncoding(String character)方法就可以实现该功能。下面修改实例5-1中的getinfo.jsp页面的代码如下:
01 <%@ page contentType="text/html;charset=GB2312" %> 02 <HTML> 03 <BODY > 04 <% 05 request.setCharacterEncoding("GB2312"); //设置接受信息时使用GB2312字符集 06 String textContent=request.getParameter("name"); //获取用户提交的姓名信息,可接收中 文输入 07 %> 08 <BR> 09 <%=textContent%> 10 <P> 熟悉的语言是: 11 <% 12 //获取并遍历显示提交的复选框的信息 13 String box[]=request.getParameterValues("box"); 14 for(int i=0; i<box.length ; i++) 15 out.println("<LI>" + box[i] + "</LI>"); 16 %> 17 <BR> 18 </FONT> 19 </BODY> 20 </HTML>
在该页面中的第5 行调用setCharacterEncoding()方法来设置页面的接收字符集为中文字符集,这里需要注意的是,该方法必须在页面中所有的接收参数的方法执行之前被调用。修改后的页面就可以正确接收用户提交的中文信息了。修改后页面的执行结果如图5.7所示。
图5.6 乱码显示用户输入的中文信息
图5.7 正确显示用户提交的中文信息