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相关,结果相关,拦截器,servlet,VO类等。

  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或者容器提供,类似于classpath;runtime在执行时需要使用;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,目前还是半成品,以后完善。

  

  

  

  

      

 

搭建SSM项目框架全过程及思考的更多相关文章

  1. 搭建ssm项目框架

    [声明]转载注明链接,源码联系公众号:aandb7获取 [此处组织名groupId:com.dayuanit,可替换公司域名:项目名artifactid:...] 此处第二个配置文件选择maven安装 ...

  2. ssm项目框架搭建(增删改查案例实现)——(SpringMVC+Spring+mybatis项目整合)

    Spring 常用注解 内容 一.基本概念 1. Spring 2. SpringMVC 3. MyBatis 二.开发环境搭建 1. 创建 maven 项目 2. SSM整合 2.1 项目结构图 2 ...

  3. Maven 搭建 SSM 项目 (oracle)

    简单谈一下maven搭建 ssm 项目 (使用数据库oracle,比 mysql 难,所以这里谈一下) 在创建maven 的web项目时,常常会缺了main/java , main/test 两个文件 ...

  4. 自动搭建ssm项目

    手把手教你搭建ssm项目 注意,必须修改:包名.数据库名称.账号.密码 注意:必须配置好第一次,“引入后”才能配置第二次 第一步:打开idea选择创建maven项目 import java.io.*; ...

  5. 搭建SSM项目时报错(org.springframework.jdbc.CannotGetJdbcConnectionException)

    严重: Servlet.service() for servlet [SpringMVC] in context with path [/ssm] threw exception [Request p ...

  6. 用idea搭建SSM项目,原来这么简单

    目录 前言 软件环境 创建项目 数据库文件 配置文件 pom.xml log4j.properties jdbc.properties applicationContext.xml spring-mv ...

  7. Spring Boot2 系列教程(一)纯 Java 搭建 SSM 项目

    在 Spring Boot 项目中,正常来说是不存在 XML 配置,这是因为 Spring Boot 不推荐使用 XML ,注意,并非不支持,Spring Boot 推荐开发者使用 Java 配置来搭 ...

  8. 使用vue2.x+webpack+vuex+sass+axios+elementUI等快速搭建前端项目框架

    一.本文将分享如何快速搭起基于webpack+vue的前端项目框架,利用vue的自己的脚手架工具vue-cli搭建起基本的环境配置,再通过npm包管理工具引入相应的依赖来完善项目的各种依赖框架.下面是 ...

  9. 模拟Springboot一:(零xml配置搭建SSM项目)

    在spring官网文档中无论是spring的基础文档,还是spring-mvc文档都推荐我们使用javaconfig的方式来搭建项目 间接说明 (优点:javaconfig配置>xml配置) 其 ...

随机推荐

  1. JS中判断数组的方法

    JavaScript中检测对象的方法 1.typeof操作符 这种方法对于一些常用的类型来说那算是毫无压力,比如Function.String.Number.Undefined等,但是要是检测Arra ...

  2. ArcGIS 网络分析[2.5] VRP(车辆配送)

    什么是VRP? VRP就是车辆配送. 大家有没有想象过一个城市的某个快递营业点,是怎么让各个快递员配送快递的? 每个快递员针对那片区域的客户,如何走路线才最省时间? 也许你会说,最短路径分析可以做到— ...

  3. 3D图片变换

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  4. 【Python的迭代器,生成器】

    一.可迭代对象和迭代器 1.迭代的概念 上一次输出的结果为下一次输入的初始值,重复的过程称为迭代,每次重复即一次迭代,并且每次迭代的结果是下一次迭代的初始值 注:循环不是迭代 while True: ...

  5. Outlook 客户端无法通过 MAPI over HTTP 连接

    随着Exchange 版本更新升级,是否进行验证客户端建立MapiHttp连接所需的服务器设置已正确配置.即使服务器,负载均衡器和反向代理的所有设置都正确,您可能会遇到连接到Exchange Serv ...

  6. Bottle源码阅读笔记(一):WSGI

    前言 Bottle是一个Python Web框架.整个框架只有一个文件,不到4k行的代码,没有Python标准库以外的依赖,却包含了路由.模板和插件等Web框架常用功能.通过阅读Bottle源码来了解 ...

  7. Eclipse导入项目常见问题----乱码问题03

    有时打开导入的项目文件时,会出现如下图情况: 解决方法 如下图步骤所示: 此时,我们可以看到文件正常了 jdk版本问题(有个红色感叹号)01:http://blog.csdn.net/baidu_37 ...

  8. ActiveMQ 学习第二弹

    经历了昨天的初识 ActiveMQ,正好今天下班有点事耽搁了还没法回家,那就再学习会 ActiveMQ 吧!现在官网的文档没啥好看的了,毕竟是入门学习,太深奥的东西也理解不了.然后看官网上有推荐书籍& ...

  9. KNN算法介绍

    KNN算法全名为k-Nearest Neighbor,就是K最近邻的意思. 算法描述 KNN是一种分类算法,其基本思想是采用测量不同特征值之间的距离方法进行分类. 算法过程如下: 1.准备样本数据集( ...

  10. C# 调用cmd.exe的方法

    网上有很多用C#调用cmd的方法,大致如下: [c-sharp] view plaincopy private void ExecuteCmd(string command)   {   Proces ...