实现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代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。
上一篇: NOIp系列题目及CF小结
下一篇: 「NOIP2016」蚯蚓