一. Session简介
1. Session是基于Cookie的一种会话机制。 Cookie是服务器返回一小份数据给客户端, 并且存放在客户端上。Session数据存放在服务器端。
2. Session常用API
2.1. 得到会话ID: String id = session.getId();
2.2. 存值: session.setAttribute(name, value);
2.3. 取值: session.getAttribute(name);
2.4. 移除值: session.removeAttribute(name);
2.5. 强制干掉会话, 里面存放的任何数据就都没有了: session.invalidate();
3. Session何时创建: 如果有在servlet里面调用了request.getSession()就创建了一个Session。
4. Session何时销毁
4.1. session 是存放在服务器的内存中的一份数据, 即使关了浏览器, session也不会销毁。
4.2. 关闭服务器session销毁。
4.3. session会话时间过期。session默认有效期是30分钟。
4.4. 主动调用session.invalidate()或者session.removeAttribute(name)清除session。
二. Session购物车实例
1. 新建一个UseSession的Web工程
2. 在WebContent下新建一个index.html
3. 编辑index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>商品列表</title>
</head>
<body>
<a href="CartServlet.action?name=华为">华为</a><br/>
<a href="CartServlet.action?name=小米">小米</a><br/>
<a href="CartServlet.action?name=vivo">vivo</a><br/>
<a href="CartServlet.action?name=金立">金立</a><br/>
<a href="CartServlet.action?name=魅族">魅族</a><br/>
<a href="CartServlet.action?name=oppo">oppo</a><br/>
</body>
</html>
4. 新建CartServlet.java和ClearCartList.java
5. 编辑CartServlet.java
package com.lywgames.myservlet;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CartServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取商品id
String name = new String(req.getParameter("name").getBytes("ISO8859-1"), "UTF-8");
// 获取session中的cartlist
@SuppressWarnings("unchecked")
Map<String, Integer> cartlist = (Map<String, Integer>)req.getSession().getAttribute("cartlist");
// 如果cartlist为空, session中还没有购物车
if(cartlist == null){
cartlist = new HashMap<String, Integer>();
cartlist.put(name, 1);
}else{
cartlist.put(name, cartlist.get(name) == null ? 1 : cartlist.get(name) + 1);
}
req.getSession().setAttribute("cartlist", cartlist);
resp.setContentType("text/html;charset=utf-8");
StringBuffer sb = new StringBuffer();
sb.append("<!DOCTYPE html>").append("\r\n");
sb.append("<html>").append("\r\n");
sb.append("<head>").append("\r\n");
sb.append("<meta charset='UTF-8'>").append("\r\n");
sb.append("<title>购物车</title>").append("\r\n");
sb.append("</head>").append("\r\n");
sb.append("<body>").append("\r\n");
for (Entry<String, Integer> kv : cartlist.entrySet()) {
sb.append("<h3>").append(kv.getKey()).append(": ").append(kv.getValue()).append("</h3>").append("\r\n");
}
sb.append("<h1><a href='index.html'>继续购物</a></h1>").append("\r\n");
sb.append("<h1><a href='ClearCartList.action'>清空购物车</a></h1>").append("\r\n");
sb.append("</body>").append("\r\n");
sb.append("</html>").append("\r\n");
resp.getWriter().println(sb.toString());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
6. 编辑ClearCartList.java
package com.lywgames.myservlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ClearCartList extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 清楚cartlist的session缓存
req.getSession().removeAttribute("cartlist");
resp.sendRedirect("index.html");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
7. 编辑web.xml
8. 部署运行
9. 点击几个手机, 有的手机多点击几次, 到购物车页面查看
10. 点击清空购物车, 清空cartlist的session缓存, 继续购物
11. 点击华为, 新的购物车信息