Springmvc工程项目结构及实用工具

                                Springmvc工程项目结构及实用工具

 

 

      在经过一番实践,并广泛借鉴和总结经验教训之后,J2EE应用程序出现了MVC(模型-视图-控制)模式。MVC的核心就是做到三层甚至多层的松散耦合

      介绍几个名词

      MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑

            Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。

            通常模型对象负责在数据库中存取数据。

            View(视图)是应用程序中处理数据显示的部分。

            通常视图是依据模型数据创建的。

            Controller(控制器)是应用程序中处理用户交互的部分。

       通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据

 

            VO(View Object):视图对象,用于展示层,简单的说就是页面展示的数据对象,它的作用是把某               个指定页面(或组件)的所有数据封装起来。

 

            DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为               了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能               和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。 

 

            DO(Domain Object):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一一对应             的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应PO的一个            ( 或若干个)属性。

 

       有人可能会提出为什么要分这么多对象,对于绝大部分的应用场景来说,VO、DTO、DO的属性值基本是一致的,而且他们通常都是POJO,因此没必要多此一举,但不要忘记这是实现层面的思维,对于设计层面来说,概念上还是应该存在VO和DTO,因为两者有着本质的区别,DTO代表服务层需要接收的数据和返回的数据,而VO代表展示层需要显示的数据。举个例子,在页面查询一个用户信息的时候,数据库中这个用户的性别属性值是0或1,但是页面需要展示的是男或女,此时vo中就会多一个sexNameCn的属性。再举个例子,如果客户端是web和app,业务逻辑是一样的,只是展示层数据格式不同,所以我们需要VO和DTO分离。

 

       下图是一个典型的springmvc maven工程结构



 

 

       下面主要介绍上图中src/main/java目录下的代码结构,此目录是业务系统实现的核心代码目录。

根据上述概念形成一个典型三层结构



 

 

        在VO、DTO、DO转换的时候一般的做法都是通过get和set方法来转换,也可通过cglib工具类对同名同类型的属性进行值复制。但是无法做到值转义,例如:运营商(VemOperator)这个VO类的合作模式(cooperateType)属性,cooperateType属性在数据库中存放的值是0或1(直营或加盟),展示层需要展示的对应的中文。

 

推荐大家一种做法,通过JsonSerializer,来动态操作vo。拿上面这个例子通过如下代码实现



 

 

增加一个cooperation_mode_cn属性表示中文含义

在VemOperator的cooperateType字段上通过JsonSerializer注解



 

 

 

有了基本的骨架,我们会想到,每个工程中都会有些工具类,比如xml读取、excel操作、获取spring上下文等等。所以我们需要一个util包。



 

代码中我们难免需要处理一些异常,这些异常和业务相关,所以我们创建一些自定义的异常类,所以引出了exception包。



 

 

同时推荐引入统一异常处理器



 

 

在spring配置文件中加入一下代码



 

 

这样我们的展示层就不会再返回用户500这个恶心的异常了。

 

随着业务越来越复杂,我们service层的业务类越来越多、业务越来越复杂。经常会出现,服务类与服务类直接调用,这样就造成服务层代码交错。一个常见的设计目标是使服务间的通信和相互依赖关系达到最小,所以我们增加一个façade层(门面层)。



 

通常根据实际情况,会对一些变化频率低或者量大的数据做缓存,减少对数据库的压力和加快操作速度,现在spring和cache做了很好的集成(所以不必担心用redis、ehcache、memcache),目前都是通过在service层和façade层类的业务方法通过注解的方式来实现。具体使用不展开说明了,转载一篇文章http://www.cnblogs.com/rollenholt/p/4202631.html

 

 

最后如果项目中使用了mybatis来做orm,推荐一个实用的分页工具

(com.github.pagehelper)

在pom文件中加入

<dependency>

    <groupId>com.github.pagehelper</groupId>

    <artifactId>pagehelper</artifactId>

    <version>5.0.0</version>

    <!--<version>4.1.4</version>-->

</dependency>

在需要分也的代码中加入

if(pageNum!=null && pageSize!=null){

    PageHelper.startPage(pageNum,pageSize);

}

不需要再sql中直接来写分页语句了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值