夜光序言:
该面对的总要面对,压力也同样是动力。
“奈何小生清心寡欲多年,却因靓女一笑起了荤念。”
正文:客户关系管理系统
环境搭建
创建一个空项目
项目原型导入
copy原型中的src和WebRoot
发布,运行,查看功能
功能分析
- 添加客户
- 查看所有客户
- 编辑客户(查一个)
- 删除客户
- 多条件组合查询
导jar包
- mysql驱动
- c3p0(它的配置文件)
- Genius-tools.1.4.2.jar
- commons-bean-utils.jar
- commons-logging.jar
- commons-dbutils.jar
以上很重要~~
页面分析
- index.jsp:它什么都没做,直接转发到frame.jsp;
- frame.jsp:框架页,包含top.jsp和webcome.jsp
- top.jsp:
一个标题
- 链接1:添加客户,请求add.jsp;
- 链接2:查看客户,请求list.jsp;
- 链接3:高级搜索,请求query.jsp;
嘿哈~~
- add.jsp:一个添加客户的表单;
- list.jsp:一个<table>用来显示所有客户;
- query.jsp:一个高级搜索的表单;
- edit.jsp:一个修改客户的表单;
- msg.jsp:用来显示信息(添加客户成功)
表和类的创建
涉及哪些表
-
客户表
CREATE TABLE Key_customer( cid CHAR(32) PRIMARY KEY, cname VARCHAR(40) NOT NULL, gender VARCHAR(6) NOT NULL, birthday CHAR(10), cellphone VARCHAR(15) NOT NULL, email VARCHAR(40), description VARCHAR(500) ); |
涉及的类
- domain:Customer
- dao:CustomerDao
- service:CustomerService
- servlet:CustomerServlet
该面对的总要面对,压力也同样是动力
添加功能
流程分析
- add.jsp àCustomerServlet#addCustomer()àmsg.jsp
代码的实现
- DAO#addCustomer(Customer c):
- 给出sql语句的模板
- 把参数c转换成一个Object[]
- 调用QueryRunner的update方法。
- Service#addCustomer(Customer c):
- 直接调用dao的addCustomer(c);
查看所有客户
查看所有客户的流程分析
- top.jsp à CustomerServlet#findAll() à list.jsp
DAO:
- sql = “select * from t_customer”;
- qr.query(),需要把结果集映射成List<Customer>,所以使用BeanListHandler
Service:略
编辑功能
编辑功能分两步
- 按id查询,即加载~~
- 修改客户信息
按id查询流程
- list.jsp中每个客户信息之后都有编辑链接àCustomerServlet#load()àedit.jsp
DAO:
- sql = “select * from t_customer where cid=?”;
- qr.query(),使用BeanHandler即可。
Service:略
- 编辑第2步
- edit.jsp à CustomerServlet#edit() à msg.jsp
高级搜索
流程分析
query.jsp à CustomerServlet#query() à list.jsp
分页:
页面需要的分页数据:
- 当前页:pageCode,简称pc
- 总页数:totalPage,简称tp
- 当前记录:datas
Servlet:
pc:
- 如果页面传递了pc,那么使用页面传递的;
- 如果页面没有传递,那么pc=1
tp:
- 总记录数:totalRecord,简称tr
- 每页记录数:pagesize,简称ps
- tr%ps==0 ? tr/ps : tr/ps + 1;
tr:
- 让dao来select count(*)就可以知道总记录数
ps:
- 系统数据,我们可以自己决定
- datas:
- 让dao来select …. limit来搞定
创建分页Bean
因为分页数据太多,而且分页数据总是要在各层之间来回传递,所以我们需要把所有分页数据封装到一个对象中。PageBean