JavaWeb之商品查看后历史记录代码实现全过程解析。

    历史记录思路图:

        

   假设已经访问了商品 :1-2-3

   那么历史记录就是1-2-3,如果访问了商品8,那么历史记录就是:8-1-2-3,如果再次访问3那么历史记录就是:3-8-1-2。

    当历史记录中存在了商品3,再次访问商品3,将会删除之前的历史记录3,而把当前访问的商品3归为最新访问记录。

    实现过程如下:

点击商品,在商品详情页面中的cookie中生成pid,如果返回再次访问其他商品那么Cookie中的信息就是pid=商品id-商品id,以-作为分隔符,这里可以以逗号作为分隔符。

      

核心代码实现:

      

//获得客户端携带cookie---获得名字是pids的cookie
Cookie[] cookies = request.getCookies();
String pids = pid;
if(cookies!=null) {
for (Cookie cookie : cookies) {
if("pids".equals(cookie.getName())) {
pids=cookie.getValue();
//以-进行分割
String[] split = pids.split("-");
List<String> asList = Arrays.asList(split);
LinkedList<String> list =new LinkedList<String>(asList);
//判断集合中是否存在pid
if(list.contains(pid)) {
//包含当前查看的商品pid
list.remove(pid);
list.addFirst(pid);
}else {
//不包含当前查看商品的pid 直接将该pid放到头上
list.addFirst(pid);
}
//使用StringBuffer存储字符
StringBuffer sb =new StringBuffer(); //遍历集合并且让集合中的内容每次都<7就是每次历史记录最多显示7条数据
for(int i=0;i<list.size()&&i<7;i++) {
sb.append(list.get(i));
sb.append("-");
}
//截除掉最后面的一个-
pids =sb.substring(0,sb.length()-1);
}
}
}
//封装到Cookie中
Cookie cookie_pid = new Cookie("pids", pids);
response.addCookie(cookie_pid);
request.getRequestDispatcher("/product_info.jsp").forward(request, response);

    完成了这个功能之后,下面就是在历史记录中显示商品信息了。

        浏览商品记录模块:

            

首先思路如下:

    从Cookie中寻找pid的值,然后把pid代入数据库查询,然后添加到集合中,然后将历史记录的集合放到域中,最后再用jstl循环调用商品的图片:

    首先Cookie中寻找pid的值,然后把pid代入数据库查询,然后添加到集合中,然后将历史记录的集合放到域中实现代码如下:

        Web层:

    List<Product> historyProductList =new ArrayList<Product>();
Cookie[] cookies = request.getCookies();
if(cookies!=null) {
for (Cookie cookie : cookies) {
if("pids".equals(cookie.getName())) {
String pids=cookie.getValue();
String[] split = pids.split("-");
for (String pid : split) {
Product pro = service.findProductByPid(pid);
historyProductList.add(pro);
}
}
}
}
request.setAttribute("historyProductList", historyProductList);
request.getRequestDispatcher("/product_list.jsp").forward(request, response);

      查看service对象中的findProductByPid方法:

      service层:    

public Product findProductByPid(String pid) {
// TODO Auto-generated method stub
ProductDao dao =new ProductDao();
Product product=null;
try {
product = dao.findProductByPid(pid);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return product;
}

    

    Dao层:

      

public Product findProductByPid(String pid) throws SQLException {
// TODO Auto-generated method stub
QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
String sql="select * from product where pid=?";
Product product = runner.query(sql, new BeanHandler<Product>(Product.class),pid);
return product;
}

     然后前端view层jstl调用域中的集合信息:

        先引用jstl:

            

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

然后通过jstl显示信息:

          

<c:forEach items="${historyProductList}" var="historyPro">
<li
style="width: 150px; height: 216; float: left; margin: 0 8px 0 0; padding: 0 18px 15px; text-align: center;"><img
src="${pageContext.request.contextPath}/${historyPro.pimage}" width="130px" height="130px" />
</li>
</c:forEach>

最后的代码运行效果图:

    

JavaWeb之商品查看后历史记录代码实现的更多相关文章

  1. JavaWeb -- Cookie应用实例 -- 购物历史记录

    1. 页面一:主页面                                         页面二: 详细显示页面   Demo2 负责页面一, 显示商品清单和历史记录 Demo3负责页面二 ...

  2. 我的Git教程 之 解决 git clone后无代码

    解决 git clone 后无代码 前言:这个教程只适用于像我一样大致理解Git的原理,但是不太记得住Git命令的同学使用.所以具体原理只会提一下,具体可以参见Pro Git. 在另一篇 简明的教程  ...

  3. 浅析VS2010反汇编 VS 反汇编方法及常用汇编指令介绍 VS2015使用技巧 调试-反汇编 查看C语言代码对应的汇编代码

    浅析VS2010反汇编 2015年07月25日 21:53:11 阅读数:4374 第一篇 1. 如何进行反汇编 在调试的环境下,我们可以很方便地通过反汇编窗口查看程序生成的反汇编信息.如下图所示. ...

  4. java虚拟机jvm启动后java代码层面发生了什么?

    java虚拟机jvm启动后java代码层面发生了什么? 0000 我想验证的事情 java代码在被编译后可以被jdk提供的java命令进行加载和运行, 在我们的程序被运行起来的时候,都发生了什么事情, ...

  5. wpf后置代码中的Grid布局以及图片路径的设置

    之前用Grid练习连连看布局时,遇到了几个困惑.此次就把当时的一些收获写出来,供以后翻看. 图片路径可能比较常用,所以就写在第一个了. 在xaml中,设置图片非常简单,只要把图片拷贝到资源目录(这里假 ...

  6. git 找回 git reset --hard HEAD 后的代码

    下面方法只针对当你本地代码做了 git add 或则 git commit 后又手贱的重置本地代码到上一个版本,导致本地代码丢失的情况. 如果你没有 git add 命令,而直接 git reset ...

  7. 调试查看CLR运行代码

    SOS (Son of Strike)调试扩展可以让我们在调试过程中查看CLR运行代码.SOS.dll随.NET一起安装,对于.NET 4.0来说,SOS.dll的所在位置是:C:\Windows\M ...

  8. script指定src后内部代码无效

    /********** 无效 ***************/ <script type="text/javascript" src=""> fun ...

  9. 只要你用atom修改后保存代码文件的时候,你在chrome上的页面就会自动刷新。

    学习html和css的时候Ctrl+s 以后预览网页需要手动刷新 现在不用了 给chrome安装安装LivePage这个插件. 只要你用atom修改后保存代码文件的时候,你在chrome上的页面就会自 ...

随机推荐

  1. MySQL 使用Navicat连接MySQL8出现1251错误

    安装了MySQL8.x.x后使用Navicat连接总是出现1251错误,故在此记录一下解决方法. 错误提示 1251-Client does not support authentication pr ...

  2. 安装MySQL8.0 遇到的3个小错误

    过去公司都是用的5.7 系列的MySQL,随着8.0的发版,也想试着升级一下.遇到了两个小错误,记录在此. 路径设置: 安装包路径:/data/mysql80/ 数据路径: /data/mysql/ ...

  3. input file实现多选和限制文件上传类型

    <!-- input file  accept 属性设置可上传文件的类型  multiple属性设置可多文件上传--> <!-- accept 并未真正的实现限制上传文件类型,只是在 ...

  4. Oracle 12c用户和安全管理

    前言: Oracle 12c的多租户(multitenant)环境与SQL Server的架构非常相似,CDB$ROOT类似于master.PDB$SEED类似于model.各个pluggable d ...

  5. Asp.Net Core 实现谷歌翻译ApI 免费版

    由于谷歌翻译官方API是付费版本,本着免费和开源的精神.分享一下用 Net Core 实现谷歌翻译API的代码. 项目引用的Nuget 包: ChakraCore.NET Newtonsoft.Jso ...

  6. 解决Base64报错

  7. 【Python 09】汇率兑换2.0-2(分支语句)

    分支语句:根据判断条件选择程序执行路径 1.使用方法 if <条件1>: <语句块1> elif <条件2>: <语句块2> ... else: < ...

  8. 日志学习系列(四)——NLog实例

    具体不想介绍了,新建一个解决方案 ,直接用NuGet安装就行了 具体项目代码可以在https://github.com/qiuxianhu/SimpleNLog下载

  9. springMVC DispatcherServlet类关系图

  10. [题解]P1856 [USACO5.5]矩形周长Picture

    Loli 考试的题目之一 题目地址 \(N^2\)做法 #include <cstdio> #include <cstring> #define re register #de ...