欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

实现session版本购物车

程序员文章站 2024-03-20 13:25:46
...

实现session版本的购物车(简单版)

1.session的概念
概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。
2.如何获取session对象

	//通过request对象获取session对象
	HttpSession session = request.getSession();
	//session的方法
	Object getAttribute(String name);//获取存储在session域对象中的信息(返回一个对象)
	void setAttribute(String name, Object value);//设置信息存储到session域中
	void removeAttribute(String name);//删除存储在session域中的信息

3.session的一些其他概念

1. 当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
	默认情况下:不是。
	如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
		Cookie c = new Cookie("JSESSIONID",session.getId());
		c.setMaxAge(60*60);
		response.addCookie(c);
2. 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
	不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作
		session的钝化:
	在服务器正常关闭之前,将session对象系列化到硬盘上
		session的活化:
	在服务器启动后,将session文件转化为内存中的session对象即可。
3. session什么时候被销毁?
	(1)服务器关闭
	(2)session对象调用invalidate()(3)session默认失效时间 30分钟
		选择性配置修改	
		<session-config>
			<session-timeout>30</session-timeout>
		</session-config>

4.session的特点

(1)session用于存储一次会话的多次请求的数据,存在服务器端
(2)session可以存储任意类型,任意大小的数据
session与Cookie的区别:
1. session存储数据在服务器端,Cookie在客户端
2. session没有数据大小限制,Cookie有
3. session数据安全,Cookie相对于不安全

5.session版本购物车的实现

//从购物车删除商品
public class DelCart extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int id=Integer.parseInt(request.getParameter("id"));

        //获得session对象
        HttpSession session=request.getSession();
        //查看session域中的carts
        List<Goods> list=(List<Goods>) session.getAttribute("carts");
        //遍历一遍找到和想移除购物车的物品id一样的那个商品
        for(int i = 0; i < list.size(); i++){
            if(list.get(i).getGoodsId() == id){
                Goods g1 = list.get(i);
                //如果该商品的数量大于一
                if(g1.getGoodsNum() > 1){
                    //只是将该商品数量减一而不删除该商品
                    g1.setGoodsNum(g1.getGoodsNum() - 1);
                }else if (g1.getGoodsNum() == 1){
                    //该商品数量为一,可以直接删除该商品
                    list.remove(g1);
                }
            }
        }
        //重新设置session域对象
        session.setAttribute("carts", list);
        response.sendRedirect("/buy/cart.jsp");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
//从商品信息页添加商品到购物车
public class ShoppingCart extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            int id=Integer.parseInt(request.getParameter("id"));
            String name=request.getParameter("name");
            String price=request.getParameter("price");
            String desc = request.getParameter("desc");
            int num = Integer.parseInt(request.getParameter("num"));

            Goods goods=new Goods(id,name,desc,price,num);

            //获得session对象
            HttpSession session=request.getSession();
            //查看session域中的carts
            List<Goods> list=(List<Goods>) session.getAttribute("carts");
            if(list == null){
                // 如果session域中不存在carts
                list = new ArrayList<Goods>();
            }
            //设置一个是否添加进购物车的条件
            boolean flag = true;
            //存在的话爷要将新添加进购物车的商品添加到session域中的list中去
            for(int i = 0; i < list.size(); i++){
                //如果添加了相同的商品进入购物车
                if(list.get(i).getGoodsId() == goods.getGoodsId()){
                    //将购物车该商品的数量加一
                    list.get(i).setGoodsNum(list.get(i).getGoodsNum() + 1);
                    //找到相同的商品存在购物车中,不用添加进购物车
                    flag = false;
                }
            }
            if(flag){
                //如果添加条件为true才添加进购物车
                list.add(goods);
            }
            //重新设置session域对象
            session.setAttribute("carts", list);
            response.sendRedirect("cart.jsp");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
//初始化商品信息页
public class MyServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<Goods> list = new ArrayList<>();
        Goods g1 = new Goods(1,"商品1","商品1","100",1);
        Goods g2 = new Goods(2,"商品2","商品2","200",1);
        Goods g3 = new Goods(3,"商品3","商品3","300",1);
        Goods g4 = new Goods(4,"商品4","商品4","400",1);

        list.add(g1);
        list.add(g2);
        list.add(g3);
        list.add(g4);

        request.setAttribute("goods",list);
        request.getRequestDispatcher("index.jsp").forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
<!--购物车页面-->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<%--该页面为添加到购物车的商品信息--%>
<body>
<a href="${pageContext.request.contextPath}/myServlet">返回</a>
<table>
    <tr>
        <td>ID</td>
        <td>名字</td>
        <td>描述</td>
        <td>价格</td>
        <td>数量</td>
    </tr>
    <% List<Goods> list=(List)session.getAttribute("carts");
        for(Goods goods:list){
    %>
    <tr>
        <td><%=goods.getGoodsId() %></td>
        <td><%=goods.getGoodsName() %></td>
        <td><%=goods.getGoodsDesc()%></td>
        <td><%=goods.getGoodsPrice() %></td>
        <td><%=goods.getGoodsNum()%></td>
        <td><a href="${pageContext.request.contextPath}/cart/delCart?id=<%= goods.getGoodsId() %>">从购物车移除</a></td>
    </tr>
    <%} %>
</table>
</body>
</html>
<!--商品信息页面-->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<%--该页面存储所有的商品信息--%>
<table>
    <tr>
        <td>ID</td>
        <td>名字</td>
        <td>描述</td>
        <td>价格</td>
        <td>操作</td>
    </tr>
    <% List<Goods> list=(List)request.getAttribute("goods");
        for(Goods goods:list){
    %>
    <tr>
        <td><%=goods.getGoodsId() %></td>
        <td><%=goods.getGoodsName() %></td>
        <td><%=goods.getGoodsDesc()%></td>
        <td><%=goods.getGoodsPrice() %></td>
        <td><a href="${pageContext.request.contextPath}/shoppingCart?id=<%=goods.getGoodsId() %>&name=<%= URLEncoder.encode( goods.getGoodsName() ,"utf-8")%>&desc=<%=goods.getGoodsDesc() %>&price=<%= goods.getGoodsPrice() %>&num=<%= goods.getGoodsNum()%>">添加到购物车</a></td>
    </tr>
    <%} %>
</table>

</body>
</html>
<!-- 登录界面-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/myServlet">
    <input type="text" name="username" placeholder="用户名">
    <input type="password" name="password" placeholder="密码">
    <input type="submit" value="确定">
</form>
</body>
</html>
这里补充一下jsp的概念
1. <%  代码 %>:定义的java代码,在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。
2. <%! 代码 %>:定义的java代码,在jsp转换后的java类的成员位置。
3. <%= 代码 %>:定义的java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。