第一次尝试着用Java做Web开发,使用了Java Spring框架,顺便说一句,如果使用Spring开发,建议使用STS(Spring Tool Suite) IDE,它很好的集成了Spring、Maven等框架,使用起来特别方便,尤其是第一次使用Spring框架进行开发,它极大的方便了开发人员,通过快捷菜单及可很简单的配置好Spring开发环境,自动下载、更新Maven依赖包。话不多讲,回到文章的正题。
Spring是一个在Java业界很流行的MVC框架,所谓MVC即模型-视图-控制器,将应用程序的逻辑层与展现层进行分离的一种设计模式。
- 模型(Model)代表数据控制器。数据的读取,插入,更新都是由模型来负责。
- 视图(View)是展示给用户的最终页面。视图负责将数据以用户友好的形式展现出来。
- 控制器(Controller)是模型,视图以及其他任何处理 HTTP 请求所必须的资源之前的中介
概述
一个典型的页面浏览行为在程序端的流程是这样的:
- 控制器最先被调用,并被赋予外部输入
- 控制器根据外部输入向模型请求数据
- 模型从数据库获取数据并发送数据到控制器
- 控制器处理该数据并发送封装好的数据到视图
- 视图根据接到的数据最终展示页面给用户浏览
使用Java进行MVC模式开发时,往往将数据模型分为两部分,即DAO(Data Access Object,数据访问对象)和Service(业务逻辑模型)。在第2步中,控制器向模型请求数据时,并不是直接向DAO请求数据,而是通过Service向DAO请求数据。这样做的好处是,可以将业务逻辑与数据库访问独立开,为将来系统更换数据保存介质(如目前系统使用文件系统存储数据,将来可以更换为使用数据库存储,又或者是现在使用了MSSQL存储数据,将来更换为Oracle或是Mysql等)提供了很大的灵活性。
下图给出了分层设计模型。控制器只需要调用Service接口中的方法获取或是处理数据,Service层对控制器传入的数据进行业务逻辑处理封装后,传给DAO层,由DAO层负责将处理后的数据写入数据库中。
在Service层使用了抽象工厂模式来实现Service层与DAO层的低耦合,Service层并不知道DAO层是如何实现的,实际上也不需要知道系统使用了哪种数据库或是文件系统。
在DAO层使用工厂模式来创建数据模型的实体对象。
Service层设计
接口代码,这里使用了泛型技巧,确保每个Service只处理一种数据类型。
package com.emerson.etao.service;
import java.sql.SQLException;
import java.util.List;
/**
* 业务实现层接口
*
* @author Chris Mao(Zibing)
*
* @param <T>
*/
public interface IBaseService<T> {
/**
* 将实体类对象持久化,写入到数据表中
*
* @param T
* @return 返回新写入记录的自增ID
* @throws SQLException
*/
public long insert(T entity);
/**
* 根据Id值,将实体类数据回写到数据库
*
* @param id
* @param T
* @return 返回更新的记录笔数
* @throws SQLException
*/
public int update(long id, T entity);
/**
* 根据Id值从数据库中删除实体类数据
*
* @param id
* @return 返回删除的记录笔数
* @throws SQLException
*/
public int delete(long id);
/**
* 根据Id查询具体的实体类信息,并返回实体类对象
* 若查询不到数据则返回null
*
* @param id
* @return T
*/
public T getById(long id);
/**
* 获取列表
*
* @return List
* @throws SQLException
*/
public List<T> getAll();
}
下面是具体的Service层接口代码,
package com.emerson.etao.service.base;
import java.util.List;
import com.emerson.etao.entity.base.BusinessApp;
import com.emerson.etao.entity.base.Communicator;
import com.emerson.etao.entity.base.Customer;
import com.emerson.etao.service.IBaseService;
/**
* 客服类操作接口
*
* @author Chris Mao(Zibing)
* @param <T>
*
* @param <T>
*/
public interface ICommunicatorService extends IBaseService<Communicator> {
public List<Communicator> getAll(Customer customer);
/**
* 为客服分配商业应用
*
* @param c
* @param appList
* @see BusinessApp
*/
public void assignBusinessApp(Communicator communicator, List<BusinessApp> appList, boolean deleteExists);
/**
* 为客服分配客户
*
* @param c
*