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中直接来写分页语句了。
相关推荐
实现注册和登录的springmvc小项目。
springmvc工程中的常用jar包总集!springmvc的必须包,上传文档需要的file_upload包,commons包 hibernateValidate包,jackson jstl的包 等等绝对超值!
根据慕课网SpringMVC入门课程,IDEA社区版编写的SpringMVC小项目。里面包含单文件上传,JSON解析。
maven springmvc 项目代码 可正常运行
第一个springmvc入门项目(非注解版)
idea spring springmvc mybatis 项目 idea spring springmvc mybatis 项目
完整的springmvc项目代码,简单的springmvc工程代码,项目框架。
此文档详细讲解了如何搭建springmvc项目,springmvc好教程
springboot+springMVC练习项目,包括常用的基础功能呢
SpringMVC4.0以后,Spring开始使用Spring Boot来支持自动化开发和部署,虽然方便了程序员和运维,但是也让老的架构开发人员感到困惑。 所以,作者做了一下研究尝试将新的Spring Boot的web项目,转换成旧项目模式,...
SpringMVC+MyBatis框架搭建的项目
springmvc工程简单模板,仅加入了spring架包,已配置web.xml、application.xml。用Tomcat部署,可直接用浏览器运行工程。
SpringMVC+mysql大型项目源码,目前客户在使用的,适合初学者及开发者,有系统管理用户权限分配、机械管理、分页、视图、IReport等,使用了extjs。
springmvc 实例项目简单登录功能
maven开发springMVC完整实例
springMvc项目基本结构编写
建立SpringMvc工程.doc
springMVC简单工程搭建,包含jar包,有静态文件,lib包,controller,service,dao层创建,结构清晰明了。并有简单controller想页面传数据的简单案例,十分适合初学者学习,对应的原理和工程搭建步骤介绍可见...
springmvc 示例项目goodDay 详情参考博客http://blog.csdn.net/niaoer2010/article/details/78732865
可运行的SpringMVC项目,是通过springmvc注解的方式进行的,同时集成了Hibernate,数据库是Oracle,里面也有SpringMVC对文件上传、Ajax请求、自定义拦截器功能的实现,出自csdn上的linuszhu的SpringMVC经典系列。