Discuz! Board

标题: 认真分析清楚MVC Action domain dao之间的关系 [打印本页]

作者: zangcf    时间: 2016-3-1 23:05
标题: 认真分析清楚MVC Action domain dao之间的关系
认真分析清楚MVC Action domain dao之间的关系

作者: zangcf    时间: 2016-3-7 16:26
Java Web基础——Action+Service +Dao三层的功能划分1. Action/Service/DAO简介:

     Action是管理业务(Service)调度和管理跳转的。
      Service是管理具体的功能的。
      Action只负责管理,而Service负责实施。
      DAO只完成增删改查,虽然可以1-n,n-n,1-1关联,模糊、动态、子查询都可以。但是无论多么复杂的查询,dao只是封装增删改查。至于增删查改如何去实现一个功能,dao是不管的。
      总结这三者,通过例子来解释:
      Action像是服务员,顾客点什么菜,菜上给几号桌,都是ta的职责;
      Service是厨师,action送来的菜单上的菜全是ta做的;
      Dao是厨房的小工,和原材料打交道的事情全是ta管。



相互关系是,小工(dao)的工作是要满足厨师(service)的要求,厨师要满足服务员(action)转达的客户(页面用户)的要求,服务员自然就是为客户服务喽。
      现在最基本的分层方式,结合了SSH架构。Model层就是对应的数据库表的实体类。Dao层是使用了Hibernate连接数据库、操作数据库(增删改查)。Service层:引用对应的Dao数据库操作。Action层:引用对应的Service层,在这里结合Struts的配置文件,跳转到指定的页面,当然也能接受页面传递的请求数据,也可以做些计算处理。
      以上的Hibernate, Struts,都需要注入到Spring的配置文件中,Spring把这些联系起来,成为一个整体。



2. 三大框架Struts/Hibernate/Spring
      简单地说:
     Struts——控制用的;
     Hibernate——操作数据库的;
     Spring——解耦用的。
     详细地说:
      Struts在SSH框架中起控制的作用,其核心是Controller,即ActionServlet,而ActionServlet的核心就是Struts-config.xml,主要控制逻辑关系的处理。
      Hibernate是数据持久化层,是一种新的对象、关系的映射工具,提供了从Java类到数据表的映射,也提供了数据查询和恢复等机制,大大减少数据访问的复杂度。把对数据库的直接操作,转换为对持久对象的操作。
      Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。面向接口的编程,由容器控制程序之间的依赖关系,而非传统实现中,由程序代码直接操控。这就是所谓“控制反转”的概念所在:(依赖)控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。依赖注入,即组件之间的依赖关系由容器在运行期决定,形象地说,即由容器动态地将某种依赖关系注入到组件之中,起到的主要作用是解耦。
      Struts、Spring、Hibernate在各层的作用:
    (1)Struts负责Web层:ActionFormBean接收网页中表单提交的数据,然后通过Action进行处理,再Forward到对应的网页。在Struts-config.xml中定义<action-mapping>,ActionServlet会加载。
    (2) Spring负责业务层管理,即Service(或Manager)。
    (3)Hibernate,负责持久化层,完成对数据库的crud操作。

复制代码


提供OR/Mapping。它由一组.hbm.xml文件和POJO,是跟数据库中的表相对应的。然后定义DAO,这些是跟数据库打交道的类,它们会使用PO。



3. 框架业务逻辑分析:
       在Struts + Spring + Hibernate的系统中,
       对象的调用流程是:JSP—Action—Service—DAO—Hibernate
       数据的流向是:ActionFormBean接受用户的数据,Action将数据从ActionFormBean中取出,封装成VO或PO,再调用业务层的Bean类,完成各种业务处理后再Forward。而业务层Bean收到这个PO对象之后,会调用DAO接口方法,进行持久化操作。
      SSH框架的优点:
      Hibernate的最大好处就是根据数据库的表,反向生成实体类,并且还有关系在里面,还有就是它对数据的操作也很方便;
      Spring,省去了在类里面new对象的过程,把这个调用与被调用的关系直接展示到了配置文件里,做任何操作都变得简单了。
      简单流程举例说明:
      程序框架搭建好,并且把各种jar包导入后,就开始进行业务逻辑分析——
      假设一个最基本的注册功能:页面有两个文本框,一个用户名(username)和一个密码(password)。以QQ注册网页说明,这里以昵称和密码为代表进行举例。





作者: zangcf    时间: 2016-3-7 16:31
java service domain dao 分层思路::::::这个部分描述更好
今天在参加其他项目研发时,对其项目的java后台的分层有一些看法:

首先,鼓励使用service domain dao 层分层设计概念。

其次,对几层作用的理解:



第一:dao层操作单表,不涉及复杂逻辑,主要是表的增删改查操作,完全根据domain的要求来查询数据。

第二:domain层考虑业务逻辑,例如过滤条件,放行或者返回,以及数据的处理,为调用dao层做好准备,一个domain可以调用一个或者一组相关的dao层

第三:service层调用一个或者一组domain层,主要是展现需要开放出去的接口,其中domain层不是所有的接口都要再service层体现的,可能仅在service层开放几个接口出去,此外,主要接口需要对接受的参数要尽量的扩大化,也就是说可以容纳各种类型的参数的接入(Object),然后需要在service层做好转换,以备domain层使用。

正确的设计应该是,一个领域活动会聚合对应一个或一组DAO ,来完成一个领域活动。而一个服务可能包含两个领域活动,比如一个转账的业务,对应两个领域活动。两个帐户的金额分别发生变化,需要操作一组领域活动,而每个活动需要操作很多表(调用多个DAO )。

使用 接口方式可以实现系统之间的松耦合:

一般定义: IUserService  UserService  IUserDomain  UserDomain  IUserDao UserSqlDao   UserHbaseDao

使用接口可以有不同的实现类 ,不需要改代码,可以通过配置更改不同的实现类
作者: zangcf    时间: 2016-3-7 16:38
JPA是如何掺入这个里面的?




欢迎光临 Discuz! Board (http://47.89.242.157:9000/bbs/discuz/) Powered by Discuz! X3.2