首先刚拿到这个项目的实现我也一脸迷茫的,不知道数据库和jsp以及Controller之间的传递流程,下面我为大家浅析一下我对此类导航栏的理解吧。

首先:项目界面大概UI是这个样子的。

一级目录:化妆品

鼠标悬停:二级目录

点击少女派进入三级目录

首先我们先来分析一下,第一感觉误以为会使用Ajax技术来实现数据的无刷新实时传输,其实这是一个误区,我们可以通过类似递归查询将所有商品的一级分类二级分类三级分类以及所有商品信息查询出来,然后通过数据的交替传输再一次进入controller层进行数据查询,下面我先分析一下数据库表之间的关系。

表:easybuy_product

表:easybuy_product_category

通过对表结构分析,我们发现此数据库设计是将各商品分级设计为一张表中,通过id字段和parentId字段来关联上下级别关系。

在商品明细表格中,每个商品都有相应的所属层级id,我们可以先将parentId=0的一级目录查询出来,将查询出来的结果放入一个JavaBean类中,我们在这个JavaBaan中定义如下属性:

public class ProductCategory implements Serializable {private Integer id;//IDprivate String name;//名称private Integer parentId;//父级IDprivate Integer type;//分类级别private String iconClass;private ArrayList<Product> products; //获取其下所有商品private ArrayList<ProductCategory> productCategories; //获取其下一级子类public ArrayList<Product> getProducts() {return products;}public void setProducts(ArrayList<Product> products) {this.products = products;}public ArrayList<ProductCategory> getProductCategories() {return productCategories;}public void setProductCategories(ArrayList<ProductCategory> productCategories) {this.productCategories = productCategories;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getParentId() {return parentId;}public void setParentId(Integer parentId) {this.parentId = parentId;}public Integer getType() {return type;}public void setType(Integer type) {this.type = type;}public String getIconClass() {return iconClass;}public void setIconClass(String iconClass) {this.iconClass = iconClass;}}

其中  productCategories 属性用来存放其子级别目录分类

注意:Java对数据库数据进行查询时是每行逐一进行查询!(理解)

我们接下来通过将第一层id来作为下一查询的parentid来查询,这样查询到的数据就是以第一层父类id为基准查询到的二级子菜单,以此类推,我们总共将要查询三层。其结构模型为这样:

每一个集合中的对象都会包含一个一级分类的id,name等和它的二级分类和它的三级分类的id以及属性,这样我们就会将 一级分类;二级分类;和三级分类同时显示在menu中;具体java代码如下

public class ProductCategoryDao{private JdbcTemplate  jdbcTemplate = new JdbcTemplate();private ProductDao productDao = new ProductDao();//集合转化//获取商品分类数据集public List<ProductCategory> selectProductCategory(){String sql = "select * from easybuy_product_category where parentId = 0";List<ProductCategory> list = this.jdbcTemplate.queryAll(sql, null, new RowMapper() {@Overridepublic Object mapRow(ResultSet rs) throws SQLException {ProductCategory pc = new ProductCategory();pc.setId(rs.getInt("id"));pc.setName(rs.getString("name"));pc.setIconClass(rs.getString("iconClass"));pc.setParentId(rs.getInt("parentId"));pc.setType(rs.getInt("type"));//获取二级类集合List productCategories = selectProductCategory2(pc.getId());ArrayList arrayList1 = new ArrayList();for(int i = 0 ;i < productCategories.size(); i++){arrayList1.add(productCategories.get(i));}pc.setProductCategories(arrayList1); //ProductCategories// *****************************************获取商品集合***********************************************List  products = productDao.selectProduct(pc.getId());ArrayList arrayList2 = new ArrayList();for(int i = 0 ;i < products.size(); i++){arrayList2.add(products.get(i));}pc.setProducts(arrayList2);//Productsreturn pc;}});return list;}//查询二级目录下集合public List<ProductCategory> selectProductCategory2(int ParentId){String sql = "select * from easybuy_product_category where parentId = ?";List<ProductCategory> list = this.jdbcTemplate.queryAll(sql, new Object[]{ParentId}, new RowMapper() {@Overridepublic Object mapRow(ResultSet rs) throws SQLException {ProductCategory pc = new ProductCategory();pc.setId(rs.getInt("id"));pc.setName(rs.getString("name"));pc.setIconClass(rs.getString("iconClass"));pc.setType(rs.getInt("type"));pc.setParentId(rs.getInt("parentId"));//查找三级目录类集合List productCategories = selectProductCategory3(pc.getId());ArrayList arrayList1 = new ArrayList();for(int i = 0 ;i < productCategories.size(); i++){arrayList1.add(productCategories.get(i));}pc.setProductCategories(arrayList1);return pc;}});return list;}//查询三级目录下集合public List<ProductCategory> selectProductCategory3(int ParentId){String sql = "select * from easybuy_product_category where parentId = ?";List<ProductCategory> list = this.jdbcTemplate.queryAll(sql, new Object[]{ParentId}, new RowMapper() {@Overridepublic Object mapRow(ResultSet rs) throws SQLException {ProductCategory pc = new ProductCategory();pc.setId(rs.getInt("id"));pc.setName(rs.getString("name"));pc.setIconClass(rs.getString("iconClass"));pc.setType(rs.getInt("type"));pc.setParentId(rs.getInt("parentId"));return pc;}});return list;}}

注: 本人所使用的jdbc以及mvc是自己封装的,但类似于Jdbctemplate,如果需要源码请与我联系。

这样我们就可以将整个数据库中的商品分级打包成一个list集合传输到jsp前台界面中啦。

然后我们将当前层级目录设置成href超链接形式进行数据值传递,通过后台对level和id进行查询,查询到相应商品信息。

 public List<Product> ProductDetails(Integer level,Integer id){String sql = "select    id,name,description,price,stock,categoryLevel1Id,categoryLevel2Id,categoryLevel3Id,fileName from easybuy_product where isdelete  = 0 ";if(EmptyUtils.isNotEmpty(level)){if(level == 1){sql += "and categoryLevel1Id = "+id;}if(level == 2){sql += "and categoryLevel2Id = "+id;}if(level == 3){sql += "and categoryLevel3Id = "+id;}System.out.println(sql);}List<Product> list = this.jdbcTemplate.queryAll(sql,null,this);return list;}

这样类似于淘宝的商品目录结构就实现啦,我们要对集合的嵌套熟练掌握,已经web编程,功夫不负有心人,只要肯动脑不了筋,没有实现不了的。此目录可以应用到很多web项目以及ERP管理平台中。

浅析我对Web(淘宝网)导航栏的深入理解相关推荐

  1. js实现淘宝右侧导航栏功能

    本章和大家分享的是模拟淘宝右侧导航栏的一个小功能. 左侧是商品内容,右侧是一个导航栏,当页面向下滚动的时候右侧导航栏也跟着移动. 当黄色内容区域到达顶部的时候,右侧导航栏变为固定的 当黑色内容区到达顶 ...

  2. 纯css仿淘宝京东导航菜单栏

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  3. JS仿淘宝网顶部的导航菜单

    代码简介: JS仿淘宝网顶部的导航菜单.整合了购物车,收藏夹,搜索,搜索,网站导航等功能的导航. 代码内容: <!DOCTYPE html PUBLIC "-//W3C//DTD XH ...

  4. 淘宝网顶部导航菜单效果

    演示:http://www.websjy.com/club/websjy_index/29/ 代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1 ...

  5. 淘宝网发起的Web服务器项目

    >>>>>>>>>>>>>>>>>>>>>===       Tengin ...

  6. 仿淘宝网首页导航条效果

    < html > < head > < meta http - equiv = " Content-Type "  content = " ...

  7. 解密淘宝网的开源架构(转)

    淘宝网,是一个在线商品数量突破一亿,日均成交额超过两亿元人民币,注册用户接近八千万的大型电子商务网站,是亚洲最大的购物网站.那么对于淘宝网这样大规模的一个网站,我猜想大家一定会非常关心整个网站都采用了 ...

  8. 淘宝网秒杀需求分析与实现 - 公开课笔记

    主要内容 高并发系统架构面试的时候被问到该怎么说? 一个高并发系统中有哪些重要指标项? 从真实需求触发拆解淘宝网秒杀系统 - 消息中间件解耦.消峰.限流 分布式锁,限流,熔断,分布式事务,阿里云动态扩 ...

  9. 淘宝网的技术发展史(一)——个人网站时代

    <天下网商·经理人>十月刊开始将连载系列文章<淘宝网的技术发展史>,为读者描述淘宝网在整个发展过程中,所有的主动和被动的技术变革的前因后果. 文/淘宝技术大学培训专家 子柳 前 ...

  10. 采集淘宝网的10个经典方法

    采集淘宝官网的10个经典方法 采集淘宝数据分析.商品详细信息.竞店数据.品牌数据.全网搜索.网页爬虫.采集网站数据.网页数据采集软件.python爬虫.HTM网页提取.APP数据抓包.APP数据采集. ...

最新文章

  1. 橘子CPS联盟小程序操作手册2.0
  2. Docker源码分析(一):Docker架构
  3. Mac 使用 docker 搭建 kafka 集群 + Zookeeper + kafka-manager
  4. openstack热迁移配置注意事项
  5. [C#]打包项目[转]
  6. exe程序的启动过程
  7. 以5个数据库为例,用Python实现数据的提取、转换和加载(ETL)
  8. 渗透测试入门5之内网信息搜集
  9. Android 面试题总结
  10. hive 如何将数组转成字符串_Hive函数大全(含例子)之字符串函数(String Functions)...
  11. Struts2 页面url请求怎样找action
  12. JMeter循环控制器循环次数使用变量控制注意事项
  13. 层次分析法-yaahp软件使用
  14. 软件测试人员必备工具介绍--如何滚屏抓取图片-SnagIt篇(图)
  15. matlab boxplot显示平均值,r – Boxplot显示平均值
  16. java dwg转pdf_java实现CAD图纸文件DWG格式转为PDF格式
  17. 军犬舆情热点:千亿矿权案成立联合调查组;格力人均加薪1000元
  18. 希尔伯特的23个数学问题
  19. The Perfect Man (超完美男人)
  20. Javascript特效:点名册(随机点名)

热门文章

  1. Floyd-Warshall算法(Floyd-Warshall algorithm)
  2. 华为mate50pro和华为mate50RS的区别
  3. 十大顶级骨传导蓝牙耳机,推荐五款顶流的骨传导耳机
  4. ArcMap关联图层并发布为服务
  5. B站成长期UP主有哪些涨粉机会?
  6. 央行新规收款码事件|还有人不知道收款码的概念?
  7. 大数据的接触,带你初步认识什么是大数据,云计算以及物联网
  8. RMON MIB:远程监控管理信息库
  9. 34岁测试工程师面试美团遭拒:只招30岁以下,能加班但工资要求不高的....
  10. win10 无法删除 注册表 蓝牙_win10删除蓝牙设备后无法重新添加如何解决