Session的工作原理及应用——通过session实现加入购物车和支付功能

Session的工作原理

在这里插入图片描述

总结:
(1)session是将会话产生的数据保存在服务端,属于服务端技术
(2)session是一个域对象,session保存了一个map集合,往session存数据本质上就是把数据保存的map集合上
(3)通过session.setAttribute方法将数据保存到session的map集合中,通过session.getAttribute将数据从map集合中取出来

Session作为域对象

Session是一个域对象,因此session中也提供了存取数据的方法。

session.setAttribute(String attrName, Object attrValue);

//往session域中添加一个域属性, 属性名只能是字符串, 属性值可以是任意类型

session.getAttribute(String attrName);

//根据属性名获取session域中的属性值, 返回值是一个Object类型

如何获取session对象:

HttpSession session = request.getSession(); // 获取一个session对象, 如果在服务器内部有当前浏览器对应的session对象,则直接返回该session对象; 如果在服务器内部没有对应session, 则会创建一个新的session对象再返回。

Session域对象的三大特征:

(1)生命周期:

创建session: 在第一次调用request.getSession()方法时, 会创建一个session对象(当客户端在服务器端没有对应的session时, 调用request.getSession方法会让创建一个session对象并返回)

销毁session:

a)超时销毁: 默认情况下, 当超过30分钟没有访问session, session就会超时销毁(30分钟是默认时间,可以修改,但不推荐修改)

b)自杀: 调用session的invalidate方法, 会立即销毁session

c)意外身亡: 当服务器非正常关闭时(断电/硬件损坏/内存溢出等导致服务器意外关闭), session会随着服务器的关闭而销毁;

当服务器正常关闭, 在关闭之前, 服务器会将内部的session对象序列化保存到服务器的work目录下, 变为一个文件, 这个过程叫做session的序列化(也叫做钝化)。再次启动服务器, 钝化着的session会再次回到服务器,变为服务器中的session对象,这个过程叫做session的反序列化(活化)

(2)作用范围:(同一个客户端)在一次会话中,获取到的都是同一个session对象

(3)主要功能:在一次会话范围内实现数据的共享

案例:实现购物车

1.index.html

<!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <title>商品列表</title>

</head>

<body>

    <h3>点击下面的商品链接, 可以将商品加入购物车</h3>

    <!--

    http://localhost/13-cookie/index.html

    http://localhost/13-cookie/CartServlet

     -->

    <p><a href="CartServlet?prod=iphone11">iphone11</a></p>

    <p><a href="CartServlet?prod=vivonex3">vivonex3</a></p>

    <p><a href="CartServlet?prod=xiaomishouji">xiaomishouji</a></p>

    <p><a href="CartServlet?prod=huaweip30">huaweip30</a></p>

   

    <h3>点击下面的支付链接, 可以对购物车中的商品进行结算</h3>

    <!-- http://localhost/13-cookie/PayServlet -->

    <a href="PayServlet">支付</a>

   

   

</body>

</html>

2.CartServlet

protected void doGet(HttpServletRequest request, HttpServletResponse response)

        throws ServletException, IOException {

    //处理响应中文乱码

    response.setContentType("text/html;charset=utf-8");

    //获取一个response输出流

    PrintWriter out = response.getWriter();

    //=================================

    //1.获取要加入购物车的商品信息

    String prodName = request.getParameter( "prod" );

    //2.获取一个session对象,将商品信息保存到session中

    HttpSession session = request.getSession();

    session.setAttribute( "cart", prodName );

    //3.做出响应

    out.write( "成功将 [ "+prodName+" ] 加入了购物车~~~" );

}

3.PayServlet

protected void doGet(HttpServletRequest request, HttpServletResponse response)

        throws ServletException, IOException {

    //处理响应中文乱码

    response.setContentType("text/html;charset=utf-8");

    //获取一个response输出流

    PrintWriter out = response.getWriter();

    //==================================

    //1.获取一个session对象(之前的session)

    HttpSession session = request.getSession();

    //2.从session中获取到要结算的商品信息

    String prodName = (String)session.getAttribute( "cart" );

    //3.对商品进行结算,做出响应

    out.write( "成功为 [ "+prodName+" ] 支付了2000.0~~~" );

}
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值