在jsp内置对象【02】中我们简单的学习了page、request、session、application四种对象的属性范围。那么从这篇文章开始我们共同来具体学习request、response、session和application的用法。先从request讲起

 request内置对象介绍
   request内置对象时使用最多的一个对象了,其主要作用是用来接收客户端发送而来的请求信息,例如:请求的参数、发送的头信息等都属于客户端发来的信息,request是javax.servlet.HttpServletRequest接口的实例化对象,表示此对象主要是应用在HTTP协议上

  从java Servlet API中,我们可以发现HttpServletRequest接口的定义
   从文档中可以发现,HttpServletRequest是ServletRequest的子接口,而ServletRequest只有一个子接口----HttpServletRequest
    既然ServletRequest只有一个子接口HttpServletRequest,那么为什么不将两个接口合并一个接口呢?
   只能从长远来看,从长远来看,现在使用的主要协议是HTTP协议,但是以后有可能出现更多的心的协议,例如:XXX ,以后如果要想支持这种新的协议,则肯定直接继承ServletRequest接口即可。
 request内置对象常用操作

jsp内置对象【03】request对象详解【01】_request详解  内置对象 getP

 接下来我们一起看一下request几个常用方法的
接受参数问题 
     我们都知道request的招牌是接受参数,招牌方法是getParameter();但是如果现在又这样一个程序(如下),我们看一下会出现什么结果。
  1. Request_03.jsp  
  2.   <%@ page language="java" contentType="text/html" pageEncoding="gbk" %>  
  3.   <html>  
  4.   <head>  
  5.   <title>web开发</title>  
  6.   </head>  
  7.   <body>  
  8.   <form action="request_04.jsp" method="post">  
  9.     姓名:<input type="text" name="uname"><br>  
  10.     兴趣:<input type="checkbox" name="inst" value="唱歌">唱歌  
  11.        <input type="checkbox" name="inst" value="跳舞">跳舞  
  12.        <input type="checkbox" name="inst" value="游泳">游泳  
  13.        <input type="checkbox" name="inst" value="看书">看书  
  14.        <input type="checkbox" name="inst" value="旅游">旅游  
  15.        <br>  
  16.        <input type="hidden" name="id" value="3">    
  17.        <input type="submit" value="提交">  
  18.        <input type="reset" value="重置">     
  19.   </form>  
  20.   </body>  
  21.   </html>  
  22.     
  23.   Request_04.jsp  
  24.   <%@ page language="java" contentType="text/html" pageEncoding="gbk" %>  
  25.   <html>  
  26.   <head>  
  27.   <title>web开发</title>  
  28.   </head>  
  29.   <body>  
  30.   <%  
  31.       request.setCharacterEncoding("gbk");  
  32.       String id=request.getParameter("id");  
  33.       String name=request.getParameter("uname");  
  34.       String inst=request.getParameter("inst");  
  35.   %>  
  36.   <h2>编号:<%=id%></h2>  
  37.   <h2>姓名:<%=name%></h2>  
  38.   <h2>兴趣:<%=inst%></h2>  
  39.   </body>  
  40.   </html>  
     运行一下,在兴趣上选择多个兴趣,但是显示的时候只是显示了我选中的第一个兴趣,其他的兴趣就不显示了。这是怎么回事。
     其实,这个兴趣的传递是个复选框的操作,复选框属于数组,那么我们接受的时候就得换一下接受方式了。
      在request中有个方法:    
 String[] getParameterValues(String name) 
 将request_04.jsp页面改成如下:
 
  1. <%@ page language="java" contentType="text/html" pageEncoding="gbk" %>  
  2.    <html>  
  3.    <head>  
  4.    <title>web开发</title>  
  5.    </head>  
  6.    <body>  
  7.    <%  
  8.        request.setCharacterEncoding("gbk");  
  9.        String id=request.getParameter("id");  
  10.        String name=request.getParameter("uname");  
  11.        String inst[]=request.getParameterValues("inst");  
  12.    %>  
  13.    <h2>编号:<%=id%></h2>  
  14.    <h2>姓名:<%=name%></h2>  
  15.    <h2>兴趣:  
  16.    <%  
  17.        for(int x=0;x<inst.length;x++){  
  18.    %>  
  19.        <%=inst[x]%>、  
  20.    <%  
  21.    }  
  22.    %>  
  23.    </h2>  
  24.    </body>  
  25.    </html>  
 这样就可以显示我们选中的多个兴趣了。上述程序灰色部分就是对数组接受参数的操作。
  这儿注意一个问题,希望大家能了解。上述程序是通过表单传递过来的,然后在接受页接受参数,但是还有一种参数传递的方法,就是地址重写,地址重写只有接受页,参数的设定在运行的时候设定。看下面的一个例子:
 
  1. request_05.jsp  
  2.   <%@ page language="java" contentType="text/html" pageEncoding="gbk" %>  
  3.    <html>  
  4.    <head>  
  5.    <title>web开发</title>  
  6.    </head>  
  7.    <body>  
  8.    <%  
  9.        request.setCharacterEncoding("gbk");  
  10.         String name=request.getParameter("name");  
  11.         String password=request.getParameter("password");  
  12.    %>  
  13.    <h2>姓名:<%=name%></h2>  
  14.    <h2>密码:<%=password%></h2>  
  15.    </body>  
  16.    </html>  
 这儿注意,运行的时候,我们要在地址栏中写:(假设我的项目名称是test51cto,页面放在了jsp文件夹中)
 http://localhost:8080/test51cto/jsp/request_03.jsp?name=hello&password=123
 运行一下可以发现依然能显示接受的参数,名字和密码正式我们在地址栏中写入的name和password的值。
    学习到这个地方,不得不学习一个重要的只是点,关于表单提交方式:get和post.
    在学习表单的时候,大家还有印象吧,<form name="" action="" method="post/get"></form>,在这儿,表单的提交方式有两种,他们的区别是什么呢?
    post提交:提交后的地址栏改变,但是不会附加目标地址的其他内容
    get提交:提交后 地址栏发生改变,而且会使用地址栏重写的方式完成,既然所有的内容都要显示,则传递时,肯定受到地址栏长度的限制。
 在接受参数的方法中还有一个重要的方法:Enumeration getParameterNames()
  这个方法可以返回所有的参数,而不需要一个一个接受了。看一下一个实例如下:
 
  1. request_06.jsp  
  2.  <%@ page language="java" contentType="text/html" pageEncoding="gbk" %>  
  3.   <html>  
  4.   <head>  
  5.   <title>web开发</title>  
  6.   </head>  
  7.   <body>  
  8.   <form action="request_05.jsp" method="get">  
  9.   姓名:<input type="text" name="uname"><br>  
  10.   性别:<input type="radio" name="sex" value="男" CHECKED>男  
  11.         <input type="radio" name="sex" value="女">女  
  12.          <br>  
  13.   城市:<select name="city">  
  14.               <option value="北京">北京</option>  
  15.   <option value="滨州">滨州</option>  
  16.   <option value="沂水">沂水</option>  
  17.         </select><br>  
  18.   自我介绍:<textarea cols="30" rows="3" name="note">  
  19.             </textarea><br>  
  20.     兴趣:<input type="checkbox" name="inst" value="唱歌">唱歌  
  21.        <input type="checkbox" name="inst" value="跳舞">跳舞  
  22.        <input type="checkbox" name="inst" value="游泳">游泳  
  23.        <input type="checkbox" name="inst" value="看书">看书  
  24.        <input type="checkbox" name="inst" value="旅游">旅游  
  25.        <br>  
  26.        <input type="hidden" name="id" value="1">    
  27.        <input type="submit" value="提交">  
  28.        <input type="reset" value="重置">     
  29.   </form>  
  30.   </body>  
  31.   </html>  
  32.    
  33.  request_07.jsp  
  34.  <%@ page language="java" contentType="text/html" pageEncoding="gbk" %>  
  35.   <%@ page import="java.util.*" %>  
  36.   <html>  
  37.   <head>  
  38.   <title>web开发</title>  
  39.   </head>  
  40.   <body>  
  41.   <%  
  42.       request.setCharacterEncoding("gbk");  
  43.       Enumeration enu=request.getParameterNames();  //接受参数 
  44.   %>  
  45.   <table border="1">  
  46.       <tr>  
  47.            <td>参数名称</td>  
  48.            <td>参数内容</td>   
  49.       </tr>  
  50.   <%  
  51.      while(enu.hasMoreElements()){  
  52.           String paramName=(String) enu.nextElement(); //遍历的方式,类似迭代遍历 
  53.   %>  
  54.          <tr>  
  55.            <td><%=paramName%></td>  
  56.            <td><%=request.getParameter(paramName)%></td>         
  57.         </tr>    
  58.   <%  
  59.        }  
  60.   %>  
  61.   </table>  
  62.   </body>  
  63.   </html>  
 这样做的运行一下后可以发现的确可以接受所有的参数,但是这个地方有一个问题,不能处理复选框的内容了,又出现了兴趣只能是一个的问题了。我们要修改一下:
 将request_06.jsp改成如下:
 
  1. <%@ page language="java" contentType="text/html" pageEncoding="gbk" %>  
  2.    <html>  
  3.    <head>  
  4.    <title>web开发</title>  
  5.    </head>  
  6.    <body>  
  7.    <form action="request_05.jsp" method="post">  
  8.    姓名:<input type="text" name="uname"><br>  
  9.    性别:<input type="radio" name="sex" value="男" CHECKED>男  
  10.          <input type="radio" name="sex" value="女">女  
  11.          <br>  
  12.    城市:<select name="city">  
  13.                <option value="北京">北京</option>  
  14.    <option value="滨州">滨州</option>  
  15.    <option value="沂水">沂水</option>  
  16.          </select><br>  
  17.    自我介绍:<textarea cols="30" rows="3" name="note">  
  18.              </textarea><br>  
  19.      兴趣:<input type="checkbox" name="**inst" value="唱歌">唱歌  
  20.         <input type="checkbox" name="**inst" value="跳舞">跳舞       //将inst之前都加上两个**作为标致 
  21.         <input type="checkbox" name="**inst" value="游泳">游泳  
  22.         <input type="checkbox" name="**inst" value="看书">看书  
  23.         <input type="checkbox" name="**inst" value="旅游">旅游  
  24.         <br>  
  25.         <input type="hidden" name="id" value="1">    
  26.         <input type="submit" value="提交">  
  27.         <input type="reset" value="重置">     
  28.     </form>  
  29.    </body>  
  30.    </html> 
 
 将request_07.jsp改成如下:
 
  1. <%@ page language="java" contentType="text/html" pageEncoding="gbk" %>  
  2.    <%@ page import="java.util.*" %>  
  3.    <html>  
  4.    <head>  
  5.    <title>web开发</title>  
  6.    </head>  
  7.    <body>  
  8.    <%  
  9.        request.setCharacterEncoding("gbk");  
  10.        Enumeration enu=request.getParameterNames();  
  11.    %>  
  12.    <table border="1">  
  13.        <tr>  
  14.             <td>参数名称</td>  
  15.             <td>参数内容</td>   
  16.        </tr>  
  17.    <%  
  18.       while(enu.hasMoreElements()){  
  19.            String paramName=(String) enu.nextElement();  
  20.    %>  
  21.           <tr>  
  22.             <td><%=paramName%></td>  
  23.             <td> 
  24.     
  25.   //对复选框的操作 
  26.    <%  
  27.       if(paramName.startsWith("**")){  
  28.            String paramValue[]=request.getParameterValues(paramName);  
  29.            for(int x=0;x<paramValue.length;x++){  
  30.    %>  
  31.             <%=paramValue[x]%>、  
  32.    <%  
  33.            }  
  34.      
  35.       }else{  
  36.          String paramValue=request.getParameter(paramName);  
  37.    %>  
  38.        <%=paramValue%>  
  39.    <%  
  40.    }  
  41.    %>    
  42.             </td>        
  43.          </tr>    
  44.    <%  
  45.         }  
  46.    %>  
  47.    </table>  
  48.    </body>  
  49.    </html>  
 运行一下可以发现,程序已经很完美了。注意,这种操作一般都是在表单不确定的情况下使用,如购物车系统。
 关于request的方法还有很多,我们会在下一篇request详解【02】中学习。大家要注意讲解中的代码里面的方法的作用