架构探险-第二章:为Web应用添加业务功能(10)-新框架

一,前言

这一章为代码添加了业务逻辑,实现了基本功能,主要开发和优化流程如下:

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框架,开始架构探险

猜你喜欢

转载自blog.csdn.net/abap_brave/article/details/80533988