<项目><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类
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>查看用户浏览过的商品的更多相关文章
- Cookie小案例-----记住浏览过的商品记录
Cookie小案例------记住浏览过的商品记录 我们知道,这个功能在电商项目中非经常见.这里处理请求和页面显示都是由servlet实现,主要是为了体现cookie的作用, 实现功能例如以下: 1, ...
- Linux查看用户和组命令
在Linux系统里,我们会经常用Linux查看用户的命令,在这里我们一些命令进行了总结,总共有7个,并做了详细的解释,以便让大家更深入的理解,接下来让我们一起来看看这些命令和具体应用. 一.Linux ...
- linux下添加删除,修改,查看用户和用户组
一.组操作 1.创建组: groupadd test #增加一个test组 2.修改组 groupmod -n test2 test #将test组的名子改成test2 3.删除组 groupdel ...
- Hadoop项目实战-用户行为分析之分析与设计
1.概述 本课程的视频教程地址:<用户行为分析之分析与设计> 下面开始本教程的学习,本教程以用户行为分析案例为基础,带着大家对项目的各个指标做详细的分析,对项目的整体设计做合理的规划,让大 ...
- [原]Jenkins(十四)---jenkins示例:admin管理所有项目,新建用户只能看部分项目
/** * lihaibo * 文章内容都是根据自己工作情况实践得出. *如有错误,请指正 * 版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horiz ...
- 【SSH网上商城项目实战09】添加和更新商品类别功能的实现
转自:https://blog.csdn.net/eson_15/article/details/51347734 上一节我们做完了查询和删除商品的功能,这一节我们做一下添加和更新商品的功能. 1. ...
- vue中前进刷新、后退缓存用户浏览数据和浏览位置的实践
vue中前进刷新.后退缓存用户浏览数据和浏览位置的实践 2018年07月07日 11:58:40 大灰狼的小绵羊哥哥 阅读数:4492 vue中,我们所要实现的一个场景就是: 1.搜索页面==&g ...
- 编写Java程序,用户在网上购买商品(good),当用户买了一本书(book)、一顶帽子(hat)或者买了一双鞋子(shoe),卖家就会通过物流将商品邮寄给用户,使用简单工厂模式模拟这一过程。
查看本章节 查看作业目录 需求说明: 编写Java程序,用户在网上购买商品(good),当用户买了一本书(book).一顶帽子(hat)或者买了一双鞋子(shoe),卖家就会通过物流将商品邮寄给用户, ...
- Python基础-三次用户验证登录购买商品程序
需求: 一:三次登录锁定 1.用户信息存放于文件中 2.尝试三次都失败,锁定用户 二.购物车功能要求: 要求用户输入总资产,例如:2000显示商品列表,让用户根据序号选择商品,加入购物车购买,如果商品 ...
随机推荐
- ES6学习笔记(1)----let和const命令
参考书<ECMAScript 6入门>http://es6.ruanyifeng.com/ let和const命令 let 总结1.声明变量基本使用方法与var 相同 不同点 a.在代 ...
- 1.了解Objective-C语言
了解Objective-C语言 ** Objective-C 语言是"消息结构"(messaging structure) 类似C++ .Java 是"函数调用" ...
- PPTP的搭建
一.准备 1.检查是否支持pptp modprobe ppp-compress-18 && echo yes yes支持 2.是否开启tun cat /dev/net/tun 返回ca ...
- photoshop cs6安装和破解步骤
http://tieba.baidu.com/p/4791130877 http://www.frontopen.com/1181.html
- incremental linking(增量链接)的作用
转:incremental linking(增量链接)的作用 今天编译一个C++程序时,报了一个奇怪的错误(之前是好好的): 1>LINK : fatal error LNK1123: fail ...
- JavaSE-08 封装
学习要点 封装 访问控制符 包 封装 没有封装的代码有何缺陷? 例如:对狗狗的健康值赋值为-100.如何避免?——使用封装. 封装的概念 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该 ...
- PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (一) -- 安装 AMQP 扩展和 Direct Exchange 模式
Windows 安装 amqp 扩展 RabbitMQ 是基于 amqp(高级消息队列协议) 协议的.使用 RabbitMQ 前必须为 PHP 安装相应的 amqp 扩展. 下载相应版本的 amqp ...
- Java代码的编译和执行
Java代码编译和执行的整个过程包含了以下三个重要的机制: (1)Java源码编译机制 (2)类加载机制 (3)类执行机制 1.Java代码编译是由Java源码编译器来完成,流程图: Java 源码编 ...
- jquery attr的属性
在JS中设置节点的属性与属性值用到setAttribute(),获得节点的属性与属性值用到getAttribute(),而在jquery中,用一个attr()就可以全部搞定了,赞一个先 ^^ jque ...
- 排序算法小结:C++实现
#include<vector> #include<iostream> //排序算法的稳定性:对于相同的关键字,排序之前的位置和排序之后的位置相同,则称为稳定排序,否则不稳定排 ...