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. JMeter-MyEclipse编译运行问题(Could not read JMeter properties file)

    JMeter-MyEclipse编译运行问题按照 此贴 http://phoenix0529.iteye.com/blog/1530728 进行配置,然后用Ant编译Build.xml 是可以的. 但 ...

  2. The dplyr package has been updated with new data manipulation commands for filters, joins and set operations.(转)

    dplyr 0.4.0 January 9, 2015 in Uncategorized I’m very pleased to announce that dplyr 0.4.0 is now av ...

  3. jQuery插件 -- 图片随页面滚动fixed

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. mybatis中$和#java代码演示

    MyBatis mapper文件中的变量引用方式#{}与${}的差别 内容来源:http://blog.csdn.net/szwangdf/article/details/26714603 默认情况下 ...

  5. 基于查表的整数霍夫变换方法实现(matlab)

    暂时先用matlab把算法弄一下,这是基于查表的整数霍夫变换方法实现及解释. 接着再实现FPGA的霍夫变换. 霍夫变换原理和算法这里不多说,可参考以下链接: http://blog.csdn.net/ ...

  6. JavaScript实现上传图片预览[js前端实现]

    <body> <input type="file" id="file_input" onchange="show_image()&q ...

  7. 通过wireshark学习Traceroute命令(UDP,ICMP协议)

    traceroute: 通过TTL限定的ICMP/UDP/TCP侦测包来发现从本地主机到远端目标主机之间的第三层转发路径.用来调试网络连接性和路由问题. mtr: traceroute的一个变种,能根 ...

  8. CentOS升级Python2.7导致使用pip等命令安装模块失败

    报错如下: # pip Traceback (most recent call last): File , in <module> from pkg_resources import lo ...

  9. React+Redux开发实战项目【美团App】,没你想的那么难

    README.md 前言 开始学习React的时候,在网上找了一些文章,读了官网的一些文档,后来觉得React上手还是蛮简单的, 然后就在网上找了一个React实战的练手项目,个人学完之后觉得这个项目 ...

  10. shell脚本调用C语言之字符串切分之strtok函数

    今天上午在写一个需求,要求的比较急,要求当天完成,我大致分析了一下,可以采用从shell脚本中插入一连串的日期,通过调用proc生成的可执行文件,将日期传入后台数据库,在数据库中进行计算.需要切分日期 ...