1.前言
之前都是在现有框架下进行写代码或者总是看一些别人的架构总会眼高手低。于是打算自己完整的走一遍流程同时把所遇到的问题思考的问题记下来供大家参考。由于是工作年限不高属于新手不足之处还请各位大牛指正。
项目选用Spring为基础框架由于目前项目中采用的是Hibernate在多表关联查询方面以及复杂的统计计算方面同时要兼顾性能的时候吃了不少苦头所以这里采取Mybatis做持久化框架没实战搭建过Spring MVC框架。在权限控制方面现有项目中采用的是shiro为了学习这里使用spring security。其他的细节问题会在下面各小节中叙述。
另说明一点的是操作系统是mac。
github项目源码在https://github.com/sjlian/sjlian 欢迎clone并提出意见。
2. 创建mvn项目、完善目录结构
首先安装和配置环境主要包括jdk、mysql、maven等其他如redis、nginx、ActiveMQ等在初始版本还暂时没上传和使用。这些入门知识不再赘述。
在idea上新建一个mvn项目然后有一个create from archetype里面有很多选项于是有个疑问到底用哪个呢遂逐一查看名字看到mvn-archetypr-webapp听名字就觉得和自己的预期是一样的啊于是果断选择。期间又试了下其他的各个archetype发现这这是一个模板可以根据自己需要选择也可以默认缺省的。这里附上mvn官方标准化的目录结构如下图
一个好的程序员都善于用命令行的方式解决问题于是思考怎么用mvn命令行创建项目。最简单的方式就是mvn archetype:generate这个命令是默认的 archetype如果需要生成特定模板的项目呢从maven的Repository里查找arche types发现有几百个我们平时用的也就那么几个由于太多就变得很不方便起来于是搜索资料查到 http://maven.40175.n5.nabble.com/archetype-catalog-xml-location-archetype-crawl-versus-archetype-generate-td113741.html
完善目录结构大致如上图是demo最终版本这个时候只需要在java目录下新建几个包进行分层使项目结构变得清晰。
common主要放置一些通用的非工具类如exception相关结果相关拦截器servletVO类等。
Controller、DAO、model、service顾名思义分别是控制层、持久层、数据模型层、业务处理层。
util主要存放各种工具类例如字符串、时间、poi、邮件、ip等
resource主要是配置文件包括spring相关配置文件、mybatis配置文件、mybatis映射文件、日志配置文件等
web-inf下最重要是web.xml作为启动需要首先加载的文件引入其他配置文件、配置listener、servlet、filter、Interceptor等。
其他是和前端相关文件
test是和测试相关。
建好以上目录开始进入正题。
3. 引入Spring
3.1 web.xml
web程序启动会去读取它的配置文件 web.xml首先需要配置web.xml添加上spring的监听器、spring mvc的Servlet。
ContextLoaderListener 它实现了ServletContextListener这个接口在web.xml配置这个监听器启动容器时就会默认执行它实现的方法。在ContextLoaderListener中关联了ContextLoader这个类所以整个加载配置过程由ContextLoader来完成。
RequestContextListener implements ServletRequestListener监听用户的请求用于日志系统不是必需的。
IntrospectorCleanupListener监听器主要用于解决java.beans.Introspector导致的内存泄漏的问题(Quartz,Struts)如果没有struts和quartz不是必需的。
Spring MVC 以自启动servlet的形式加载同时引入相关spring/spring-mvc.xml配置文件。文件路径classpath:开头,从classpath加载,否则尝试URL,如果失败,调用 getResourceByPath。
此外为了防止中文乱码需要encodingFilter设置session超时时间、用户自定义Listener、servlet、filter、interceptor等。
3.2 pom.xml
直接把Listener复制到xml中会发现ide并不识别是因为相关依赖还没有导入项目中的原因。 在pom.xml中引入spring相关引入的时候会发现depency有一些属性值如groupId、artifactId等对于开源项目来说这两项是固定的按照文档导入即可version是版本号为了便于升级和管理建议版本号统一配置。
有时候会发现还有scope属性如junit的scope属性值是test用于test任务时使用compile(default)编译时使用provided类似于编译但支持你期待jdk或者容器提供类似于classpathruntime在执行时需要使用system需要外在提供相应得元素。通过systemPath来取得
有时候会遇到依赖冲突例如同时导入了A、B包但是A包又引用了B包当版本不一致时就会冲突解决方式是mvn dependency:tree 分析冲突的包然后在相应的A包中配置<exclusions> 把B包排除在外。
如果想引入本地依赖1、使用scope system和systemPath指向依赖包2、mvn install命令进行安装并配置group和artifact然后直接引入。3、建立pom依赖关系。POM关系主要为依赖继承合成在这个小项目中用不到且不是重点故略去。
3.3 其他配置文件
spring-mvc.xml主要配置如下。
1.开启注解模式就可以使用注解方式@ResponseBody,@RequestMapping等。
2.对于静态的jpg、css等不需要通过mvc。
3.添加前后缀注意路径。
4.扫描controller的bean让spring知道哪些是controller@Controller。
如果需要对返回值进行json统一化处理在这里可以引入json处理如fastJson、jackson等。fastJson轻量级速度快但是支持有轻微漏洞jackson灵活性好但是比较笨重这里选用的是fastJson配置如下。
如果需要上传文件还需要配置文件上传如下
web.xml中引入配置文件该配置文件作为spring基础配置文件再引入其他文件。
spring.xml中配置如下,这里注入service、引入mybatis、security配置配置事务管理、开启声明是式事务@transtraction。
4.引入Mybatis
4.1 文件配置
在spring.xml中引入了spring-mybatis.xml用于Mybatis和spring的整合配置。同时pom.xml中引入相关依赖。
1.配置数据源数据库连接池可以选择的有c3p0、druid、dbcp、HikariCP等这里选择阿里的开源框架druid,配置如下。url、username等建议写在property文件中。
2. 配置sessionFactory, 引入mybatis全局配置文件、entity使用别名扫描mapping.xml
3. 配置DAO接口注入Srping容器中。
4. 配置mybatis-config.xml
5. mvc层搭建
5.1 DAO层
由于mybatis不支持jpa不能由实体映射数据表所以需要自己新建数据表和数据实体。
可以使用工具由数据表生成数据实体。
数据实体在model目录下。
映射文件在resources/mapper下如果设置了自动转换对象关系名这里不在需要配置对象关系的名称映射但是需要注意命名的书写注意namespace一致。
DAO接口文件在dao目录下DAO实现在mapper的xml中select/update id和接口中的方法对应即可。在service注入dao的时候会提示无法注入的错误忽略即可。
5.2 service层
在service下定义接口在service/impl/下定义实现加上@Service注解
5.3 Controller层
在Controller目录下可以实现封装好的json数据、string连接、ModelAndView。
6. DEMO完善
5.1 加入日志系统
log4j,配置log4j.properties。如下
然后可以利用filter做请求参数日志输出。
利用aop做一些其他日志输入。
5.2 封装统一化返回值
前后端json数据交互自定义ResponseResult包括头信息状态码错误信息说明异常数据信息。
异常通过@ControllerAdvice 捕获到然后封装处理返回给前端不至于页面报错或者自定义异常弹窗。
5.3 工具类准备
各种工具类提取
5.4 权限控制
使用spring security目前还是半成品以后完善。
5.5 其他处理