写在前面

学习javaweb数月有余,但都是为了跟着公司做项目,盲目、硬生生的套用一些框架,然而我并不理解其原理,甚至对最基础的分层结构都还模棱两可、不可明辨。

好在经过这次项目,我是能初步理解Controller、Service、Dao层各自的用处了。


Controller层

Controller层即控制层,用于处理页面上的请求,并通过RequestMapping的不同来通过不同的Service方法处理该请求,并将处理结果返回。

在一个Controller方法里,可能会调用不同的Service来处理一个请求任务。

下面通过A和B生小孩儿为例,便于理解 :
假设用户在网页上发出生小孩请求,并且给了A和B的基因。

@Controller
@RequestMapping("/makeBaby") //请求路径
public Baby makeBaby(HttpRequest request){
    DNA A = request.getParameter("A");//得到参数A
    DNA B = request.getParameter("B");//得到参数B
    String name_A = AService.getNameByDNA(A);//通过参数A得到A的名字
    String name_B = BService.getNameByDNA(B);//通过参数B得到B的名字
    Baby C = CService.makeBabyByAAndB(name_A,name_B);//通过AB得到Baby
    return C;//返回这个Baby给请求页面
}

Service层

Service层负责处理业务层逻辑,即对java对象的操作。

每一个Service方法,可能会调用多个不同的Dao来实,因为Service是在对象层面上的业务逻辑处理。

例如要处理一个C对象,需要同时获得B对象和A对象,那么Service就会调用ADao和BDao来分别取得对象,再通过处理来得到C,并将C返回给Controller层。

Service层并不处理任何对数据库层面的数据操作。

此处示例忽略接口继承,重在层次理解。

@AutoWired
ADao iADao;//此处注入Dao对象
BDao iBDao;
CDao iCDao;
@Service
public Interface CService(){
    public Baby getBaby(String name_A,String name_B){
        firstName = iADao.getFirstName(name_A);//A的dao层获得姓氏
        lastName = iBDao.getLastName(name_B);//B的dao层获得名字
        return iCDao.getBaby(firstName,lastName);//C的dao层获得baby
    }
}

Dao层

Dao层即数据操作对象层,也就是和数据库层面打交道的。

每个Dao对象对应数据库中一张表,Dao层的方法仅用于对该表的增删改查操作。

此处以A为例:

public Interface ADao(){

    //增
    public addName(String name){
        sql="insert into table_A values (name)";
    }
    //删
    public delName(String name){
        sql="drop user from table_A where name ="+name;
    }
    //改
    public updateName(String name){
        sql="update table_A set Name = "newName" where name = "+name;
    }
    //查
    public queryName(String name){
        sql="select * from table_A where name = "+name;
    }
}

写在后面

分层结构有时候确实很难理解,但是我们要记住,每一层都只对上一层负责,并且只调用下一层,这样才可以保证代码的解耦性,保证下层的改变不会影响上层的稳定性,并且将数据库数据对象化,也更有助于持久化。