<项目><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显示商品列表,让用户根据序号选择商品,加入购物车购买,如果商品 ...
随机推荐
- 实现通知栏Notification
课程Demo public class MainActivity extends Activity implements OnClickListener{ NotificationManager ma ...
- 'NSUnknownKeyException' … setValue:forUndefinedKey:]: …not key value coding compliant
解决一个问题: 当我添加一个IBout, 报了如下错误 NSUnknownKeyException' … setValue:forUndefinedKey:]: …not key value codi ...
- 搜索可用docker镜像
简介:这一步的目标是学会使用docker search命令来检索可用镜像. 搜索可用的docker镜像 目标: 提示: 正确的命令: 搜索可用的docker镜像 使用docker最简单的方式莫过于从现 ...
- SQL Server调试存储过程
一. 调试SQL Server 2000 1. 设置帐户. <1> 在windows服务中找到MSSQLSERVER,双击弹出对话框. <2> 选择 ...
- ASP.NET控件的ID,ClientID,UniqueId的区别
一般情况下三者相同(没有父控件) ID:获取或设置分配给服务器控件的编程标识符.分配给控件的编程标识符. (可写) 设置服务器控件上的此属性可提供对服务器控件的属性.事件和方法的编程访问.Web 开发 ...
- linux centos 下php的mcrypt扩展
去http://www.sourceforge.net下载Libmcrypt,mhash,mcrypt安装包 libmcrypt(libmcrypt-2.5.8.tar.gz ):mcrypt(mcr ...
- Ubuntu 几个常用的更新命令
apt-cache search package 搜索包 apt-cache show package 获取包的相关信息,如说明.大小.版本等 sudo apt-get install package ...
- Android(java)学习笔记192:ContentProvider使用之虚拟短信
1.虚拟短信应用场景: 急着脱身?应付老婆(老公.男女朋友查岗)? 使用虚拟通话短信吧.您只需通过简单设置,软件就会在指定时间会模拟一个“真实”来电或短信来迷惑对方,通过“真实”的证据让对方相 ...
- SourceTree 常用操作
1.Sourcetree 每次拉取提交都需要输入密码(是有多个项目,他们的账户不一样) 输入以下命令: git config --global credential.helper osxkeychai ...
- vue脚手架工具vue-cli
一.什么 是脚手架工具vue-cli? 类似于工人手里面的脚手架一样,帮助工人搭架子用,同样的vue脚手架工具也是帮助我们更好更快速的开发代码的工具 二.vue-cli能做什么? 三.vue-cli安 ...