<项目><day11>查看用户浏览过的商品
<项目>查看用户浏览过的商品
1.创建一个entity包储存实体对象
1.1创建一个Product的类存储实体对象
对象具有以下属性,并添加set和get方法,含参和不含参的构造方法,toString方法
private String id; private String proName; private String proType; private double price;
2.创建一个Dao包储存实体对象的操作方法
2.1创建一个存放所有对Product对象的CRUD方法的ProductDao类
1 public class ProductDao { 2 private static List<Product> data = new ArrayList<Product>(); 3 //初始化商品 4 static{ 5 //只执行一次 6 for(int i=1;i<=10;i++){ 7 data.add(new Product(""+i,"笔记本"+i,"LLS00"+i,2300.0+i*300)); 8 } 9 } 10 //提供查找所有商品的方法 11 public List<Product> findAll(){ 12 return data; 13 } 14 //根据编号查找商品 15 public Product findById(String id){ 16 for (Product p : data) { 17 if(p.getId().equals(id)){ 18 return p; 19 } 20 } 21 return null; 22 } 23 }
3.创建一个Servlet包存放servlet程序
3.1创建一个ListServlet来显示所有商品列表
作用:
1.从"数据库"中读取商品列表信息
ProductDao dao = new ProductDao(); List<Product> list = dao.findAll();
2.把商品列表信息显示到浏览器中
PrintWriter writer = response.getWriter(); String html = ""; html += "<html><head><title>显示商品列表</title></head>"; html += "<body><center><h1>所有商品</h1></center><table border='1' align='center'>"; html += "<tr><th>编号</th><th>商品名称</th><th>商品型号</th><th>商品价格</th></tr>"; //遍历商品 for (Product product : list) { // /day11_pro/DetailServlet?id=1 访问DetailSErvlet的servlet程序,同时传递 名为id,值为1 的参数 html += "<tr><td>"+product.getId()+"</td><td><a href='/day11_pro/DetailServlet?id="+product.getId()+"'>"+product.getProName()+"</a></td><td>"+product.getProType()+"</td><td>"+product.getPrice()+"</td></tr>"; } html += "</table>";
html +="</html>";
writer.write(html)
3.接受cookie信息,取出prodHist的cookie
cookie[] cookies = request.getCookies();
4.根据编号查询相对应的商品
1 if(cookies!=null){ 2 html += "<table align='center'><tr><th>最近浏览过的商品</th></tr>"; 3 for (Cookie cookie : cookies) { 4 if(cookie.getName().equals("prodHist")){ 5 String prodHist = cookie.getValue(); // 3,2,1 6 String[] ids = prodHist.split(","); 7 //遍历浏览过的商品id 8 for (String id : ids) { 9 //查询数据库,查询对应的商品 10 Product p = dao.findById(id); 11 //显示到浏览器 12 html += "<tr><td>"+p.getId()+"</td><td>"+p.getProName()+"</td><td>"+p.getPrice()+"</td></tr>"; 13 } 14 } 15 } 16 html += "</table>"; 17 }
5.把商品显示到浏览过的商品列表
3.2创建一个DetailServlet来显示商品详细信息
作用:
1.根据编号查询对应的商品
//接受获取到的编号 String id = request.getParameter("id"); //查询编号所对应的商品 ProductDao dao = new ProductDao(); Product product = dao.findById(id);
2.显示商品到浏览器
//将商品的详细信息显示到浏览器中 PrintWriter writer = response.getWriter(); String html = ""; html += "<html><head><title>商品详细信息</title></head>"; html += "<body><center><h1>详细信息</h1></center><table border='1' align='center'>"; html += "<tr><th>编号</th><td>"+product.getId()+"</td></tr>"; html += "<tr><th>商品名称</th><td>"+product.getProName()+"</td></tr>"; html += "<tr><th>商品型号</th><td>"+product.getProType()+"</td></tr>"; html += "<tr><th>商品价格</th><td>"+product.getPrice()+"</td></tr>"; html += "</table>"; html += "<center><a href='"+request.getContextPath()+"/ListServlet'>[返回列表]</a>"; html +="</html>"; writer.write(html);
3.创建cookie,名为prodHist
//1.创建cookie Cookie cookie = new Cookie("prodHist",creatValue(request,id)); cookie.setMaxAge(1*30*24*60*60);
3.1分析思路
生成cookie的值 分析: 当前cookie值 传入商品id 最终cookie值 null或没有prodHist 1 1 (算法: 直接返回传入的id ) 1 2 2,1 (没有重复且小于3个。算法:直接把传入的id放最前面 ) 2,1 1 1,2(有重复且小于3个。算法:去除重复id,把传入的id放最前面 ) 3,2,1 2 2,3,1(有重复且3个。算法:去除重复id,把传入的id放最前面) 3,2,1 4 4,3,2(没有重复且3个。算法:去最后的id,把传入的id放最前面)
3.2生成cookie的值
Cookie[] cookies = request.getCookies(); String prodHist = null; if(cookies!=null){ for (Cookie cookie : cookies) { if(cookie.getName().equals("prodHist")){ prodHist = cookie.getValue(); break; } } } //null或没有prodHist if(cookies==null || prodHist==null){ //直接返回传入的id return id; } //String -> String[] -> Collection :为了方便判断重复id String[] ids = prodHist.split(","); Collection coll = Arrays.asList(ids); // LinkedList 方便地操作(增删改元素)集合 // Collection -> LinkedList LinkedList list = new LinkedList(coll); //不超过3个 if(list.size()<3){ //id重复 if(list.contains(id)){ //去除重复id,把传入的id放在最前面 list.remove(id); list.addFirst(id); }else{ //直接把传入的id放前面 list.addFirst(id); } }else{ //等于3个 //id重复 if(list.contains(id)){ //去除重复id,把传入的id放最前面 list.remove(id); list.addFirst(id); }else{ //去最后的id,把传入的id放最前面 list.removeLast(); list.addFirst(id); } } // LinedList -> String StringBuffer sb = new StringBuffer(); for (Object object : list) { sb.append(object+","); } //去掉最后的逗号 String result = sb.toString(); result = result.substring(0, result.length()-1);
4.把cookie发送到浏览器保存
response.addCookie(cookie);