在JSP中采用了java作脚本编写语言,这样使页面具有了强大的对象处理能力,还可以动态的创建web页面内容。在java中每次使用一个对象都要预先实例化,在页面编程中这是很繁琐的事情。JSP为我们封装好了页面编程过程中常使用到的九大对象:request、response、session、application、out、pagecontext、config、page、exception。这些对象在JSP页面编程中可以直接使用,也称为JSP预定义变量。

1、request对象概述

    request对象对应的是 javax.servlet.http.HttpServletRequest对象。该对象由Servlet容器创建,封装了来自HTTP协议请求的信息:头消息、系统消息、请求参数、请求方式。以下是request对象方法大全:

                        JSP九大内置对象详解全析(一):request对象_jsp

                        JSP九大内置对象详解全析(一):request对象_JSP_02

2、四种路径处理

    在JSP页面或Servlet中需要从一个组件到另一个组件的跳转,通常以超链接、表单提交、重定向、转发的形式来完成,其中对目标位置的标识即路径。

链接地址  <a href=”url”>链接文本</a>
表单提交  <form action=”url”>
重定向    response.sendRedirect(url)
转发      request.getRequestDispatcher(url)

    路径处理的区别:链接地址,表单提交,重定向由于都是浏览器发出的请求,为了到达指定的应用内的资源,所以斜杠后面从应用名开始写。转发位于服务器端,已经在具体的应用内部了,所以斜杠后面从应用名之后开始写。(一句话说:就是浏览器向服务器发送了一次新的请求)。

3、request对象的生命周期

    当从一个jsp发出一个request(本质是浏览器向服务器发送一次HTTP请求),即表明了这个request生命周期的开始,当到达action之后一般有两种处理request的方式,一种为转发:request.getDispatcher.forward(),一种是重定向:response.sendRedirect()。

    转发:对于request的forward,该request的生命周期将会继续延续下去,当采用forward如果到达JSP页面,那么之前从第一个JSP页面中发送出来的request的消息将仍然存在,新的页面同样能够取得该request里所包含的一些信息,比如之前的JSP发送request中所包含的参数信息.事实上,它们是同一个request。
    重定向:而如果是使用response.sendRedirect那么该request的生命周期将结束.

    简单来说:request对象在发起请求的时候被创建,在下一次请求发起前辈销毁。

    对于request,对request信息的传递,只有setAttribute()这一个方法,该方法将设置一个request对象设置一个成员变量,这个变量成为request对象的一部分。但是,如果当一个request是从jsp从发出,包含的信息段为param1=test这样的方式,那么只能通过getParameter()得到,getAttribute()是得不到param1的value的。
    

4、request.getParameter() 和request.getAttribute() 区别

    getParameter 是用来接受用post或get方法传递过来的参数的。
    getAttribute 必须先setAttribute。

    request.getParameter() 取得是通过容器的实现来取得通过类似post,get等方式传入的数据(路径传参或者参数传参),request.setAttribute()和getAttribute()只是在web容器内部流转,仅仅是请求处理阶段。

    request.getParameter() 方法传递的数据,会从Web客户端传到Web服务器端,代表HTTP请求数据。该方法返回String类型的数据。

    request.setAttribute() 和 getAttribute() 方法传递的数据只会存在于Web容器内部(Servlet对象的成员变量)。还有一点就是:HttpServletRequest 类有 setAttribute() 方法,而没有setParameter() 方法。

5、request对象编码格式

    request对象的编码格式是ISO-8895-1,一般JSP页面的默认编码格式为GBK,当我们使用超链接(路径传参,本质是一个重定向)传递中文参数的时候(没有经过Servlet对象后台编码格式转换),需要用到java.net.URLEncoder.encode( )做一个编码格式转换。

    show.jsp:编码格式转化

<%@ page language="java" contentType="text/html" pageEncoding="GBK"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>'show.jsp'</title>
  </head>

  <body>
        name参数的值为:<%=new String(request.getParameter("name").getBytes("iso-8859-1"),"gbk") %>
    <br>sex参数的值为:<%=request.getParameter("sex") %>
  </body>
</html>

    requestChinese.jsp:发送请求

<%@ page language="java" contentType="text/html" pageEncoding="GBK" %>
<%@page import="java.net.URLEncoder"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>解决文中乱码</title>
  </head>
  <body>
    <a href="show.jsp?name=<%=URLEncoder.encode("无语") %>&sex=<%=URLEncoder.encode("男") %>">解决中文乱码</a>
  </body>
</html>

    结果如下:

                        JSP九大内置对象详解全析(一):request对象_jsp_03

6、request对象获取请求客户端的基本信息

    request对象获取请求客户端的基本信息:因为该对象封装了HTTP请求的基本信息,所以从这个对象中就可以获得这些信息。

    requestInfo.jsp:

<%@ page language="java" contentType="text/html" pageEncoding="GBK"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>'index.jsp'</title>
  </head>
  <body>
    <div style="width: 600px">
    <ul style="line-height:24px">
        <li>客户使用的协议:<%=request.getProtocol() %>
        <li>客户端发送请求的方法:<%=request.getMethod() %>
        <li>客户端请求路径:<%=request.getContextPath() %>
        <li>客户机IP地址:<%=request.getRemoteAddr() %>
        <li>客户机名称:<%=request.getRemoteHost() %>
        <li>客户机请求端口号:<%=request.getRemotePort() %>
        <li>接爱客户信息的页面:<%=request.getServletPath() %>
        <li>获取报头中User-Agent值:<%=request.getHeader("user-agent") %>
        <li>获取报头中accept值:<%=request.getHeader("accept") %>
        <li>获取报头中Host值:<%=request.getHeader("host") %>
        <li>获取报头中accept-encoding值:<%=request.getHeader("accept-encoding") %>
        <li>获取URI:<%= request.getRequestURI() %>
        <li>获取URL:<%=request.getRequestURL() %>
    </ul>
    </div>
  </body>
</html>

    结果如下:

                        JSP九大内置对象详解全析(一):request对象_Servlet_04

7、request对象获取Form表单的信息

    相对于路径传参的方式,request对象还能从表单中获取到提交过来的信息。对于表单中文本元素、单选按钮、下拉列表框都可以使用都可以使用getParameter()来获得具体值。对于复选框和多选列表框可以使用getParameterValues()来获得。该方法返回一个字符串数组,遍历可得到具体值。

    register.jsp:

<%@ page language="java" contentType="text/html" pageEncoding="GBK"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
  <head>
    <title>'index.jsp'</title>
  </head>

<body>
<form action="showRegister.jsp" method="post">
    <ul style="list-style: none; line-height: 30px">
        <li>
            输入用户姓名:
            <input type="text" name="name" />
            <br />
        </li>
        <li>
            选择性别:
            <input name="sex" type="radio" value="男" /><input name="sex" type="radio" value="女" /></li>
        <li>
            选择密码提示问题:
            <select name="question">
                <option value="母亲生日">
                    母亲生日
                </option>
                <option value="宠物名称">
                    宠物名称
                </option>
                <option value="电脑配置">
                    电脑配置
                </option>
            </select>
        </li>
        <li>
            请输入问题答案:
            <input type="text" name="key" />
        </li>
        <li>
            请选择个人爱好:
            <div style="width: 400px">
                <input name="like" type="checkbox" value="唱歌跳舞" />
                唱歌跳舞
                <input name="like" type="checkbox" value="上网冲浪" />
                上网冲浪
                <input name="like" type="checkbox" value="户外登山" />
                户外登山
                <br />
                <input name="like" type="checkbox" value="体育运动" />
                体育运动
                <input name="like" type="checkbox" value="读书看报" />
                读书看报
                <input name="like" type="checkbox" value="欣赏电影" />
                欣赏电影
            </div>
        </li>
        <li>
            <input type="submit" value="提交" />
        </li>
    </ul>
</form>
</body>
</html>

                        JSP九大内置对象详解全析(一):request对象_JSP_05

showRegister.jsp:

<%@ page language="java" contentType="text/html" pageEncoding="GBK"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>'show.jsp'</title>
  </head>

  <body>
    <ul style="list-style:none; line-height:30px">
        <li>输入用户姓名:<%=new String(request.getParameter("name").getBytes("ISO8859_1"),"GBK") %></li>
        <li>选择性别:<%=new String(request.getParameter("sex").getBytes("ISO8859_1"),"GBK") %></li>
        <li>选择密码提示问题:<%=new String(request.getParameter("question").getBytes("ISO8859_1"),"GBK") %></li>
        <li>
            请输入问题答案:<%=new String(request.getParameter("key").getBytes("ISO8859_1"),"GBK") %>
        </li>
        <li>
            请选择个人爱好:
            <% 
                String[] like =request.getParameterValues("like");
                for(int i =0;i<like.length;i++){
            %>
            <%= new String(like[i].getBytes("ISO8859_1"),"GBK")+"&nbsp;&nbsp;" %>
            <%
                }
            %>
        </li>
    </ul>
  </body>
</html>

                        JSP九大内置对象详解全析(一):request对象_九大对象_06


8、cookie管理

    cookie也是一个对象,由服务器创建一个cookie对象用来保存用户的登录名、密码、标识身份等信息(key-value键值对模式保存数据)。在服务器生成,发送给浏览器(是使用response对象的addCookie()方法,随着response对象发送到页面),由浏览器指定保存的目录。

8.1、cookie实例

    cookieRegister.jsp

<%@ page language="java" contentType="text/html" pageEncoding="GBK"%>
<%@ page import="javax.servlet.http.*" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>'index.jsp'</title>
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>

  <body>
    <% 
        String welcome = "第一次访问";
        String[] info = new String[]{"","",""};
        Cookie[] cook = request.getCookies();
        if(cook!=null){
            for(int i=0;i<cook.length;i++){
                if(cook[i].getName().equals("mrCookInfo")){
                    info = cook[i].getValue().split("#");//value使用#连接不同信息
                    welcome = ",欢迎回来!";
                }
            }
        }
    %>
    <%=info[0]+welcome %>
    <form action="cookieShow.jsp" method="post">
        <ul style="line-height: 23">
            <li>姓&nbsp;&nbsp;&nbsp;&nbsp;名:<input name="name" type="text" value="<%=info[0] %>">
            <li>出生日期:<input name="birthday" type="text" value="<%=info[1] %>">
            <li>邮箱地址:<input name="mail" type="text" value="<%=info[2] %>">
            <li><input type="submit" value="提交">
        </ul>
    </form>
  </body>
</html>


    我们来解释一下cookie是怎么保存和取到的:在JSP页面中使用request发送请求(封装了HTTP请求的消息,同时也封装了本地浏览器保存的cookie),request对象可以通过 Cookie[] cook = request.getCookies();获得本地浏览器存放的cookie对象。发送请求的时候cookie对象将被封装到request对象中发送到服务器。

    cookieShow.jsp:

<%@ page language="java" contentType="text/html" pageEncoding="GBK"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>'show.jsp'</title>
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>

  <body>
    <% 
        String name = request.getParameter("name");
        String birthday = request.getParameter("birthday");
        String mail = request.getParameter("mail");
        //创建一个cookie对象用来保存信息
        Cookie myCook = new Cookie("mrCookInfo",name+"#"+birthday+"#"+mail);
        myCook.setMaxAge(60*60*24*365);
        response.addCookie(myCook);
    %>
    表单提交成功
    <ul style="line-height: 24px">
        <li>姓名:<%= name %>
        <li>出生日期:<%= birthday %>
        <li>电子邮箱:<%= mail %>
        <li><a href="index.jsp">返回</a>
    </ul>
  </body>
</html>

8.2、cookie生存时间

    默认情况下,Cookie会被浏览器保存在内存中,此时Cookie的生命周期由浏览器决定,只要不关闭浏览器Cookie就会一直存在。

void setMaxAge(int seconds);

该方法是Cookie提供的实例方法。参数seconds的单位为秒,但精度不是很高。
seconds > 0 :代表Cookie保存在硬盘上的时长
seconds = 0 : 代表Cookie的生命时长为现在,而这一刻稍纵即逝,所以马上Cookie就等同于过了生存时间,所以会被立即删除。这也是删除Cookie的实现方式。
seconds < 0 :缺省值,浏览器会将Cookie保存在内存中。

8.3、cookie编码和解码

    Cookie作为在网络传输的一段字符串文本,只能保存合法的ASCII字符,如果要保存中文需要将中文变成合法的ASCII字符,即编码。使用如下代码可以实现将中文保存到Cookie中。

Cookie c = new Cookie("city",URLEncoder.encode("北京","utf-8"));

    服务器读取客户端经过编码之后的信息时,要想能够正确显示需要将信息解码后才能输出(response)。使用URLDecoder的decode()方法即可。

URLDecoder.decode(value,"utf-8")

8.4、cookie路径问题

    当浏览器记录一个cookie后,并不是所有的请求都会将该cookie发送到服务器,而是进行路径判断。浏览器保存该cookie的默认路径时是添加这个cookie的web组件路径。比如说:http://localhost:8088/jsp3/main/login
那么,这个默认路径就是jsp3/main(项目名+后一级)

    什么时候发送cookie ?
    只有当访问的地址是Cookie的路径或者其子路径时,浏览器才发送Cookie到服务器端。如:访问的是/jsp3/main/login、/jsp3/main/find则,将会发送cookie。如果访问的是 /jsp3/find,则浏览器不会发送Cookie。

8.5、设置Cookie的路径

    以下代码就实现了设置Cookie的路径为应用的顶级目录,这样所有资源路径要么与此路径相等,要么是子路径,从而实现了客户端发送任何请求时都会发送Cookie。

Cookie c3=new Cookie("name", "terena");
            c3.setPath("/jsp3");
            res.addCookie(c3);

8.6、cookie缺点及自问自答:

cookie在哪产生?:在服务器产生
怎么产生: new Cookie方法得到
保存什么:key-value的形式保存数据,都是String
大小多少:4kb
保存在哪:保存到浏览器(response对象传送过去)
可以干嘛:经常保存sessionID,key是jessionid(Tomcat)。传到后台后判断sessionID是否一致,用来判断是否第一次登陆。

只能保存字符串、大小4kb
安全性低,容易被截取数据包
网络传输内容,影响带宽,增加网路负载

                        JSP九大内置对象详解全析(一):request对象_九大对象_07