从零开始学Java Web开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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 正确显示用户提交的中文信息