在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象).
注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
Cookie是把用户的数据写给用户的浏览器。
Session技术把用户的数据写到用户独占的session中。
Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。
1.Session的实现是依赖Cookie实现的
2.用户第一次访问网页时 系统会为这个用户 创建一个 独立的Session出来 并且会为Session分配一个id号
3.当请求完成 响应回浏览器时 系统会创建一个Cookie出来 Cookie中会保存着SessionId
4.浏览器接到响应 会把响应中的Cookie 储存到浏览器中 (相当于储存了SessionId)
5.当用户再次访问网页时 请求中会携带着这个Cookie(带着id去请求)
6.网页接到这个请求后 会取出Cookie的id去找对应的Session 如果找到就直接使用 未找到 创建新的出来
界面
1.列表页 显示所有商品
2.添加页面 显示添加成功
3.购物车页面 显示添加到购物车中的商品详尽信息
4.注销购物车页面 显示注销成功
1.列表页
public class ShowAllBooks extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
// 回写
PrintWriter writer = response.getWriter();
// 获取书的集合
HashMap map = BookUtil.getBookMap();
for (String key : map.keySet()) {
// 获取所有书
Book book = map.get(key);
// 将所有书的名字写到网页上
// 工程的路径 可以使用相对路径
// 打印出来就是工程的名字 /sh-web-04
// request.getContextPath()
writer.write(""+book.getBookName()+"
");
}
// 查看购物车
writer.write("查看购物车
");
// 注销购物车
writer.write("注销购物车
");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
2.添加页面 显示添加成功
public class AddBook extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
// 将书添加到购物车
// 获取请求路径中的参数id的值
String id = request.getParameter("id");
// 获取要添加的书
Book book = BookUtil.getBookById(id);
// 保存到Session域中
HttpSession session = request.getSession();
// 保存多本书 声明一个集合保存书
// Session中直接保存这个书的容器
// 1.第一次存 这个保存书的容器还不存在(去创建)
// 2.容器已经存在 从Session中把容器取出来 把书再添加一遍
ArrayList bookList = (ArrayList) session.getAttribute("bookList");
// 判断容器是不是空的
if (bookList == null) {
// 第一次存 创建容器
bookList = new ArrayList<>();
}
// 不是第一次存
bookList.add(book);
// 把容器重新添加到Session中
session.setAttribute("bookList", bookList);
// 显示添加成功
response.getWriter().write("添加: " + book.getBookName() + " 成功");
;
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
3.购物车页面 显示添加到购物车中的商品详尽信息
public class ShowCar extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
// 显示购物车内容
PrintWriter writer = response.getWriter();
// 获取Session
HttpSession session = request.getSession();
// 获取Session中的容器
ArrayList list = (ArrayList) session.getAttribute("bookList");
if (list == null) {
// 购物车是空的
writer.write("木有");
response.setHeader("refresh", "3;url=" + request.getContextPath() + "/showAllBooks");
} else {
// 输出商品信息
for (Book book : list) {
writer.write(book.getBookName() + "
");
}
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
4.注销购物车页面 显示注销成功
public class CancelCar extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
// Session中的方法
// 设置Session有效时间 秒为单位
// 设置0或者负数 这时Session将永不过期
// session.setMaxInactiveInterval(60*30);
// 让Session失效(注销用户信息)
// session.invalidate();
HttpSession session = request.getSession();
session.invalidate();
// 显示注销成功
response.getWriter().write("注销成功");
// 返回
response.setHeader("refresh", "3;url=" + request.getContextPath() + "/showAllBooks");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
5.Book类
public class Book implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1910937047790721226L;
private String id;
private String bookName;
public Book() {
super();
}
public Book(String id, String bookName) {
super();
this.id = id;
this.bookName = bookName;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
@Override
public String toString() {
return "Book [id=" + id + ", bookName=" + bookName + "]";
}
}
6.模拟数据类
public class BookUtil {
// 声明一个容器 保存书(初始化)
private static HashMap map = new HashMap<>();
// 添加一次假数据就行
static {
// 添加四本书
map.put("1", new Book("1", "葵花宝典"));
map.put("2", new Book("2", "九阴真经"));
map.put("3", new Book("3", "辟邪剑谱"));
map.put("4", new Book("4", "玉女心经"));
}
// 构造方法私有化
private BookUtil() {
}
// 获取容器的方法
public static HashMap getBookMap(){
return map;
}
// 通过id获取对应书的方法
public static Book getBookById(String id) {
return map.get(id);
}
}
Session的钝化和活化
钝化: 就是将Session写入到文件中
活化: 将写到文件中的Session读回对象中
服务器突然停止了 这时session中的信息不会消失 会写到文件中
work/Catalina/localhost/工程下/SESSION.ser
当服务器启动 系统会从这个文件夹下 把session读回来
通过钝化和活化 来保证 你的Session中存的数据安全
活化后 之前钝化保存的文件读取就消失了
注意: 保存在session中的对象一定要实现序列化接口