使用Session完成简单的购物功能
- 我们还是以书籍为例,所以可以copy“显示浏览过的商品“例子部分的代码。
response.setContentType("text/html;charset=UTF-8"); PrintWriter printWriter = response.getWriter(); printWriter.write("网页上所有的书籍:" + "<br/>"); //拿到数据库所有的书 LinkedHashMap<String, Book> linkedHashMap = DB.getAll(); Set<Map.Entry<String, Book>> entry = linkedHashMap.entrySet(); //显示所有的书到网页上 for (Map.Entry<String, Book> stringBookEntry : entry) { Book book = stringBookEntry.getValue(); String url = "/ouzicheng/Servlet6?id=" + book.getId(); printWriter.write(book.getName()); printWriter.write("<a href='" + url + "'>购买</a>"); printWriter.write("<br/>"); }
在购物车页面上,获取到用户想买的书籍【用户可能不单想买一本书,于是乎,就用一个List容器装载书籍】,有了:先遍历Cookie,再判断是否是第一次访问Servlet的逻辑思路,我们就可以先获取到Session的属性,如果Session的属性为null,那么就是还没有该属性
//得到用户想买书籍的id String id = request.getParameter("id"); //根据书籍的id找到用户想买的书 Book book = (Book) DB.getAll().get(id); //获取到Session对象 HttpSession httpSession = request.getSession(); //由于用户可能想买多本书的,所以我们用一个容器装着书籍 List list = (List) httpSession.getAttribute("list"); if (list == null) { list = new ArrayList(); //设置Session属性 httpSession.setAttribute("list",list); } //把书籍加入到list集合中 list.add(book);
按我们正常的逻辑思路:先创建一个ArrayList对象,把书加到list集合中,然后设置Session的属性。这样是行不通的。每次Servlet被访问的时候都会创建一个ArrayList集合,书籍会被分发到不同的ArrayList中去。所以下面的代码是不行的!
//得到用户想买书籍的id String id = request.getParameter("id"); //根据书籍的id找到用户想买的书 Book book = (Book) DB.getAll().get(id); //获取到Session对象 HttpSession httpSession = request.getSession(); //创建List集合 List list = new ArrayList(); list.add(book); httpSession.setAttribute("list", list);
既然用户已经购买了书籍,那么也应该给提供页面显示用户购买过哪些书籍
//得到用户想买书籍的id String id = request.getParameter("id"); //根据书籍的id找到用户想买的书 Book book = (Book) DB.getAll().get(id); //获取到Session对象 HttpSession httpSession = request.getSession(); //由于用户可能想买多本书的,所以我们用一个容器装着书籍 List list = (List) httpSession.getAttribute("list"); if (list == null) { list = new ArrayList(); //设置Session属性 httpSession.setAttribute("list",list); } //把书籍加入到list集合中 list.add(book); String url = "/ouzicheng/Servlet7"; response.sendRedirect(url);
列出用户购买过的书籍
//要得到用户购买过哪些书籍,得到Session的属性遍历即可 HttpSession httpSession = request.getSession(); List<Book> list = (List) httpSession.getAttribute("list"); if (list == null || list.size() == 0) { printWriter.write("对不起,你还没有买过任何商品"); } else { printWriter.write("您购买过以下商品:"); printWriter.write("<br/>"); for (Book book : list) { printWriter.write(book.getName()); printWriter.write("<br/>"); } }
- 效果如下