一个小小购物车案例
改项目用到cookie技术和session技术的综合运用,以及分别用cookie和session达到不同的功能,模拟一个简单的购物车,登录、浏览商品、以及购买的过程。一下是案例:
用cookie编写的代码: BookList.java package com.cookie; import java.io.IOException; import java.io.PrintWriter; 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 com.dao.BookDao; import com.domain.Book; public class BookList extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.显示所有书名 response.setContentType("text/html;charset=UTF-8"); PrintWriter pw = response.getWriter(); BookDao book = new BookDao(); pw.print("<h1>本网站的商品有:</h1>"); List<Book> list = book.getAll(); for(Book book1:list){ pw.print("<a href='BookBack?id="+book1.getId()+"'target='_blank'>"+book1.getName()+"</a><br>"); } //2.显示浏览过的书名 pw.write("<h1>您最近浏览过的商品有:</h1>"); Cookie[] cookie = request.getCookies(); for(int i=0; cookie!=null && i<cookie.length;i++){ if(cookie[i].getName().equals("bookshop")){ String[] id = cookie[i].getValue().split("_"); for(String str:id){ Book books = book.getBook(str); pw.print(books.getName()+"<br/>"); } } } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } Bookback.java package com.cookie; import java.io.IOException; import java.io.PrintWriter; import java.util.Arrays; import java.util.LinkedList; 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 com.dao.BookDao; import com.domain.Book; public class BookBack extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //显示书的详细信息,根据id获取 response.setContentType("text/html;charset=UTF-8"); PrintWriter pw = response.getWriter(); String id = request.getParameter("id"); BookDao bd = new BookDao(); Book book2 = bd.getBook(id); pw.print("书号:"+book2.getId()+"<br>"); pw.print("书名:"+book2.getName()+"<br>"); pw.print("作者:"+book2.getAuthor()+"<br>"); pw.print("描述:"+book2.getDescribe()+"<br>"); //将书号写入cookie,有三种情况 //bookhistory=2,3,1 1 1,2,3 (已存在,删除后面的加前面) //bookhistory=2,3,5 1 1,2,3 (三个删后面) //bookhistory=2,3 1 1,2,3(两个直接添加) String cookieValue = BuildCookieValue(id,request); Cookie cookie = new Cookie("bookshop",cookieValue); cookie.setMaxAge(30*24*3600); cookie.setPath("/BookShop"); response.addCookie(cookie); } private String BuildCookieValue(String id, HttpServletRequest request) { String bookshop = null; Cookie[] cookies = request.getCookies(); for(int i=0;cookies!=null&&i<cookies.length;i++){ if(cookies[i].getName().equals("bookshop")){ bookshop = cookies[i].getValue(); } } if(bookshop==null){ return id; } LinkedList<String> list = new LinkedList<String>(Arrays.asList(bookshop.split("_"))); if(list.contains(id)){ list.remove(id); list.addFirst(id); } else if(list.size()>=3){ list.removeLast(); list.addFirst(id); } else{ list.addFirst(id); } StringBuffer sb = new StringBuffer(); for(String ids:list){ sb.append(ids+"_"); } return sb.deleteCharAt(sb.length()-1).toString(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } BookDao.java package com.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import com.domain.Book; import com.util.DBManager; public class BookDao { private Connection con = null; private PreparedStatement ps = null; private ResultSet rs = null; //查询所有书的方法 public List<Book> getAll(){ List<Book> list = new ArrayList<Book>(); String sql = "select * from book"; con = DBManager.getConnection(); try { ps = con.prepareStatement(sql); rs = ps.executeQuery(); while(rs.next()){ Book book = new Book(); book.setId(rs.getString("id")); book.setName(rs.getString("name")); book.setAuthor(rs.getString("author")); book.setDescribe(rs.getString("describe")); list.add(book); } } catch (SQLException e) { e.printStackTrace(); }finally{ DBManager.closeDB(con, ps, rs); } return list; } //按id获取书 public Book getBook(String id){ Book book = null; con = DBManager.getConnection(); String sql = "select * from book where id=?"; try { ps = con.prepareStatement(sql); ps.setString(1, id); rs = ps.executeQuery(); if(rs.next()){ book = new Book(); book.setId(rs.getString("id")); book.setName(rs.getString("name")); book.setAuthor(rs.getString("author")); book.setDescribe(rs.getString("describe")); } } catch (SQLException e) { e.printStackTrace(); }finally{ DBManager.closeDB(con, ps, rs); } return book; } } UserDao.java package com.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import com.domain.User; import com.util.DBManager; public class UserDao { public User login(String username,String password){ User user = null; Connection con = null; PreparedStatement ps = null; ResultSet rs = null; String sql = "select username,password from user where username=? and password=?"; try { con = DBManager.getConnection(); ps = con.prepareStatement(sql); ps.setString(1,username); ps.setString(2,password); rs = ps.executeQuery(); while(rs.next()){ user = new User(); user.setUsername(rs.getString("username")); user.setPassword(rs.getString("password")); } } catch (SQLException e) { e.printStackTrace(); } return user; } } Book.java package com.domain; public class Book { private String id; private String name; private String author; private String describe; 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; } public String getDescribe() { return describe; } public void setDescribe(String describe) { this.describe = describe; } } User.java package com.domain; public class User { private String username; private String password; public User() { } public User(String username, String password) { super(); this.username = username; this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } DBManager.java package com.util; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; public class DBManager { /** * @param args */ static String driver; static String url; static String username; static String password; static { InputStream in = DBManager.class.getClassLoader().getResourceAsStream( "db.properties"); Properties pro = new Properties(); try { pro.load(in); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } driver = pro.getProperty("driver"); url = pro.getProperty("url"); username = pro.getProperty("username"); password = pro.getProperty("password"); try { Class.forName(driver); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static Connection getConnection() { Connection con = null; try { con = DriverManager.getConnection(url, username, password); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return con; } public static void closeDB(Connection con, Statement st, ResultSet rs) { if (rs != null) { try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (st != null) { try { st.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (con != null) { try { con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void main(String[] args) { getConnection(); } } package com.session; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.dao.BookDao; import com.domain.Book; import com.domain.User; public class BookCartList extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter pw = response.getWriter(); HttpSession hs = request.getSession(); User user = (User) hs.getAttribute("user"); //这里必须有if判断语句,否则注销的时候会提示你空指针错误 if(user != null){ pw.print("<h1>欢迎您:"+user.getUsername()+"</h1>"); } //注销登录链接 pw.print("<a href='/BookShop/login.html'>登录</a>"+" "); pw.print("<a href='/BookShop/Logout'>注销</a><br><br>"); pw.write("<h2>本商店有以下商品:</h2>"); BookDao bd = new BookDao(); List<Book> list = bd.getAll(); for(Book book:list){ String url = " /BookShop/BuyBook?id="+book.getId(); pw.print(book.getName()+" "+"<a href='"+url+"'>购买</a><br>"); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } package com.session; 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; import com.dao.BookDao; import com.domain.Book; public class BuyBook extends HttpServlet { @SuppressWarnings("unchecked") public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); String id = request.getParameter("id"); BookDao bd = new BookDao(); Book book = bd.getBook(id); HttpSession hs = request.getSession(); Cookie cookie = new Cookie("JSESSIONID",hs.getId()); cookie.setMaxAge(30*60); cookie.setPath("/BookShop"); response.addCookie(cookie); List<Book> list = (List<Book>) hs.getAttribute("cart"); if(list == null){ list = new ArrayList<Book>(); hs.setAttribute("cart",list); } list.add(book); String url = "/BookShop/ShowBook"; response.sendRedirect(url); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } package com.session; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CheckCode extends HttpServlet { private static final int WIDTH = 130; private static final int HEIGHT = 30; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.创建图片 BufferedImage image = new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB); // 2.得到图片 Graphics g = image.getGraphics(); // 3 对图片进行绘制 // a.设置图片的背景色 setBackGround(g); // c.添加干扰线 setRandomLine(g); // g.向图形中写数据 String checkcode = setRandomNum(g); request.getSession().setAttribute("imgcode", checkcode); // 4.把图片写给浏览器 response.setContentType("image/jpeg"); // 告诉浏览器不要缓存 response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); response.setIntHeader("Expires", -1); ImageIO.write(image, "JPEG", response.getOutputStream()); } private String setRandomNum(Graphics g) { g.setFont(new Font("宋体", Font.BOLD, 25)); Random random = new Random(); StringBuffer sb = new StringBuffer(); int x = 10; for (int i = 0; i < 4; i++) { // 产生随机数 String str = String.valueOf(random.nextInt(10)); sb.append(str); g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255))); int degree = random.nextInt() % 30; ((Graphics2D) g).rotate(degree * Math.PI / 180, x, 20); g.drawString(str, x, 20); ((Graphics2D) g).rotate(-degree * Math.PI / 180, x, 20); x += 30; } return sb.toString(); } private void setRandomLine(Graphics g) { g.setColor(Color.green); Random random = new Random(); for (int i = 0; i < 5; i++) { int x1 = random.nextInt(WIDTH); int y1 = random.nextInt(HEIGHT); int x2 = random.nextInt(WIDTH); int y2 = random.nextInt(HEIGHT); g.drawLine(x1, y1, x2, y2); } } private void setBackGround(Graphics g) { g.setColor(Color.WHITE); g.fillRect(0, 0, WIDTH, HEIGHT); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } package com.session; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.dao.UserDao; import com.domain.User; public class Login extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter pw = response.getWriter(); String username = request.getParameter("username"); String password = request.getParameter("password"); String checkcode = request.getParameter("checkcode"); String imgcode = (String) request.getSession().getAttribute("imgcode"); // 验证码判断 if (checkcode != null && imgcode != null && checkcode.equals(imgcode)) { UserDao ud = new UserDao(); User user = ud.login(username, password); if (user != null) { request.getSession().setAttribute("user", user); response.sendRedirect("/BookShop/BookCartList"); } pw.print("用户名或密码错误!!!"); } else { pw.print("验证码错误!!!"); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } package com.session; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class Logout extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession hs = request.getSession(false);//有session就获取没有也不创建 if(hs==null){ response.sendRedirect("/BookShop/BookCartList"); return; } hs.removeAttribute("user"); //此方法是使session失效hs.invalidate(); response.sendRedirect("/BookShop/BookCartList"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } package com.session; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.domain.Book; public class ShowBook extends HttpServlet { @SuppressWarnings("unchecked") public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter pw = response.getWriter(); List<Book> list = (List<Book>) request.getSession().getAttribute("cart"); pw.print("<h1>你购买的商品有:</h1>"); for(Book book:list){ pw.print(book.getName()+"<br>"); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }