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>中。

  1. 创建页面元素

    <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个参数,分别表示:

1:一级菜单名称,如果这个名称的一级菜单不存在,那么会创建它,如果已经存在,那么就不会再创建;

2:二级菜单名称;

3:点击二级菜单请求的URL;

4:结果在哪个框架页显示。

  上面代码一共添加了5个二级菜单,前3个在一个一级菜单中,后2个在一个一级菜单中。

2.2.2 显示所有分类服务器端实现

CategoryServlet#findAll():

调用CategoryService#findAll()得到所有分类;

把所有分类保存到request中;

转发到left.jsp页面显示所有分类。

CategoryService#findAll():

调用CategoryDao#findAll()得到所有分类返回;

CategoryDao#findAll():

查询所有一级分类,得到一级分类的List;

循环遍历每个一级分类,为每个一级分类加载它的所有二级分类;

返回分类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个参数,分别表示:

1:一级菜单名称,如果这个名称的一级菜单不存在,那么会创建它,如果已经存在,那么就不会再创建;

2:二级菜单名称;

3:点击二级菜单请求的URL;

4:结果在哪个框架页显示。

  上面代码一共添加了5个二级菜单,前3个在一个一级菜单中,后2个在一个一级菜单中。

2.2.2 显示所有分类服务器端实现

CategoryServlet#findAll():

调用CategoryService#findAll()得到所有分类;

把所有分类保存到request中;

转发到left.jsp页面显示所有分类。

CategoryService#findAll():

调用CategoryDao#findAll()得到所有分类返回;

CategoryDao#findAll():

查询所有一级分类,得到一级分类的List;

循环遍历每个一级分类,为每个一级分类加载它的所有二级分类;

返回分类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模块的更多相关文章

  1. Apicloud_(项目)网上书城03_拓展模块实现

    Apicloud_(项目)网上书城01_前端页面开发 传送门 Apicloud_(项目)网上书城02_后端数据获取 传送门 Apicloud_(项目)网上书城03_拓展模块实现 传送门 实现商品详情页 ...

  2. Apicloud_(项目)网上书城02_后端数据获取

    Apicloud_(项目)网上书城01_前端页面开发 传送门 Apicloud_(项目)网上书城02_后端数据获取 传送门 Apicloud_(项目)网上书城03_拓展模块实现 传送门 ApiClou ...

  3. Apicloud_(项目)网上书城01_前端搭建

    [本文皆在记录自己开发Apicloud项目过程,不具备教学水平性文章] 参考书籍<30天App开发从0到1> Apicloud_(项目)网上书城01_前端页面开发 传送门 Apicloud ...

  4. OC的特有语法-分类Category、 类的本质、description方法、SEL、NSLog输出增强、点语法、变量作用域、@property @synthesize关键字、Id、OC语言构造方法

    一. 分类-Category 1. 基本用途:Category  分类是OC特有的语言,依赖于类. ➢ 如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 ● 继承 ● 分类(Categor ...

  5. OC中分类(Category)和扩展(Extension)

    1.分类的定义 category是Objective-C 2.0之后添加的语言特性,中文也有人称之为分类.类别.Category的主要作用是为已经存在的类添加方法.这个大家可能用过很多,如自己给UIC ...

  6. Objective-C:继承、分类(Category、extension)、协议(protocol),个人理解,仅供参考

    总结:继承.分类(Category.extension).协议(protocol)   一.继承: (1)特点: 继承多用于一般父类中的方法功能比较齐全,子类从父类继承过来使用,可以省略很多重复的代码 ...

  7. Objective-C:分类(Category、extension)

    分类(Category .Extension) (一)分类的划分     (2) 1.(命名的类别)类别Category:只能添加新的方法,不能添加新变量.           2.(未命名的类别)类 ...

  8. 大项目之网上书城(七)——书页面以及加入购物车Servlet

    目录 大项目之网上书城(七)--书页面以及加入购物车Servlet 主要改动 1.shu.jsp 代码 效果图 2.shu.js 代码 3.index.jsp 代码 效果图 4.FindBookByC ...

  9. 大项目之网上书城(五)——主页(End)

    目录 大项目之网上书城(五)--主页(End) 主要改动 1.主页(终于完成啦) 完整代码 效果图 2.head.jsp的小改动 代码 3.login.jsp ###代码 效果图 4.login.js ...

随机推荐

  1. Java 实现网站当前在线用户统计

    1. import java.util.HashSet; import javax.servlet.ServletContext; import javax.servlet.http.HttpSess ...

  2. 监控mysql主从同步状态脚本

    监控mysql主从同步状态脚本 示例一: cat check_mysql_health #!/bin/sh slave_is=($(mysql -S /tmp/mysql3307.sock -uroo ...

  3. sdut2169:Sequence(dp)

    题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2169 #include <iost ...

  4. Android 通过Base64上传图片到服务器

    之前做上传图片是采用HttpServlet上传,不过用了一下Base64上传图片后,感觉比HttpServlet方便很多,大家也可以跟着尝试一下. 前台图片处理:(传Bitmap对象即可) /** * ...

  5. Power-BI 主要城市商品房销售分析

    经常在网上看到有关房价的讨论,房价可能真的悬了,高房价撑不了多久,一线城市房价远高于国际,暴涨游戏该结束了,等等.那么近年来房价整体上究竟是一个什么样的状态?今天我们撇开宏观经济要素,来看看近年来主要 ...

  6. Java基础之访问文件与目录——列出目录内容(ListDirectoryContents)

    控制台程序,列出目录的全部内容并使用过滤器来选择特定的条目. import java.nio.file.*; import java.io.IOException; public class List ...

  7. 理解运算符 || 和 && 及方法

    || 前面为true的话直接返回前面的值,前面为false的话返回后面的值.如下: console.log(0 || 1); console.log(1 || 0); console.log(1 || ...

  8. centos 6.4下安装postgresql 9.2

    我的linux版本是centos 6.4 ,准备安装postgresql 9.2 根据官方说明: http://www.postgresql.org/download/linux/redhat/ 缺省 ...

  9. 实验十四_访问CMOS RAM

    编程:以"年/月/日 时:分:秒"的格式,显示当前的日期,时间. 注意:CMOS RAM中存储着系统的配置信息,除了保存时间信息的单元外,不要向其他的单元写入内容,否则将引起一些系 ...

  10. Leetcode: Water and Jug Problem && Summary: GCD求法(辗转相除法 or Euclidean algorithm)

    You are given two jugs with capacities x and y litres. There is an infinite amount of water supply a ...