JSP内置对象---request

来源:互联网 发布:sql导出数据库成excel 编辑:程序博客网 时间:2024/04/30 09:46

Request内置对象

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

对应接口:public interface HttpServletRequest extends ServletRequest。

可以看出,HttpServletRequest是ServletRequest的子接口,而ServletRequest只有一个子接口—HttpServletRequest。


    既然ServletRequest只有一个子接口HttpServletRequest,那么为什么不将两个接口合并成一个接口呢?

只能从长远来看,从长远上讲,现在使用的主要协议是HTTP协议,但是以后有可能出现更多的新的协议,例如:XXX,以后如果要想支持这种新的协议,则肯定直接继承ServletRequest接口即可。


    在HttpServletRequest接口中定义的方法很多,但是都是围绕接收客户端参数的。

既然已经说到客户端参数,那么下面再回顾一下。


乱码解决(重点)

    由于现在的request属于接收客户端的参数,所以必然有其默认的语言编码,之所以会这样,主要是由于浏览器的默认编码是UTF-8,而中文编码是GBK,这两种编码是不一样的,所以就造成了乱码。

要想解决这种乱码问题,就必须使用request提供的统一设置编码的方法。

设置请求编码:void setCharacterEncoding(String env)。 //设置的是统一编码。

【request_01.jsp的内容如下:】

<%@ page contentType="text/html" pageEncoding="GBK"%>

<html>

<head><title>request</title></head>

<body>

<%

    request.setCharacterEncoding("GBK");

    String content = request.getParameter("info");

%>

<h2><%=content%></h2>

</body>

</html>

【request_01.htm的内容如下:】

<html>

<head><title>Request</title></head>

<body>

<form action="request_01.jsp" method="post">

    请输入信息:<input type="text" name="info">

                <input type="submit" value="提交">

</form>

</body>

</html>

执行request_01.htm的结果如下所示:



以后只要是进行了传递,则肯定要使用这条语句进行乱码解决的。

如果这种乱码解决不了的话,还有第二种形式。

在以上的request_01.jsp中用如下片段:

String content = new String(request.getParameter("info").getBytes("ISO8859-1"));

代替:

request.setCharacterEncoding("GBK");

String content = request.getParameter("info");

会得到相同的结果。

 

2.接收参数(重点)

    使用getParameter()方法可以用于参数的接收,但是如果现在有这样一种情况。

现在如果表单传递的是一个复选框,则只能接收第一个选中的,如果要想都接收该怎么办? 之前说过,所谓的复选框实际上是一个数组,既然是一个数组,则肯定要同时接收一组数据。

此时就要使用如下的方法完成:String[] getParameterValues(String name)。

将原来的代码:

1):String inst = request.getParameter("inst");

替换为:

 String inst[] = request.getParameterValues("inst");

2):<h3>兴趣:<%=inst%></h3>

替换为:

     <h3>兴趣:

     <%

         for(int x=0;x<inst.length;x++){

     %>

           <%=inst[x]%>、

     <%

         }

     %>

此时,虽然可以进行了参数的接收,可是一个新的问题出现了,如果现在没有选中或者是没有输入会如何? 【会出现空指针错误,所以此时要判断inst是否为空!】

【request_02.htm的内容如下:】

<html>

<head><title>Request</title></head>

<body>

<form action="request_02.jsp" method="post">

    姓名:<input type="text" name="uname"></br>

    兴趣:<input type="checkbox" name="inst" 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="旅游">旅游

          <br><input type="hidden" name="id" value="3">

          <input type="submit" value="提交">

          <input type="reset" value="重置">

</form>

</body>

</html>

【request_02.jsp的内容如下:】

<%@ page contentType="text/html" pageEncoding="GBK"%>

<html>

<head><title>request</title></head>

<body>

<%

    request.setCharacterEncoding("GBK");  //设置的是统一编码

    String id = request.getParameter("id");

    String name = request.getParameter("uname");

    String inst[] = request.getParameterValues("inst");

%>

<h3>编号:<%=id%></h3>

<h3>姓名: <%=name%></h3>

<h3>兴趣:

<%

if(inst != null){

    for(int x=0;x<inst.length;x++){

%>

        <%=inst[x]%>、

<%

    }

}

%>

</body>

</html>

执行request_02.htm的内容,结果如下所示:


点击“提交”后,出现的结果如下:


但是,在此处有一点也特别需要注意的是,现在的参数是通过表单传递过来的,也就是说可以传递文本、密码、单选、复选,可是在这之上还有一种参数的传递方法,称为地址重写


URL地址重写

在WEB的开发中,所有的参数不一定非要由表单传递过来,也可以使用地址重写的方式进行传递,地址重写的格式如下:

动态页面地址?参数名称1=参数内容1&参数名称2=参数内容2&...


下面通过地址重写的方式完成参数的传递。

重新定义【request_03.jsp的内容如下:】

<%@ page contentType="text/html" pageEncoding="GBK"%>

<html>

<head><title>request</title></head>

<body>

<%

    request.setCharacterEncoding("GBK");  //设置的是统一编码

    String param1 = request.getParameter("name");

    String param2 = request.getParameter("password");

%>

<h3>编号:<%=param1%></h3>

<h3>姓名: <%=password%></h3>

</body>

</html>

此程序运行出来的结果如下:


通过在浏览器的地址栏输入:?name=skewrain&password=123,刷新后的结果如下:


 

表单的两种提交方式:get和post,这两种有什么区别呢?

1):post提交:提交后的地址栏不会附加目标地址的其他内容,是只能用在表单上的一种提交方式。

2):get提交:提交后的地址栏是会改变的,而且会使用地址重写的方式完成。既然所有的内容都要显示,则传递时,肯定受到地址栏长度的限制。

 

在request中还有一个方法很重要:

Enumeration getParameterName();

    此方法的名称上已经明确的说明了,现在返回的是所有参数的名字。本方法可以返回所有请求参数的名称,但是此方法返回值的类型是Enumeration,所以需要使用hasMoreElements()方法判断是否有内容以及使用nextElement()方法取出内容。

【request_04.htm的内容如下:】

<html>

<head><title>Request</title></head>

<body>

<form action="request_04.jsp" method="post">

    姓名:<input type="text" name="uname"><br>

    性别:<input type="radio" name="sex" value="男" CHECKED>男

          <input type="radio" name="sex" value="女">女<br>

    城市:<select name="city">

             <option value="北京">北京</option>

             <option value="天津">天津</option>

             <option value="深圳">深圳</option>

          </select><br>

    兴趣:<input type="checkbox" name="**inst" 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="旅游">旅游<br>

    自我介绍:<br><textarea cols="30" rows="3" name="note"></textarea><br>

          <input type="hidden" name="uid" value="1">

          <input type="submit" value="提交">

          <input type="reset" value="重置">

</form>

</body>

    </html>如果现在按照传统的方法接收参数就是所有的普通的参数使用getParameter()接收,而所有的数组内容肯定使用getParameterValues()接收。

    但是现在换一种方式,使用getParameterNames()接收。

    通过此方法取得参数名称之后,进一步的利用了getParameter()方法取得了每一个参数对应的内容,但是现在并不能处理复选框的内容。

【request_04.jsp的内容如下:】

<%@ page contentType="text/html" pageEncoding="GBK"%>

<%@ page import="java.util.*"%>

<html>

<head><title>Request</title></head>

<body>

<%

    request.setCharacterEncoding("GBK");  //设置的是统一编码

    Enumeration enu = request.getParameterNames();

%>

<table border="1">

    <tr>

    <td>参数名称</td>

<td>参数内容</td>

</tr>

<%

    while(enu.hasMoreElements()){

        String paramName = (String)enu.nextElement();

%>

        <tr>

           <td><%=paramName%></td>

           <td>

<%

         if(paramName.startsWith("**")){

              String paramValue[] = request.getParameterValues(paramName);

              for(int x=0;x<paramValue.length;x++){

%>

              <%=paramValue[x]%>、

<%    

              }

         }else{

              String paramValue = request.getParameter(paramName);

%>

              <%=paramValue%>

<%

            }

%>

            </td>

         </tr>

<%

     }

%>

</table>

</body>

</html>

执行request_04.htm的内容如下所示:


点击“提交”按钮后的结果如下:


此类的操作一般都是在表单不确定的时候使用,例如:购物车的功能实现。


显示全部的头信息

1.JAVA的WEB开发使用的是HTTP协议,主要的操作就是基于请求和回应,但是在请求和回应的同时也会包含一些其他的信息(例如:客户端的IP,Cookie,语言等),那么这些信息就称为头信息。

2.要想取得头信息的名称可以直接通过request内置对象的getHeaderNames(),而要想取出每一个头信息的内容,则需要使用getHeader()方法。

取得头信息的程序如下所示:【request_05.jsp的内容】

<%@ page contentType="text/html" pageEncoding="GBK"%>

<%@ page import="java.util.*"%>

<html>

<head><title>Request</title></head>

<body>

<%

    Enumeration enu = request.getHeaderNames();//取得全部的头信息

    while(enu.hasMoreElements()){

    String headerName = (String) enu.nextElement();

    String headerValue = request.getHeader(headerName);

%>

    <h3><%=headerName%> ---><%=headerValue%></h3>

<%

    }

%>

</table>

</body>

</html>

执行此段代码的结果如下所示:


但是对于头信息而言,本身理解即可,因为很少直接去操作头信息的。


Request的其他操作:

通过request对象可以取得客户端的IP地址,请求方式,访问的路径,上下文的名称等。

直接输入地址,属于get提交。


Request其他操作的代码式例:

<%@ page contentType="text/html" pageEncoding="GBK"%>

<%@ page import="java.util.*"%>

<html>

<head><title>Request对象的一些操作</title></head>

<body>

<%

    String method = request.getMethod();

    String ip = request.getRemoteAddr();

    String path = request.getServletPath();

    String contextPath = request.getContextPath();

%>

<h3>请求方式:<%=method%></h3>

<h3>IP地址:<%=ip%></h3>

<h3>访问路径:<%=path%></h3>

<h3>上下文名称:<%=contextPath%></h3>

</body>

</html>

执行此代码的输出结果如下:


    对于request中的getContextPath()方法是一个非常重要的操作,以后通过它,可以解决路径的跳转问题。

例如,以下代码可以用来输出一张图片:

<img src=”<%=request.getContextPath()%>/images/1024.jpg”>

等学习逐步深入的时候,此方法的作用就特别的明显了。


小结:

1.Request对象的主要功能是用于接收用户发来的请求信息。

2.接收参数的方法:getParameter(),getParameterValues(),getParameterNames()。

3.取得客户端IP地址可以使用getRemoteAddr()。

4.取得上下文名称可以使用getContextPath()。

5.头信息是指附加在请求上一起发送到服务器上的内容。

6.Request的属性操作。

如果要使用getAttribute()则之前一定会存在setAttribute的设置操作,否则无法取得。

如果使用getParameter()则表示接收参数,那么参数的来源有以下几种:

    1):表单提交;

    2):地址重写;

    3):通过<jsp:include>、<jsp:forward>传递而来的参数。

7.getParameter()是无法接收setAttribute()设置的内容的。

0 0
原创粉丝点击