查看用户浏览过的商品

原文链接: http://www.cnblogs.com/liangshandada/p/5449231.html

<项目>查看用户浏览过的商品

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);

转载于:https://www.cnblogs.com/liangshandada/p/5449231.html

猜你喜欢

转载自blog.csdn.net/weixin_30500473/article/details/94792971