网上书城分类Category模块
2 分类模块
2.1 创建分类模块相关类
在每个模块开始时,都要创建如下基本类:实体类、DAO类、Service类、Servlet类:
l cn.itcast.goods.category.domain.Category;
l cn.itcast.goods.category.dao.CategoryDao;
l cn.itcast.goods.category.service.CategoryService;
l cn.itcast.goods.category.web.servlet.CategoryServlet。
2.1.1 Category
Category类作为实体类需要与数据库表对应,即t_category表对象。Category类对照着t_category表来写即可。我们要保证Category类的属性名称与t_category表的列名称完全相同。
注意,在表中如果存在关联关系时,使用主外键进行关联,而在实体类中不能只给出外键,而是要给出关联的类型。
t_category表存在自身关联,pid列用来指定父分类的主键。也就是说一个分类可能有一个父分类,也可能有多个子分类。
Category.java
public class Category {
    private String cid;      //主键
    private String cname;      //分类名称
    private List<Category> children;//所有子分类(点开即是列表)
    private Category parent;//父分类
    private String desc;        //描述
…
}
2.1.2 各层的类
还需要添加:CategoryDao、CategoryService、CategoryServlet类,这里就不在赘述,根据用户模块自己完成!
CategoryDao.java
public class CategoryDao{
private QueryRunner qr=new TxQueryRunner();
}
CategoryService.java
public class CategoryService{
private CategoryDao categoryDao=new CategoryDao();
}
CategoryServlet.java
public class CategoryServlet extends BaseServlet{
private CategoryService categoryService= new CategoryService();
}
2.2 显示所有分类
2.2.1 分类显示
请求是从main.jsp的框架页中发出的,当客户端打开main.jsp后,会发出三个请求,分别是:
l 上部:请求top.jsp页面;
l 左部:请求CategoryServlet#findAll()方法,得到所有分类,转发到left.jsp显示;
l 高级:请求gj.jsp;
l 中部:请求body.jsp
我们现在需要的是修改main.jsp,让它去请求CategoryServlet#findAll()方法,在findAll()方法中得到所有分类,保存到request中,最后转发到left.jsp。
main.jsp
<td class="tdLeft" rowspan="2">
<iframe frameborder="0" src="<c:url value='/CategoryServlet?method=findAll'/>"[框架面指向Servlet] name="left"></iframe>
</td>
在left.jsp中使用javascript小工具(手风琴式菜单)来显示所有分类。所以,我们需要先学习一下手风琴式菜单的使用。


手风琴小工具在在menu目录中,我们只需要学习一个名为Q6MenuBar的类即可。使用Q6MenuBar类的步骤如下:
l 创建Q6MenuBar对象,传递标题;
l 向Q6MenuBar中添加一级、二级菜单,在这里就是指定一级、二级分类;
l 调用Q6MenuBar的toString(),把字符串插入到某个<div>中。
- 创建页面元素
<body>
<div id="menu"></div>
</body> 
页面中只有一个<div>
2.创建全局对象
var bar = new Q6MenuBar("bar", "ITCAST网络图书商城");
3.配置Q6MenuBar对象
$(function() {
    bar.colorStyle = 4;
    bar.config.imgDir = "<c:url value='/menu/img/'/>";
    bar.config.radioButton=true;
    …
}
在页面加载完成后,对Q6MenuBar进行配置:
l bar.colorStyle:指定配色方案。Q6MenuBar一共5种配色方案,分别为0~4;
l bar.config.imgDir:指定一级菜单上的“展开”和“闭合”图片所在目录;
l bar.config.radioButton:指定是否可以同时展开多个一级菜单,为true表示最多只能展开一个一级菜单,false表示可以同时展开多个一级菜单。
4.添加一级、二级菜单
$(function() {
    …
    bar.add("程序设计", "Java Javascript", "/goods/jsps/book/list.jsp", "body");
    bar.add("程序设计", "JSP", "/goods/jsps/book/list.jsp", "body");
    bar.add("程序设计", "C C++ VC VC++", "/goods/jsps/book/list.jsp", "body");
    bar.add("办公室用书", "微软Office", "/goods/jsps/book/list.jsp", "body");
    bar.add("办公室用书", "计算机初级入门", "/goods/jsps/book/list.jsp", "body");
}
调用Q6MenuBar的add()方法可以添加菜单,该方法一共4个参数,分别表示:
l 1:一级菜单名称,如果这个名称的一级菜单不存在,那么会创建它,如果已经存在,那么就不会再创建;
l 2:二级菜单名称;
l 3:点击二级菜单请求的URL;
l 4:结果在哪个框架页显示。
上面代码一共添加了5个二级菜单,前3个在一个一级菜单中,后2个在一个一级菜单中。
2.2.2 显示所有分类服务器端实现
CategoryServlet#findAll():
l 调用CategoryService#findAll()得到所有分类;
l 把所有分类保存到request中;
l 转发到left.jsp页面显示所有分类。
CategoryService#findAll():
l 调用CategoryDao#findAll()得到所有分类返回;
CategoryDao#findAll():
l 查询所有一级分类,得到一级分类的List;
l 循环遍历每个一级分类,为每个一级分类加载它的所有二级分类;
l 返回分类List。
CategoryDao.java
    public List<Category> findAll() throws SQLException {
        /*
         * 1. 获取所有一级分类
         *   pid为null就是一级分类。
         */
        String sql = "select * from t_category where pid is null order by orderBy";
        List<Category> parents = qr.query(sql,
                new BeanListHandler<Category>(Category.class));
        /*
         * 2. 循环遍历每个一级分类,为其加载它的所有二级分类
         */
        sql = "select * from t_category where pid=? order by orderBy";
        for(Category parent : parents) {
            // 获取当前一级分类的所有二级分类
            List<Category> children = qr.query(sql,
                    new BeanListHandler<Category>(Category.class),
                    parent.getCid());
            // 给当前一级分类设置二级分类
            parent.setChildren(children);
            // 为每个二级分类设置一级分类
            for(Category child : children) {
                child.setParent(parent);
            }
        }
        /*
         * 3. 返回一级分类List,每个一级分类都包含了自己的二级分类
         */
        return parents;
    }
CategoryService.java
    public List<Category> findAll() {
        try {
            return categoryDao.findAll();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
CategoryServlet.java
public String findAll(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
/*
* 1. 获取所有分类
*/
List<Category> parents = categoryService.findAll();
/*
* 2. 保存到request中
*/
req.setAttribute("parents", parents);
/*
* 3. 转发到left.jsp
*/
return "f:/jsps/left.jsp";
}
2.2.3 left.jsp显示所有分类
在left.jsp中显示所有分类
<script language="javascript">
var bar = new Q6MenuBar("bar", "ITCAST网络图书商城");
$(function() {
bar.colorStyle = 4;
bar.config.imgDir = "<c:url value='/menu/img/'/>";
bar.config.radioButton=true;
<c:forEach items="${parents}" var="parent">
<c:forEach items="${parent.children}" var="child">
bar.add("${parent.cname}", "${child.cname}", "<c:url value='/index.jsp'/>", "body");
</c:forEach>
</c:forEach>
$("#menu").html(bar.toString());
});
</script>
上述代码必须放到jsp页面中,因为使用了jstl标签!
调用Q6MenuBar的add()方法可以添加菜单,该方法一共4个参数,分别表示:
l 1:一级菜单名称,如果这个名称的一级菜单不存在,那么会创建它,如果已经存在,那么就不会再创建;
l 2:二级菜单名称;
l 3:点击二级菜单请求的URL;
l 4:结果在哪个框架页显示。
上面代码一共添加了5个二级菜单,前3个在一个一级菜单中,后2个在一个一级菜单中。
2.2.2 显示所有分类服务器端实现
CategoryServlet#findAll():
l 调用CategoryService#findAll()得到所有分类;
l 把所有分类保存到request中;
l 转发到left.jsp页面显示所有分类。
CategoryService#findAll():
l 调用CategoryDao#findAll()得到所有分类返回;
CategoryDao#findAll():
l 查询所有一级分类,得到一级分类的List;
l 循环遍历每个一级分类,为每个一级分类加载它的所有二级分类;
l 返回分类List。
CategoryDao.java
| 
 public List<Category> findAll() throws SQLException { /* * 1. 获取所有一级分类 * pid为null就是一级分类。 */ String sql = "select * from t_category where pid is null order by orderBy"; List<Category> parents = qr.query(sql, new BeanListHandler<Category>(Category.class)); /* * 2. 循环遍历每个一级分类,为其加载它的所有二级分类 */ sql = "select * from t_category where pid=? order by orderBy"; for(Category parent : parents) { // 获取当前一级分类的所有二级分类 List<Category> children = qr.query(sql, new BeanListHandler<Category>(Category.class), parent.getCid()); // 给当前一级分类设置二级分类 parent.setChildren(children); // 为每个二级分类设置一级分类 for(Category child : children) { child.setParent(parent); } } /* * 3. 返回一级分类List,每个一级分类都包含了自己的二级分类 */ return parents; }  | 
网上书城分类Category模块的更多相关文章
- Apicloud_(项目)网上书城03_拓展模块实现
		
Apicloud_(项目)网上书城01_前端页面开发 传送门 Apicloud_(项目)网上书城02_后端数据获取 传送门 Apicloud_(项目)网上书城03_拓展模块实现 传送门 实现商品详情页 ...
 - Apicloud_(项目)网上书城02_后端数据获取
		
Apicloud_(项目)网上书城01_前端页面开发 传送门 Apicloud_(项目)网上书城02_后端数据获取 传送门 Apicloud_(项目)网上书城03_拓展模块实现 传送门 ApiClou ...
 - Apicloud_(项目)网上书城01_前端搭建
		
[本文皆在记录自己开发Apicloud项目过程,不具备教学水平性文章] 参考书籍<30天App开发从0到1> Apicloud_(项目)网上书城01_前端页面开发 传送门 Apicloud ...
 - OC的特有语法-分类Category、 类的本质、description方法、SEL、NSLog输出增强、点语法、变量作用域、@property @synthesize关键字、Id、OC语言构造方法
		
一. 分类-Category 1. 基本用途:Category 分类是OC特有的语言,依赖于类. ➢ 如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 ● 继承 ● 分类(Categor ...
 - OC中分类(Category)和扩展(Extension)
		
1.分类的定义 category是Objective-C 2.0之后添加的语言特性,中文也有人称之为分类.类别.Category的主要作用是为已经存在的类添加方法.这个大家可能用过很多,如自己给UIC ...
 - Objective-C:继承、分类(Category、extension)、协议(protocol),个人理解,仅供参考
		
总结:继承.分类(Category.extension).协议(protocol) 一.继承: (1)特点: 继承多用于一般父类中的方法功能比较齐全,子类从父类继承过来使用,可以省略很多重复的代码 ...
 - Objective-C:分类(Category、extension)
		
分类(Category .Extension) (一)分类的划分 (2) 1.(命名的类别)类别Category:只能添加新的方法,不能添加新变量. 2.(未命名的类别)类 ...
 - 大项目之网上书城(七)——书页面以及加入购物车Servlet
		
目录 大项目之网上书城(七)--书页面以及加入购物车Servlet 主要改动 1.shu.jsp 代码 效果图 2.shu.js 代码 3.index.jsp 代码 效果图 4.FindBookByC ...
 - 大项目之网上书城(五)——主页(End)
		
目录 大项目之网上书城(五)--主页(End) 主要改动 1.主页(终于完成啦) 完整代码 效果图 2.head.jsp的小改动 代码 3.login.jsp ###代码 效果图 4.login.js ...
 
随机推荐
- 多台CentOS服务器时间同步(NTP时间同步)(转)
			
1.用ntpdate从时间服务器更新时间 如果你的linux系统根本没有ntpdate这个命令 yum install ntp 安装完了之后,你不要做什么配置,也不需要,直接测试一下 [root@lo ...
 - python中反射(__import__和getattr使用)
			
反射: 1.可通过字符串的形式导入模块 1.1.单层导入 __import__('模块名') 1.2.多层导入 __import__(' list.text.commons',fromlist=Tru ...
 - Java框架基础——反射(reflect)
			
一.Class类的使用 1)在面向对象(oop)的世界里,万事万物皆对象. 在Java中,包括基本的数据类型,都是对象. Class c = int.class;//int 的类类型 那就是说: 类是 ...
 - java获取泛型的真实类型
			
ParameterizedType type = (ParameterizedType)this.getClass().getGenericSuperclass(); Type[] actualTyp ...
 - HBase -- 基于HDFS的开源分布式NoSQL数据库
			
HBase(Hadoop Database)是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,我们可以利用HBase技术在廉价的PC上搭建起大规模结构化存储集群.同Google的Bigtable ...
 - pip是用国内镜像源
			
pipy国内镜像目前有: http://pypi.douban.com/ 豆瓣 http://pypi.hustunique.com/ 华中理工大学 http://pypi.sdutlinux.o ...
 - 浅谈C#抽象方法、虚方法、接口
			
每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默.我眼中的程序员大多都不 ...
 - UILabel详解
			
// ----------------------UILabel--------------------------- UILabel *label = [[UILabel alloc] initWi ...
 - 【转】Java多线程编程中易混淆的3个关键字( volatile、ThreadLocal、synchronized)总结
			
概述 最近在看<ThinKing In Java>,看到多线程章节时觉得有一些概念比较容易混淆有必要总结一下,虽然都不是新的东西,不过还是蛮重要,很基本的,在开发或阅读源码中经常会遇到,在 ...
 - Test4J与Jtester单元测试常用注解比较
			
package com.alibaba.ceres.catalog.biz.product.impl; import org.junit.After; import org.junit.Before; ...