Java Web从入门到精通(第2版)
上QQ阅读APP看书,第一时间看更新

6.2 request对象

视频讲解:光盘\TM\lx\6\02 request对象.mp4

request对象封装了由客户端生成的HTTP请求的所有细节,主要包括HTTP头信息、系统信息、请求方式和请求参数等。通过request对象提供的相应方法可以处理客户端浏览器提交的HTTP请求中的各项参数。

6.2.1 访问请求参数

我们知道request对象用于处理HTTP请求中的各项参数。在这些参数中,最常用的就是获取访问请求参数。当通过超链接的形式发送请求时,可以为该请求传递参数,这可以通过在超链接的后面加上“? ”来实现。注意这个问号为英文半角的符号。例如,发送一个请求到delete.jsp页面,并传递一个名称为id的参数,可以通过以下超链接实现。

【例6.1】在页面中定义超链接,代码如下:

        <a href="delete.jsp? id=1">删除</a>

说明

例6.1中设置了一个请求参数,如果要同时指定多个参数,各参数间使用与符号“&”分隔即可。

【例6.2】在delete.jsp页面中,可以通过request对象的getParameter()方法获取传递的参数值。具体代码如下:

        <%
        request.getParameter("id");
        %>

说明

在使用request的getParameter()方法获取传递的参数值时,如果指定的参数不存在,将返回null;如果指定了参数名,但未指定参数值,将返回空的字符串("")。

【例6.3】使用request对象获取请求参数值。(实例位置:光盘\TM\sl\6\1)

(1)创建index.jsp文件,在该文件中添加一个用于链接到deal.jsp页面的超链接,并传递两个参数。index.jsp文件的具体代码如下:

        <%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="utf-8"%>
        <html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset= utf-8">
        <title>使用request对象获取请求参数值</title>
        </head>
        <body>
        <a href="deal.jsp? id=1&user=">处理页</a>
        </body>
        </html>

(2)创建deal.jsp文件,在该文件中通过request对象的getParameter()方法获取请求参数id、user和pwd的值并输出。deal.jsp文件的具体代码如下:

        <%@ page language="java" contentType="text/html; charset= utf-8" pageEncoding=" utf-8"%>
        <%
            String id=request.getParameter("id");         //获取id参数的值
            String user=request.getParameter("user");     //获取user参数的值
            String pwd=request.getParameter("pwd");       //获取pwd参数的值
        %>
        <html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset= utf-8">
        <title>处理页</title>
        </head>
        <body>
        id参数的值为:<%=id%><br>
        user参数的值为:<%=user%><br>
        pwd参数的值为:<%=pwd%>
        </body>
        </html>

图6.1 在页面中获取请求参数

运行本实例,首先进入到index.jsp页面,单击“处理页”超链接,将进入到处理页获取请求参数并输出,如图6.1所示。

6.2.2 在作用域中管理属性

在进行请求转发时,需要把一些数据传递到转发后的页面进行处理。这时,就需要使用request对象的setAttribute()方法将数据保存到request范围内的变量中。

request对象的setAttribute()方法的语法格式如下:

        request.setAttribute(String name, Object object);

参数说明:

name:表示变量名,为String类型,在转发后的页面取数据时,就是通过这个变量名来获取数据的。

object:用于指定需要在request范围内传递的数据,为Object类型。

在将数据保存到request范围内的变量中后,可以通过request对象的getAttribute()方法获取该变量的值,具体的语法格式如下:

        request.getAttribute(String name);

参数说明:

name:表示变量名,该变量名在request范围内有效。

【例6.4】使用request对象的setAttribute()方法保存request范围内的变量,并应用request对象的getAttribute()方法读取request范围内的变量。(实例位置:光盘\TM\sl\6\2)

(1)创建index.jsp文件,在该文件中,首先应用Java的try...catch语句捕获页面中的异常信息,如果没有异常,则将运行结果保存到request范围内的变量中;如果出现异常,则将错误提示信息保存到request范围内的变量中,然后应用<jsp:forward>动作指令将页面转发到deal.jsp页面。index.jsp文件的具体代码如下:

        <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
        <html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Insert title here</title>
        </head>
        <body>
        <%
        try{                                                               //捕获异常信息
            int money=100;
            int number=0;
            request.setAttribute("result", money/number);                  //保存执行结果
            }catch(Exception e){
            request.setAttribute("result", "很抱歉,页面产生错误!");      //保存错误提示信息
        }
        %>
        <jsp:forward page="deal.jsp"/>
        </body>
        </html>

(2)创建deal.jsp文件,在该文件中通过request对象的getAttribute()方法获取保存在request范围内的变量result并输出。这里需要注意的是,由于getAttribute()方法的返回值为Object类型,所以需要调用其toString()方法,将其转换为字符串类型。deal.jsp文件的具体代码如下:

        <%@ page language="java" contentType="text/html; charset= utf-8"
            pageEncoding=" utf-8"%>
        <html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset= utf-8">
        <title>结果页</title>
        </head>
        <body>
        <%String message=request.getAttribute("result").toString(); %>
        <%=message %>
        </body>
        </html>

图6.2 获取保存在request对象中的信息

运行本实例,将显示如图6.2所示的运行结果。

6.2.3 获取cookie

cookie的中文意思是“小甜饼”,然而在互联网中的意思与这就完全不同了,它和食品完全没有关系。在互联网中,cookie是小段的文本信息,在网络服务器上生成,并发送给浏览器。通过使用cookie可以标识用户身份,记录用户名和密码,跟踪重复用户等。浏览器将cookie以key/value的形式保存到客户机的某个指定目录中。

通过cookie的getCookies()方法即可获取到所有cookie对象的集合;通过cookie对象的getName()方法可以获取到指定名称的cookie;通过getValue()方法即可获取到cookie对象的值。另外,将一个cookie对象发送到客户端,使用response对象的addCookie()方法。

说明

在使用cookie时,应保证客户机上允许使用cookie。这可以通过在IE浏览器中选择“工具”/“Internet选项”命令,在打开对话框的“隐私”选项卡中进行设置。

【例6.5】通过cookie保存并读取用户登录信息。(实例位置:光盘\TM\sl\6\3)

(1)创建index.jsp文件,在该文件中,首先获取cookie对象的集合,如果集合不为空,就通过for循环遍历cookie集合,从中找出设置的cookie(这里设置为mrCookie),并从该cookie中提取出用户名和注册时间,再根据获取的结果显示不同的提示信息。index.jsp文件的具体代码如下:

        <%@ page language="java" contentType="text/html; charset= utf-8"
            pageEncoding=" utf-8"%>
        <%@ page import="java.net.URLDecoder" %>
        <html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset= utf-8">
        <title>通过cookie保存并读取用户登录信息</title>
        </head>
        <body>
        <%
            Cookie[]cookies=request.getCookies();                    //从request中获得cookie对象的集合
            String user="";                                          //登录用户
            String date="";                                          //注册的时间
            if (cookies ! = null) {
                for(int i=0; i<cookies.length; i++){                 //遍历cookie对象的集合
                    if(cookies[i].getName().equals("mrCookie")){     //如果cookie对象的名称为mrCookie
                        user=URLDecoder.decode(cookies[i].getValue().split("#")[0]); //获取用户名
                        date=cookies[i].getValue().split("#")[1];    //获取注册时间
                    }
                }
            }
            if("".equals(user)&&"".equals(date)){                    //如果没有注册
        %>
                游客您好,欢迎您初次光临!
                <form action="deal.jsp" method="post">
                    请输入姓名:<input name="user" type="text" value="">
                    <input type="submit" value="确定">
                </form>
        <%
            }else{                                                    //已经注册
        %>
                欢迎[<b><%=user %></b>]再次光临<br>
                您注册的时间是:<%=date %>
        <%
            }
        %>
        </body>
        </html>

(2)编写deal.jsp文件,用于向cookie中写入注册信息。deal.jsp文件的具体代码如下:

    <%@ page language="java" contentType="text/html; charset= utf-8" pageEncoding=" utf-8"%>
    <%@ page import="java.net.URLEncoder" %>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset= utf-8">
    <title>写入cookie</title>
    </head>
    <body>
    <%
    request.setCharacterEncoding("GB18030");                               //设置请求的编译为GB18030
    String user=URLEncoder.encode(request.getParameter("user"), "utf-8");  //获取用户名
    //创建并实例化cookie对象
    Cookie cookie = new Cookie("mrCookie", user+"#"+new java.util.Date().toLocaleString());
    cookie.setMaxAge(60*60*24*30);                                      //设置cookie有效期为30天
    response.addCookie(cookie);                                            //保存cookie
    %>  
    <script type="text/javascript">window.location.href="index.jsp"</script>
    </body>
    </html>

技巧

在向cookie中保存的信息中,如果包括中文,则需要调用java.net.URLEncoder类的encode()方法将要保存到cookie中的信息进行编码;在读取cookie的内容时,还需要应用java.net.URLDecoder类的decode()方法进行解码。这样,就可以成功地向cookie中写入中文信息。

运行本实例,第一次显示的页面如图6.3所示,输入姓名mr,并单击“确定”按钮后,将显示如图6.4所示的运行结果。

图6.3 第一次运行的结果

图6.4 第二次运行的结果

6.2.4 解决中文乱码

在上面的代码中为id参数传递了一个字符串类型的值001,如果将这个参数的值更改为中文,则在show.jsp中就会发生大家都不愿意看到的问题——在显示参数值时中文内容变成了乱码。这是因为请求参数的文字编码方式与页面中的不一致所造成的,所有的request请求都是ISO-8859-1的,而在此页面采用的是UTF-8的编码方式。要解决此问题,只要将获取到的数据通过String的构造方法使用指定的编码类型重新构造一个String对象,即可正确地显示出中文信息。

【例6.6】解决中文乱码。(实例位置:光盘\TM\sl\6\4)

(1)创建index.jsp页面,在其中加入一个超链接,并在该超链接中传递两个参数,分别为name与sex,其值全部为中文。关键代码如下:

        <body>
            <a href="show.jsp? name=张三&sex=男">解决中文乱码</a>
        </body>

(2)创建show.jsp页面,在其中将第一个参数name的值进行编码转换,将第二个参数sex的值直接显示在页面中,从而比较效果。关键代码如下:

        <body>
            name参数的值为:<%=new String(request.getParameter("name").getBytes("ISO-8859-1"), " UTF-8") %>
            sex参数的值为:<%=request.getParameter("sex") %>
        </body>

运行本实例后,可以发现name参数的值被正常显示出来,而sex参数的值则被显示成了乱码,如图6.5所示。

图6.5 解决中文乱码

6.2.5 获取客户端信息

通过request对象可以获取客户端的相关信息,如HTTP报头信息、客户信息提交方式、客户端主机IP地址、端口号等。在客户端获取用户请求相关信息的request对象的方法如表6.1所示。

表6.1 request获取客户端信息的常用方法

【例6.7】使用request对象的相关方法获取客户端信息。(实例位置:光盘\TM\sl\6\5)

创建index.jsp文件,在该文件中调用request对象的相关方法获取客户端信息。index.jsp文件的具体代码如下:

        <%@ page language="java" contentType="text/html; charset= UTF-8" pageEncoding=" UTF-8"%>
        <html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset= UTF-8">
        <title>使用request对象的相关方法获取客户端信息</title>
        </head>
        <body>
        <br>客户提交信息的方式:<%=request.getMethod()%>
        <br>使用的协议:<%=request.getProtocol()%>
        <br>获取发出请求字符串的客户端地址:<%=request.getRequestURI()%>
        <br>获取发出请求字符串的客户端地址:<%=request.getRequestURL()%>
        <br>获取提交数据的客户端IP地址:<%=request.getRemoteAddr()%>
        <br>获取服务器端口号:<%=request.getServerPort()%>
        <br>获取服务器的名称:<%=request.getServerName()%>
        <br>获取客户端的主机名:<%=request.getRemoteHost()%>
        <br>获取客户端所请求的脚本文件的文件路径:<%=request.getServletPath()%>
        <br>获得Http协议定义的文件头信息Host的值:<%=request.getHeader("host")%>
        <br>获得Http协议定义的文件头信息User-Agent的值:<%=request.getHeader("user-agent")%>
        <br>获得Http协议定义的文件头信息accept-language的值:<%=request.getHeader("accept-language")%>
        <br>获得请求文件的绝对路径:<%=request.getRealPath("index.jsp")%>
        </body>
        </html>

运行本实例,将显示如图6.6所示的运行结果。

图6.6 获取客户端信息

6.2.6 显示国际化信息

浏览器可以通过accept-language的HTTP报头向Web服务器指明它所使用的本地语言。request对象中的getLocale()和getLocales()方法允许JSP开发人员获取这一信息,获取的信息属于java.util.Local类型。java.util.Local类型的对象封装了一个国家和国家所使用的一种语言。通过这一信息,JSP开发者就可以使用语言所特有的信息作出响应。

【例6.8】页面信息国际化,代码如下:

        <%
        java.util.Locale locale=request.getLocale();
        String str="";
        if(locale.equals(java.util.Locale.US)){
            str="Hello, welcome to access our company's web! ";
        }
        if(locale.equals(java.util.Locale.CHINA)){
            str="您好,欢迎访问我们公司网站!";
        }
        %>
        <%=str %>

上面的代码,如果所在区域为中国,将显示“您好,欢迎访问我们公司网站!”,而所在区域为英国,则显示“Hello, welcome to access our company's web! ”。