一,前言
这一章为代码添加了业务逻辑,实现了基本功能,主要开发和优化流程如下:
1,将创建数据库连接的参数提取到properties文件,使用PropsUtil进行读取
是数据库配置信息和代码业务逻辑解耦,可配置
2,将创建数据库链接,关闭数据库连接操作提取到DatabaseHelper类,
在Service层方法中,操作数据库前后分别调用获取连接和关闭连接方法,是代码得到复用
使用DbUtils解决数据库查询时大量重复代码问题,精简了Service层
3,使用ThreadLocal对Connection对象进行线程隔离,将获取,关闭连接的操作合并到DatabaseHelper中
使Service层不需要再关心获取和关闭数据库连接的操作,进一步简化了Service层
4,为了避免频繁创建数据库连接,引入了DBCP连接池对Connection进行"池化"管理
进一步精简了Service层
5,补齐了剩余Service
6,优化Junit单元测试
7,完善控制器层
8,完善视图层
之后,只要将全部Servlet补齐,即可完成一个小项目
这一章的最后将对现有项目进行分析,指出在现有条件下开发的劣势
从而引出框架的开发
二,分析项目
这一章节介绍了业务逻辑的添加流程,主要以CustomerServlet为例进行说明
在实际开发中会有很多个Servlet,并且会随着业务需求的增加而继续增多
势必会增加日后的维护工作量,所以需要想办法尽量减少Servlet的数量
目前Customer模块涉及到5个Servlet:
CustomerCreateServlet-创建客户
CustomerDeleteServlet-删除客户
CustomerEditServlet-编辑客户
CustomerServlet-客户列表
CustomerShowServlet-显示客户基本信息
如果能将同一个业务模块的Servlet合并到一个类中就最好了:
CustomerController类:包含若干方法,每个方法处理一种特定请求
三,框架的预期和分析
CustomerController中包含多个方法,每个方法处理一种特定请求
CustomerController:
/**
* 处理客户管理相关请求
*/
@Controller
public class CustomerController {
@Inject
private CustomerService customerService;
/**
* 进入 客户列表 界面
*/
@Action("get:/customer")
public View index(Param param) {
List<Customer> customerList = customerService.getCustomerList();
return new View("customer.jsp").addModel("customerList", customerList);
}
/**
* 显示客户基本信息
*/
@Action("get:/customer_show")
public View show(Param param) {
long id = param.getLong("id");
Customer customer = customerService.getCustomer(id);
return new View("customer_show.jsp").addModel("customer", customer);
}
/**
* 进入 创建客户 界面
*/
@Action("get:/customer_create")
public View create(Param param) {
return new View("customer_create.jsp");
}
/**
* 处理 创建客户 请求
*/
@Action("post:/customer_create")
public Data createSubmit(Param param) {
Map<String, Object> fieldMap = param.getFieldMap();
boolean result = customerService.createCustomer(fieldMap);
return new Data(result);
}
/**
* 进入 编辑客户 界面
*/
@Action("get:/customer_edit")
public View edit(Param param) {
long id = param.getLong("id");
Customer customer = customerService.getCustomer(id);
return new View("customer_edit.jsp").addModel("customer", customer);
}
/**
* 处理 编辑客户 请求
*/
@Action("put:/customer_edit")
public Data editSubmit(Param param) {
long id = param.getLong("id");
Map<String, Object> fieldMap = param.getFieldMap();
boolean result = customerService.updateCustomer(id, fieldMap);
return new Data(result);
}
/**
* 处理 删除客户 请求
*/
@Action("delete:/customer_edit")
public Data delete(Param param) {
long id = param.getLong("id");
boolean result = customerService.deleteCustomer(id);
return new Data(result);
}
}
分析代码的实现:
1,在控制器类上,添加@Controller注解,标明该类是一个控制器类
2,在成成员变量上,使用@Inject注解"注入"该对象,自动创建成员变量实例
3,控制器中包含的若干方法添加@Action注解,
每个方法都会使用Get/Post/Put/Delete,指定"请求类型"与"请求路径"
4,在Action的参数中,通过Param对象封装多有请求参数
可根据getLong/getFieldMap等方法获取具体或所有请求参数
5,在Action返回值中,使用View封装JSP页面,使用Data封装Json数据
有了具备以上功能的Controller,Servlet的数量会少很多,而且屏蔽了技术细节
这种方式将MVC架构变得更加轻量级
四,结尾
本章通过Customer的相关需求,逐步开发测试优化迭代出一个小项目
这其中的每一步都抛出问题,解决问题,使项目逐步走向完善,也了解了常规的开发流程
这节对本已经开发完成的项目进行了分析,指出了不足之处和预期
下一章开始从0开始搭建这款轻量级Web框架,开始架构探险