一:首先完成购物需要三个功能:1,显示商店商品信息 ;2,购物车完成购买;3,显示购物车里商品信息。要求:当浏览器关闭再次打开时 能够显示上次购物车的信息。这里就利用了Session的原理实现了。(当浏览器向服务器发送请求,调用request.getSession(),就会创建一个Session对象,同时服务器也向浏览器 即客户端发送一个无生命周期的Cookie,其名称为:JSESSIONID,当浏览器如果再次打开并发送请求时,先带着sessionid 查看服务器是否有符合的session 如果有就调用服务器缓存中的Session对象 如果没有就再次生成一个session对象 不过因为服务器发送的保存Session的id的Cookie没有生命周期,所以如果想让其有生命周期,必须重写Cookie 且名称要和服务器发送的一致)。


实现:


这里没有用到数据库,用了一个工具类来代替数据库。


public class Book {
 private String id;
 private String name;
 private String author;
 
 public Book(String id, String name, String author) {
  this.id = id;
  this.name = name;
  this.author = author;
 }
 public Book() {
  
 }
 public String getId() {
  return id;
 }
 public void setId(String id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getAuthor() {
  return author;
 }
 public void setAuthor(String author) {
  this.author = author;
 }

}
class WebUtil{
 private static Map map=new HashMap();
 //静态代码块儿是类被装载时就执行的部分。
 static{
    map.put("1", new Book("1","javaWeb编程","李兴华"));
    map.put("2", new Book("2","Struts2编程",);
    map.put("3", new Book("3","Spring2.0","李勇"));
  
 }
 public static Map getBooks(){
  return map;
 }
 
}

//1 ,显示商店商品信息:

ublic class SessionDemo1 extends HttpServlet {
/* 1,显示所有商品
 * 
 * (non-Javadoc)
 * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
 */
 
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  request.setCharacterEncoding("gb2312");
  response.setCharacterEncoding("gb2312");
        response.setContentType("text/html;charset=gb2312");
        PrintWriter writer=response.getWriter();
        writer.write("网站商品有:<br/>");
        Map map=WebUtil.getBooks();
        Iterator<String> it=map.keySet().iterator();
        while(it.hasNext()){
         String key= it.next();
         Book book=(Book) map.get(key);
            writer.write("<a href=/Day3/servlet/SessionDemo2?bookid="+book.getId()+" target=_blank>"+book.getName()+"</a><br/>");
         
        }
 }

public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {

       doGet(request,response);
 }

}

//购物车实现:


import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
//完成购物车,将商品放入购物车里
public class SessionDemo2 extends HttpServlet {
    
 
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
          String bookid=request.getParameter("bookid");
          Book book=(Book) WebUtil.getBooks().get(bookid);
          //将商品放入一个集合里 然后再将集合放入session中  完成购物车的功能
          //1,首先从session中获取购物车,然后将商品放入其中,
          HttpSession session=request.getSession();
          List cart=(List) session.getAttribute("cart");
          //2,判断session是否有购物车 如果没有就声明一个集合 并放入session中 生成购物车
          if(cart==null){
           cart=new ArrayList();
           session.setAttribute("cart", cart);
          }
          cart.add(book);

          //下面代码功能是为了实现浏览器关闭后再打开仍然可以查看购物车信息。
          String JSESSIONID_VALUE=session.getId();//服务器发送给浏览器的Cookie名称为:JSESSIONID
          Cookie cookie=new Cookie("JSESSIONID",JSESSIONID_VALUE);
          cookie.setMaxAge(60*5);
          response.addCookie(cookie);
          
          //重定向到显示购物车商品信息的页面上去
          response.sendRedirect("/Day3/servlet/SessionDemo3");
  
 }

 
 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
           doGet(request,response);
  
 }

}


//显示购物车商品信息:

public class SessionDemo3 extends HttpServlet {
    //显示购物车商品信息
 
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  request.setCharacterEncoding("gb2312");
  response.setCharacterEncoding("gb2312");
        response.setContentType("text/html;charset=gb2312");
        
           HttpSession session=request.getSession();
     List cart= (List) session.getAttribute("cart");
     PrintWriter writer=response.getWriter();
     writer.write("你买的商品有这些:<br/>");
     Iterator its=cart.iterator();
     if(cart!=null){
      while(its.hasNext()){
       Book book=(Book) its.next();
       writer.write("<a href=/Day3/servlet/SessionDemo4?bookid="+book.getId()+" target=_blank>"+book.getName()+"</a><br/>");
       
      }
      
     }
 }

 
 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {

    doGet(request,response);
 }

}


//显示商品的详细信息。

public class SessionDemo4 extends HttpServlet {

 
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  request.setCharacterEncoding("gb2312");
  response.setCharacterEncoding("gb2312");
        response.setContentType("text/html;charset=gb2312");
        PrintWriter writer=response.getWriter();
        
        String bookid=request.getParameter("bookid");
        
        Book book=(Book) WebUtil.getBooks().get(bookid);
        writer.write("商品的详细信息为:</br>");
        writer.write("作者:"+book.getAuthor()+"</br>");
        writer.write("书名:"+book.getName()+"</br>");
        writer.write("编号:"+book.getId()+"</br>");
        
  
 }

 
 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {

  
 }

}

注意细节:在黄色区域的前面必须有空格,即target=_blank 前面一定要留空格 不然老出现报错 我检查了老长时间才发现是这里出现了问题。