Session及其使用

一、Session的基本介绍

服务器端的会话技术(JSESSION:相当于一个标识符,一个用户只能有一个)
特点:存储到服务器端并且适用于私有数据。

在所有的会话跟踪技术中,HttpSession对象是最强大和最通用的。一个用户可以有且最多有一个HttpSession,并且不会被其它用户访问到。

 

1.在使用过程中的逻辑

    1)从服务器端获取session,request.getSession()
    如果能获取到session,将id记录下来,保存到浏览器端(依赖于cookie存在)
    public Object getAttribute(String name:域对象中存储的数据名称)
    如果获取不到session的id,需要创建一个session,将当前session的数据存储到服务器端。
    public void setAttribute(String name,Object value)
    2)session可以作为一个域对象
    session域的范围仅仅在当前session域中有效(当前的用户)

2.session的生命周期

2.1 创建session   create一个Session对象:getSession(true)  HttpSession对象在用户第一次访问网站的时候自动创建。

public HttpSession  getSession():直接从服务器端获取session数据,由request对象调用。
public HttpSession  getSession(boolean create):如果参数为true,表示新建一个session会话;如果是false,同上。

2.2 给session域中添加一些数据  String/List/Map

存储数据的要求:

1)不同于URL重写、隐藏域或cookie,放入到HttpSession的值,是存储在内存中的。因此,不要往HttpSessino放入太多对象或大对象。尽管现代的Servlet容器在内存不够用的时候会将保存在HttpSessions的对象转储到二级存储上,但这样有性能问题,因此小心存储。

2)放到HttpSession中的值不限于String类型,可以是任意实现了java.io.Serializable的java对象(可以转为byte[],既可以放内存、文件、还可以放到数据库)。因为Servlet容器认为必要时会将这些对象放入文件或数据库中,尤其在内存不够用的时候。也可以将不支持序列化的对象放入HttpSession,但是这样的话,当Servlet容器视图序列化的时候会失败报错。

Session对象.setAttribute(String key,String value)

2.3 session的销毁  默认的超时时间在tomcat的配置目录中:web.xml:<session-config><session-timeout>30</session-timeout></session-config>     default session timeout:30分钟

	三种方式:
		a 服务器非正常关闭
		b 手动设置session的超时时间:public void setMaxInactiveInterval(int interval)-->参数为秒数,正整数
		c 手动将session删除(常用)  public void Invalidate():使此session会话无效。

3.Session的特点

    A)可以存储任意类型的数据
    B)适用于私有数据
    C)存储大小无限制

二、Session的使用(两个案例)

案例一:加入购物车
关于加入购物车的逻辑:
分析:session技术
步骤分析:
	1)当用户点击加入购物车,跳转到后台Servlet(Add2CartServlet)
		跳转后台的时候,携带商品名称:name="xxx"
	2)设置编码:utf-8
	3)接收参数数据:name
	4)从服务器端获取session,判断是否存在,需要构造一个购物车结构 :Map<String,Integer> 商品名称和商品数量
	   Map map=request.getSession().getAttribute("cart") 
	定义一个变量来记录商品数量:count
	5)判断购物车是否为空
	5.1 若为空
                创建一个购物车 map=new HashMap();
		count=1;
	        将购物车存储到session中:setAttribute("cart",map);
	5.2 若不为空
	先获取对应的商品数量count=map.get(name);
	继续判断购物车中是否存在该商品
		count=0,商品不存在-->count=1
		如果商品存在,count++;
	6)将数据存储在购物车中  put
	7)提示用户
		输出一个超链接:当前name加入购物车成功
		提示用户:继续购物(超链接)
		提示查看购物车:cart.jsp
				1)表格(记录商品名称和商品数量)
				2)从session域中获取购物车数据--->map
				3)map为空,在浏览器中输出:亲,购物车为空。
				4)map不为空
				     遍历map集合
					输出tr/td
					name/count。

案例二:清空购物车
1)在cart.jsp页面中创建一个超链接 <a href="/clearCart'>清空购物车</a>
2)在后面ClearCartServlet中完成逻辑
先获取session
	手动删除session	  public void Invalidate():使此session会话无效。
3)重定向到cart.jsp页面

在EE项目中,加入购物车的逻辑分为两种情况判断:
1)登录  将商品数据存储到session(不同系统之间,session如何跨域?)
2)不登录   将商品数据存储到session。
package com.xunpu.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

/**
 * 添加购物车
 */
@WebServlet(name = "Add2CartServlet")
public class Add2CartServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //1.设置编码
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        //2.接收前台传递来的参数name
        String name = request.getParameter("name");
        //3.获取session数据  购物车的结构Map<String,Integer>
        Map<String,Integer> map = (Map) request.getSession().getAttribute("cart");
        //定义一个count,表示商品的数量
        int count=0;
        //4.判断map是否为空
        if(map==null){
            //若为空,直接创建一个新的map集合
            map=new HashMap();
            count=1;
            //再次将购物车添加到session域中
            request.getSession().setAttribute("cart",map);
        }else{
            //若不为空,继续判断购物车是否包含该商品
            //通过商品名称name获取商品数量
             count=map.get(name);
             if(count==0){
                 //不包含
                 count=1;
             }else{
                 count++;
             }
        }
        //将商品名称、商品数量添加到购物车
        map.put(name,count);
        //提示用户
        writer.write("<b>已经将当前商品:"+name+"成功添加到购物车中&nbsp;&nbsp;");
        writer.write("<a href='/product_list.jsp'>继续购物</a>&nbsp;&nbsp;&nbsp;&nbsp;");
        writer.write("<a href='cart.jsp'>查看购物车</a>");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}
package com.xunpu.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet(name = "ClearCartServlet")
public class ClearCartServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1)获取session
        HttpSession session =request.getSession();
        //2)手动删除session
        session.invalidate();
        //3)重定向到cart.jsp页面中
        response.sendRedirect("/cart.jsp");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值