任务 4 在 JSP 中合理存储数据

本文介绍了在JavaWeb开发中如何合理存储数据,讲解了会话(session)的概念、工作方式及如何使用session保存和读取数据。同时,对比了Cookie与session的区别,阐述了Cookie的工作原理、应用以及与session的差异。此外,还讨论了application内置对象作为全局作用域的特点,以及page作用域和pageContext对象的作用。

JavaWeb 应用设计及实战 目录

目录

1.4.1 理解会话

1.4.2  使用 Cookie\

  1.Cookie

2. Cookie 的应用

1.4.3 application 内置对象与全局作用域

1.4.4   page 作用域与 pageContext 对象

1.4.5  不同作用域的对比


关键步骤如下。

  • 使用 session 对象实现数据的保存和读取。
  • 使用 Cookie 实现数据的保存和读取。
  • 使用 application 对象实现数据的保存和读取。

1.4.1 理解会话

1.会话的概念

     会话据说用户通过浏览器与服务器之间进行的一次通话,它可以包含浏览器与

服务器之间的多次请求、响应过程。简单地说就是在一段时间内,单个客户端与Web 服务

器的一连串相关的交换过程。

     在一个会话中,客户端可能会多次请求访问一个网页,也有可能请求访问各种不同

的服务器资源。

      图 1.13 描述了浏览器与服务器的一次会话过程。当用户向服务器发出第一次请求时,

服务器会为该用户创建唯一的会话,会话将一直延续到用户访问结束(浏览器关闭可以

借宿会话)。

             图1.13   一次会话过程

    JSP 提供了一个可以在多个请求之间持续有效的会话对象 session,session 对象允许

用户存储和提取会话状态的信息。接下来,我们就来学习 JSP 内置对象 session.

   2.session  对象

 (1)session 对象

     session 一词的原意是指有始有终的一系列动作,在实际应用中通常翻译成会话。

例如,打电话时,甲方拿起电话拨通乙方电话这一系列的过程就可以称为一个会话,电

话挂断时会话结束。

   (2)session 的工作方式

     session 机制是一种服务器端的机制,在服务器端保存信息。当程序接收了客户端

的请求时,服务器首先会检查是否已经为这个客户端创建了 session 。判断session 是否

创建是通过一个唯一的标识 "sessionid"  来实现的。如果在客户端请求中包含了一个

sessionid ,则说明在此前已经为客户端创建 了session,服务器就会根据这个 sessionid

将对应的 session 读取出来。否则,就会重新创建一个新的 session ,并生成一个与

此 session 对应的 sessiond ,然后将 sessiond 在首次响应过程中返回到客户端保存。

    (3)使用 session 实现数据的存储与读取

    使用 session 进行数据保存时,需要调用相应的方法。session 对象常用的方法如

表 1-7 所示。

表 1-7 session 对象的常用方法
方法返回值类型说明
setAttribute(String key,Object value)void以 key-value 的形式保存对象值
getAttribute(String key)Object通过 key 获取对象值
getIdString获取 sessionid
invalidate()void设置 session 对象失效
setMaxInactiveInterval(int interval)void设置 session 的有效期
removeAttribute(String key)void移除 session 中的属性

     使用 session 保存数据。

session.setAttribute(String key,Object value);

   从 session 中读取数据。

Object value = session.getAttribute(String key);

   示例 7 

    用户注册成功后,将用户信息保存到 session 中,在新页面中读取 session 保存的用户信息

并显示。

    分析如下。

     要完成此功能,首先要在用户注册成功后,将用户的信息保存到 session 中。然后

当页面跳转到下一个 JSP 中,读取 session 中的数据并显示。需要注意的是,读取

session 时,首先要对 session 内容进行判断,否则对一个不存在的数据进行方法调用将

会造成程序异常。

    关键代码如下;

    注册处理页面关键代码:

<%
    if(username.equals("admin")){
        //不允许注册,返回注册页面
        ……
    }else{
        session.setAttribute("user",username);
        response.sendRedirect("index.jsp");
    }
%>

注册跳转页面关键代码:

<%
    Object o = session.getAttribute("user");
    if(0==null){
        //显示用户名密码输入框,可以在此登录    
%>

    <label>用户名</labet><input type="text" name = "uname"/>
    <label>密码</labet><input type="text" name = "unpassword"/>
    <button>登录</button>
<%
    }else{
        //显示 "欢迎你,XXX"
        out.print("欢迎你," +o.toString());
    }
%>
    

 

当运行页面页,输入同户名 "user" 时,运行效果如图  1.14 所示。

     图1.14  使用 session 保存数据

  (4)session 的有效期

     设置 session 有效期的作用是通过及时清理不使用 的 session 以实现资源的释放。在

JSP 中清除主动清除长时间没有发出请求的 session .

     1)程序主动清除 session 的方式也分为两种:一种是使用 session,invalidate(); 使

session 失效;另一种是如果仅仅希望清除 session 的某个属性,可以使用

session.removeAttribute("userName");  方法将指定名称的属性清除。

     2)服务器主动清除 session 同样也可以通过两种方式实现:一种是通过设置 session

的过期时间,调用 setMaxInactiveInterval(int interval) 方法设置 session 的最大活动

时间,以秒为单位,如果这个时间内客户端没有再次发送请求,那么服务器

将清除这个 session ;另一种是通过配置文件中设置过期时间来实现,即在

Tomcat 服务器的 web.xml 文件中 <web-app> 和 <./web-app> 之间添加如下代码。

<session-config><session-timeout>10</session-timeout></session-config>

   注意

        <session-timeout> 里设置的数值以分为单位,而不是以秒为单位。

1.4.2  使用 Cookie\

  1.Cookie

    (1)  Cookie 的概念

    Cookie 由服务器端生成并发送给客户端浏览器,浏览器会将其保持成某个目录下

的文本文件。

    (2) Cookie 的工作原理

       用户在浏览网站时, Web 服务器会将一些资料存放在客户端,这些资料包括用户在

浏览网站期间输入的一些文字或选择记录。当用户下一次访问该网站的时候,服务器会

从客户端查看是否有保留下来的 Cookie 信息,然后依据 Cookie 的内存,呈现特定的页面内

容给用户。

   (3)Cookie 与 session 的比较

  •    session 是在服务器端保存用户信息,Cookie 是在客户端保存用户信息。
  •   session 中保存的是对象,Cookie 中保存的是字符串。
  •   session 对象随会话结束而失效, Cookie 则可以长期保存在客户端。
  •    Cookie 通常用于保存不重要的用户信息,重要的信息使用 session 保存

2. Cookie 的应用

  在 JSP 中使用 Cookie  需要经过以下三个步骤。

   (1)创建 Cookie 对象

创建 Cookie 对象的语法如下。

Cookie cookieName = new Cookie(String key,String value);

 

  • 变量 cookieName:引用创建的 Cookie 对象。
  • 参数 key :Cookie 的名称。
  • 参数 value:Cookie 所包含的值。

(2)写入 Cookie

Cookie 创建后,需要将其添加到响应中发送回浏览器保存,在响应中写入 Cookie 

对象的语法如下。

reponse.addCookie(cookieName);

示例 8 

  用户登录成功,使用 Cookie 保存用户名。

  关键代码:

  // 允许注册,注册成功

Cookie cookie = new Cookie ("user",username);

response.addCookie(cookie);
……
response.sendRedirect("index.jsp");

 

(3)读取 Cookie

 JSP 通过 response 对象的 addCookie() 方法写入 Cookie 后,读取时将会调用 JSP 中

request 对象的 getCookie() 方法,该方法将会返回一个 Cookie 对象数组,因此必须要

通过遍历的方式进行访问。Cookie 通过 key-value 方式保存,因而在遍历数组时,需要

通过调用 getName() 对每个数组成员的名称进行检查,直至找到需要的 Cookie ,然后再

调用 Cookie 对象的 getValue() 方法获得与名称对应的值。读取 Cookie 的语法如下。

Cookie[] cookies = request.getCookies();

示例 9

  在新闻系统首页读取 Cookie 中的用户名。

关键代码:

<%
    Cookie[] cookies=request.getCookies();
    String user"";
    for(int i = 0 ;i<cookies.length;i++){
        if(cookies[i].getName().equals("user")){
            user=cookies[i].getValue();
        }
    }
%>
<label> 用户名</label>
<input type = "text" name="uname" value="<%=user%>"/>

运行程序,当在首页单击 "注销" 按钮后,用户名自动显示在 "用户名" 文本框

中。效果如图 1.15 如图和 图 1.16  所示。

   图 1.15  注册 成功后保存用户名     图 1.16 读取 Cookie  显示用户名

    注意

      在读取 Cookie 时,为了确保页面运行不会出现异常,建议在 循环 Cookie  数

组时先对数组进行非空判断,以免出现空指针异常。

     Cookie 创建后,可以通过调用其自身的方法来对 Cookie 进行设置。Cookie 的常用

方法如表 1-8 所示。

表 1-8 Cookie 的常用方法
方法 返回值类型说明
setValue(String value)void创建 Cookie 后,为 Cookie 赋值
getName()String获取 Cookie 的名称
getValue()String获取 Cookie 的值
getMaxAge()int获取 Cookie 的有效期
setMaxAge(int expiry)void 设置 Cookie 的有效期,以秒为单位

  提示

      使用 setMaxAge(int expiry) 时,有以下几种情况。

  1. 通常情况下 expiry 参数应大于 0 的整数,表示 Cookie 的有效期。
  2. 如果设置 expiry 参数为0,表示删除 Cookie.
  3. 设置 expiry 参数为-1或者不设置,表示 Cookie 会在当前窗口关闭后失效。

1.4.3 application 内置对象与全局作用域

     application 对象类似于系统的 "全局变量",每个 Web 项目都会有一个 application

对象,可以在整个 Web 项目中共享使用数据。application 对象的常用方法如表 1-9 所示。

表 1-8 application 对象的常用方法
方法返回值类型说明
setAttribute(String key,Object value)void

以 key-value 的形式保存对象值

 

getAttribute(String key)Object通过 key 获取对象值

示例 10 

  统计网站的访问人数。

  关键代码:

<%
    Object count =application.getAttribute("count");
    if(count==null){     //application 中未存放 count
        application.setAttribute("count",new Inter(1));
    }else{             //application 中已经存放 count
        Integer i=(Integer)count:
            application.setAttribute("count",i.intValue()+1);
    }
    Integer icount = (Integer)application.getAttribute("count");
    out.println("页面被访问了"+icount.intValue()+:"次");
%>

运行程序,在页面底部显示访问次数,效果如图 1.17 所示。

      图 1.17 统计网站访问次数

  补充知识

     在 JSP 中的对象,包括用户创建的对象,都有一个范围属性,这个范围也称

为 "作用域“ 。作用域定义了在什么时间内,在哪一个 JSP 中可以访问这些对象。

在 JSP 中有四种作用域,分别是 page、request、session 、application。

1.4.4   page 作用域与 pageContext 对象

   所谓 page 作用域指单一 JSP 的范围,page 作用域内的数据只能在本页面中访问。

   在 page 作用域内可以使用 pageContext 对象的 setAttribute() 和 getAttribute() 方法来

访问具有这种作用域类型的数据。

     page 作用域内的对象在客户端每次请求 JSP 时创建,在服务器发送回响应或请求

转发到其他的页面或资源后失效。

    示例 11

    制作两个 JSP 页面,在 testOne 页面 中使用 pageContext 对象保存一个数据,在

testTwo 页面中读取数据,查看效果。

    分析如下。

    如果在创建对象时指定作用范围为 page 范围,那么这个对象只能在当前页面内

被访问,如果在其他页面中进行访问,将无法获取到该对象信息。

   关键代码如下。

   testOne.jsp  页面代码:

<%
    String name ="page";
    pageContext.setAttribute("name",name);
%>
<strong>
testOne:<%=pageContext.getAttribute("name")%>
</strong>
<br/>
<%
    pageContext.include("testTwo.jsp")
%>

<strong>
  testTwo:<%=pageContext.getAttribute("name")%>
</strong>

 

运行效果如图 1.18所示。

      图 1.18   page 作用域

 

     提示

        pageContext 对象本身也属于 page 范围。具有 page 范围的对象都被绑定到

pageContext 对象中。

1.4.5  不同作用域的对比

      到目前为止,我们已经掌握了对象的四种作用域范围。它们彼此之间的区别如

表 1-10 所示。

表 1-10 四种对象作用域范围的比较
名称说明
page 作用域只在当前页面有效,一旦离开当前页面,则在该范围内创建的对象将无法访问
request 作用域在同一个请求范围内可以访问该范围内创建的对象,一旦请求失效,则创建的对象也随之失效
session 作用域在会话没有失效或者销毁前,都可以访问该范围内的对象
application 作用域在整个 Web 应用范围没有停止前,都可以从 application 中进行数据的存取

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值