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

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类

 public class ProductDao {
private static List<Product> data = new ArrayList<Product>();
//初始化商品
static{
//只执行一次
for(int i=1;i<=10;i++){
data.add(new Product(""+i,"笔记本"+i,"LLS00"+i,2300.0+i*300));
}
}
//提供查找所有商品的方法
public List<Product> findAll(){
return data;
}
//根据编号查找商品
public Product findById(String id){
for (Product p : data) {
if(p.getId().equals(id)){
return p;
}
}
return null;
}
}

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.根据编号查询相对应的商品

 if(cookies!=null){
html += "<table align='center'><tr><th>最近浏览过的商品</th></tr>";
for (Cookie cookie : cookies) {
if(cookie.getName().equals("prodHist")){
String prodHist = cookie.getValue(); // 3,2,1
String[] ids = prodHist.split(",");
//遍历浏览过的商品id
for (String id : ids) {
//查询数据库,查询对应的商品
Product p = dao.findById(id);
//显示到浏览器
html += "<tr><td>"+p.getId()+"</td><td>"+p.getProName()+"</td><td>"+p.getPrice()+"</td></tr>";
}
}
}
html += "</table>";
}

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

<项目><day11>查看用户浏览过的商品的更多相关文章

  1. Cookie小案例-----记住浏览过的商品记录

    Cookie小案例------记住浏览过的商品记录 我们知道,这个功能在电商项目中非经常见.这里处理请求和页面显示都是由servlet实现,主要是为了体现cookie的作用, 实现功能例如以下: 1, ...

  2. Linux查看用户和组命令

    在Linux系统里,我们会经常用Linux查看用户的命令,在这里我们一些命令进行了总结,总共有7个,并做了详细的解释,以便让大家更深入的理解,接下来让我们一起来看看这些命令和具体应用. 一.Linux ...

  3. linux下添加删除,修改,查看用户和用户组

    一.组操作 1.创建组: groupadd test #增加一个test组 2.修改组 groupmod -n test2 test #将test组的名子改成test2 3.删除组 groupdel ...

  4. Hadoop项目实战-用户行为分析之分析与设计

    1.概述 本课程的视频教程地址:<用户行为分析之分析与设计> 下面开始本教程的学习,本教程以用户行为分析案例为基础,带着大家对项目的各个指标做详细的分析,对项目的整体设计做合理的规划,让大 ...

  5. [原]Jenkins(十四)---jenkins示例:admin管理所有项目,新建用户只能看部分项目

    /** * lihaibo * 文章内容都是根据自己工作情况实践得出. *如有错误,请指正 * 版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horiz ...

  6. 【SSH网上商城项目实战09】添加和更新商品类别功能的实现

    转自:https://blog.csdn.net/eson_15/article/details/51347734 上一节我们做完了查询和删除商品的功能,这一节我们做一下添加和更新商品的功能. 1.  ...

  7. vue中前进刷新、后退缓存用户浏览数据和浏览位置的实践

    vue中前进刷新.后退缓存用户浏览数据和浏览位置的实践 2018年07月07日 11:58:40 大灰狼的小绵羊哥哥 阅读数:4492   vue中,我们所要实现的一个场景就是: 1.搜索页面==&g ...

  8. 编写Java程序,用户在网上购买商品(good),当用户买了一本书(book)、一顶帽子(hat)或者买了一双鞋子(shoe),卖家就会通过物流将商品邮寄给用户,使用简单工厂模式模拟这一过程。

    查看本章节 查看作业目录 需求说明: 编写Java程序,用户在网上购买商品(good),当用户买了一本书(book).一顶帽子(hat)或者买了一双鞋子(shoe),卖家就会通过物流将商品邮寄给用户, ...

  9. Python基础-三次用户验证登录购买商品程序

    需求: 一:三次登录锁定 1.用户信息存放于文件中 2.尝试三次都失败,锁定用户 二.购物车功能要求: 要求用户输入总资产,例如:2000显示商品列表,让用户根据序号选择商品,加入购物车购买,如果商品 ...

随机推荐

  1. 实现通知栏Notification

    课程Demo public class MainActivity extends Activity implements OnClickListener{ NotificationManager ma ...

  2. 'NSUnknownKeyException' … setValue:forUndefinedKey:]: …not key value coding compliant

    解决一个问题: 当我添加一个IBout, 报了如下错误 NSUnknownKeyException' … setValue:forUndefinedKey:]: …not key value codi ...

  3. 搜索可用docker镜像

    简介:这一步的目标是学会使用docker search命令来检索可用镜像. 搜索可用的docker镜像 目标: 提示: 正确的命令: 搜索可用的docker镜像 使用docker最简单的方式莫过于从现 ...

  4. SQL Server调试存储过程

      一.   调试SQL   Server   2000 1.   设置帐户. <1>   在windows服务中找到MSSQLSERVER,双击弹出对话框. <2>   选择 ...

  5. ASP.NET控件的ID,ClientID,UniqueId的区别

    一般情况下三者相同(没有父控件) ID:获取或设置分配给服务器控件的编程标识符.分配给控件的编程标识符. (可写) 设置服务器控件上的此属性可提供对服务器控件的属性.事件和方法的编程访问.Web 开发 ...

  6. linux centos 下php的mcrypt扩展

    去http://www.sourceforge.net下载Libmcrypt,mhash,mcrypt安装包 libmcrypt(libmcrypt-2.5.8.tar.gz ):mcrypt(mcr ...

  7. Ubuntu 几个常用的更新命令

    apt-cache search package 搜索包 apt-cache show package 获取包的相关信息,如说明.大小.版本等 sudo apt-get install package ...

  8. Android(java)学习笔记192:ContentProvider使用之虚拟短信

    1.虚拟短信应用场景:   急着脱身?应付老婆(老公.男女朋友查岗)?   使用虚拟通话短信吧.您只需通过简单设置,软件就会在指定时间会模拟一个“真实”来电或短信来迷惑对方,通过“真实”的证据让对方相 ...

  9. SourceTree 常用操作

    1.Sourcetree 每次拉取提交都需要输入密码(是有多个项目,他们的账户不一样) 输入以下命令: git config --global credential.helper osxkeychai ...

  10. vue脚手架工具vue-cli

    一.什么 是脚手架工具vue-cli? 类似于工人手里面的脚手架一样,帮助工人搭架子用,同样的vue脚手架工具也是帮助我们更好更快速的开发代码的工具 二.vue-cli能做什么? 三.vue-cli安 ...