SSM框架的搭建

杂谈


很久不更新微博了,失踪了很久...究其原因嘛...找到了实习,只不过不是Android的而是Java的,先来说下为什么我不做Android了。原因贼简单,就三个字,找不到。首先我得承认我的技术比较一般吧,不过就我这一般的水平我感觉应该能找到的啊,我比不少人还是要强上一些的,我就接着找,找啊找,投出去的简历一点回音都没有,好难受啊,为啥没回音啊....为啥?原因更简单,现在的安卓项目不多,需要的人本身就不多,这是一个方面,另一个方面是正如你所见,安卓应用不难做,需要的人手不多,这个不多是多少呢,一个公司大概就需要一两个吧。也就是说你要找Android的工作就是要和精英去比拼,要花的成本可以说是非常高了,再加上投了那么多天的简历对我打击也不小,于是尝试去做Java实习,感觉好找多了,有不少公司肯要我呢...只不过实习时间比较长,半年起步吧...一开始我只是想找暑假实习而已啊,于是我就和HR交流,通过和HR的交流我了解到2,3个月的实习你学不到什么,就算你学到了,做2,3个月你就跑了,那公司的利益谁来保证呢。我一想,是这么个道理,那我就做个久一点的实习吧....进了公司不可能直接让你进公司的项目组,直接进了那就有鬼了。公司项目究竟用的什么框架,先不告诉你,先让你做个SSM的项目(Java框架就这么几种,你猜吧,我就是不告诉你),我也不想那么多了,我就跟着做,感觉十分不得劲,于是我就自己也做了一个SSM,我打算总结一下。废话说得够多的了,接下来我们进入正题


正题


首先要了解一个概念,SSM框架就是Spring+SpringMVC+MyBatis的整合,既然是整合,那么你就应该了解一下,拆分出来的每一项的大致是干什么的,先有个概念才好往下走


Spring


Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

按照我的经验来看,Spring他就是一个容器,你按照一定的规则,将数据库的一系列接口都放进去,填充这个容器。你可以把Spring看成是这个装切片面包的包装袋,把这些切片面包整合在一起,等你想要使用Spring里的数据库接口时,那你就打开包装袋,取出你需要的那块面包,而那块面包就是你需要的接口


随便找的切片面包


SpringMVC


Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。

就是使用SpringMVC的规则分配MVC,相当于SpringMVC帮你封装好了一系列方法,免去了你自己去封装的时间,提高了效率

具体的SpringMVC流程可以看这一篇:SpringMVC流程

MyBatis


 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。MyBatis是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录

简单来说嘛,就是MyBatis是用来处理数据库这部分的框架,不再使用jdbc的复杂操作,而是使用XML和注解将接口和 Java POJOs(按我的理解POJO就是数据实体类)映射成数据库中的记录。类似于Android的关系映射模型,非常好理解


对这三个东西有了一定的了解后,我们来看看具体的搭建吧



SSM框架的搭建


SSM项目通常使用Maven来进行整合,那我们就来创建一个Maven工程


点击finish完成创建,创建后你就会发现webapp下竟然什么都没有,什么都没有tomcat怎么跑的起来?教你个技巧,右键点击项目,点击最下面的那个properties,在左边框框里选择project face,把Dynamic Web Module上钩去掉,再选上,他在底部就会显示一行further configuration available,你将WebContent改成src/main/webapp,ok,是不是发现webapp下有东西了,那么一个maven项目就建好了。但是仍然有配置需要你更改,比如创建出来的项目默认支持JDK1.5,你要改一下,改成1.7以上的版本,怎么改版本我就不多说了,网上多的是教程。还有就是你需要更改一下maven的setting文件,点击window下的preference,找到Maven,他下面有一个setting,根据他给你的地址找到这个这个文件,并用文本编辑器(比如notepad++)打开它,找到mirrors并添加下面这段话,这段话的意思就是让你采用阿里云镜像,用了之后你以后添加jar包啊什么的下载速度嗖嗖的,毕竟是国内大公司的镜像,确实不错

还有一个配置是将你所拥有的JDK信息按照这个格式也加入setting文件中,配置好这些东西后,这已经是一个可以用的Maven项目了。好,那我们接着往下走

接下来,你将体会到Maven的优势,就和Android的引入框架一样,操作简单还非常好用


这个就是引入jar包的过程,有两点要说的,第一个你的dependency要写在dependencies中,第二个你的dependency是哪来的?一个一个手敲得累死你,复制别人博客上的?确实是一种好方法,但是别人博客上的又是从哪来的呢?我告诉你是从哪来的啊,给你开启新世界的大门。

打开百度搜索mvn repository,点击第一个,在搜索框中你就可以搜到你想要的所有东西!比如说我要找spring webmvc

点进去后的界面

点击其中的一个版本

没错,就是这么简单,接下来你要依次将spring webmvc,spring jdbc,spring aspect(这几个东西版本要对应)mybatis,mybatis Spring(mybatis和spring的适配包),c3p0,mysql(oracle的驱动有点特殊,需要导本地的),jstl,servlet-api(这个需要给scope属性加provided),junit的配置信息添加进pom文件中


接下来是重头戏,要说web.xml,spring,spring-mvc,mybatis

首先是web.xml(配置Spring,SpringMVC,字符编码过滤器)

ContextLoaderListener

关键是applicationContext.xml的这个路径他是在 项目名/src/main/resources下的,不要搞错位置也不要弄错名字,不让名字错的最好方法就是复制粘贴

接下来,你需要在web.xml同级目录下创建Spring的配置文件,名字是当前servlet(dispatcher)-servlet.xml

配置字符串编码过滤器,这个没什么好说的,照着做就行

这个可有可无,这个的作用是如果你使用Rest风格的URI请求,就将普通请求转化为delete或者put


接下来是SpringMVC(只扫描控制器,配置视图解析器,必备的两个配置)

需要use-default-filters="false"来解除默认的扫描方法,让他只扫描Controller

配置视图解析器,路径是/WEB-INF/view/,类型是.jsp,这路径的看你怎么定义了,像我这样的应该比较常见

这两条语句是必备的,不写的话很多功能都会出错



接下来是Spring(配置数据源,与mybatis整合,事务控制)


这里使用了c3p0,并给这个bean设置了id,这里的value值都是取自src/main/resources下的jdbc.properties,千万不要放错了,第一个红色代表你的SID(数据库连接名),第二第三表示用户名和密码


这里是Spring和Mybatis的整合,创建一个bean,他的class是SqlSessionFactoryBean,这步很关键务必要配好,不然可能会出现各种各样稀奇古怪的错误。在src/main/resources下配置mybatis-config.xml,mybatis-config.xml是一会要说的mybatis的配置文件。还要配数据源dataSource,这里用的是上面c3p0的id。最后配mapperLocations,他的路径是src/main/resources/mapper下的所有xml文件,你千万不能填错,特别是用了自动生成mapper和实体类的工具的时候,他会在src/main/java下生成一个mapper文件夹,我曾经就把这个空文件夹的地址放入其中,把自己搞得焦头烂额


配置扫描器将所有的dao包下的接口添入spring容器中,这个的话你只要注意他的name和value就好,这个value你就复制(ctrl+c)一下自己的包再粘贴过来


这里是配置事务控制,首先要获取数据源,我获取的是我自己配上的c3p0,其中execution(* com.crud.service..*(..))这个你需要了解一下。execution是切入点指示符,是必须要有的东西,com.crud.service表示你的切入点是在这个service包下,这个".."表示就算是这个包下的子包也配置了事务控制,"*"表示所有的内容,"(..)"表示任意参数


这里是配置事务增强,以get开头的所有方法都会得到一定的优化,增强需要在advisor中引入,还有就是事务控制id的要和事务增强的id一致,方便控制事务的细节


这是最后一个,Mybatis(一些设置,起个别名)

还记不记得我们在Spring中配置了一个mybatis-config.xml?我们就在这个文件下配置我们的Mybatis,那么怎么配呢?我们来看看官网吧,在百度中搜索mybatis,打开第一个网页,你可以看到一个忍者鸟

MyBatis官网

点击"getting start",把框起来的这部分复制到mybatis-config.xml,你可能会好奇这个东西是什么?为什么需要他?没有他又会怎么样?

!DOCTYPE是一种标准通用标记语言的文档类型声明,它的目的是要告诉标准通用标记语言解析器,它应该使用什么样的文档类型定义(DTD)来解析文档。你可以简单理解为mybatis规定了一定的规则让你来写这个配置文件,把他加入mybatis后你就可以自动补全出configuration等配置标签,没有这个规则那些配置标签肯定还是能生效,因为你已经在maven中已经添加了mybatis的jar包,但是你一个一个的手打标签效率就很低了


在configuration中加入setting设置,这个的意思就是让你的命名遵守驼峰规则,驼峰规则你要是不知道就百度一下吧,setting肯定也不止这么一个,你可以点开Configuration XML,他这里有个setting

你点进这个setting之后你就可以看到各种各样的设置,这个就根据你项目的需求来定了

你还可以设置一下类型别名,方便我们引用

至此,一个SSM项目的整合已经完成了!我再加一点额外知识,关于MyBatis的逆向工程,逆向工程听着高大上,其实就是根据你的数据库里的表生成对应的实体类以及mapper(数据库层面的具体操作,例如增删改查),所需道具就是MyBatis Generator


MyBatis Generator

百度搜索MyBatis Generator,打开他,看一下


你会发现这个界面和MyBatis的一样,其实我就是懒得在官网里点而已....好的,我们点一下Running MyBatis Generator With Maven,开启我们的逆向工程

因为我们使用了Maven,我可以用Maven来导入他,去Maven Repository,搜索MyBatis Generator,找个最新的版本添加进pom.xml中


选择这一项,你就会看到一个例子,在项目的根目录下创建一个mbg.xml,将他复制进来,复制进来以后你要将示例改为你自己的设置


将数据库连接信息改为自己的

将实体类的信息配上,自己的包名和地址,到时候它自动生成的实体类就放在这个包下

设置好你要生成的mapper要放在哪,也是更改包名和地址

设置好你要生成的dao他放在那,依旧是更改包名和地址


最后这个tableName是数据库的表名(数据库里表名是什么你就是什么,一字不要差),domainObjectName是实体类的名字(自己取名,最后别取的和数据库的表名一模一样,出错了也不好分辨)

最后就是试一试能否自动生成,这五种方法都可以运行MBG,你是用哪一种都没有问题,反正他都有例子


反正我用的Java代码的方式,你在写java的地方创建一个类,给他一个主函数,把List那一长串放进去,导包,把new File("generatorConfig.xml");里的xml改成你自己创建的mbg.xml,右键点击main,点击Run as再点击Java Application,然后刷新一下项目,你的项目下就会多了很多自动生成的代码

久了不用MBG还填这么复杂的包名很容易出错,我的办法是就建在不重要的根目录(比如maven的target目录)下,等东西建好了再把他们移到对应的包下即可,虽然拖来拖去麻烦点,但是不会报错,报错还要思考,做事不动脑才是最开心的


总结


写到这里,我就把SSM的整合详细走了一遍,鉴于我懒得学不会用Markdown文法,没有办法把代码放进一个框里,如果你要是按照我的做法来搭框架可能会很烦,毕竟你是一行一行手敲嘛,但是你的理解也会比别人的深,成就感也会比别人大,也不是特别亏吧...如果你发现我说的有什么不对的,欢迎指教!我们一起讨论,一起进步!

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 119,493评论 16 133
  • 【日精进打卡第181天】 【知~学习】 《六项精进》大纲0遍 共178遍 《大学》大纲0遍 共178遍 【经典名句...
    _哆啦阅读 79评论 0 0
  • 一个雷电交加的晚上,为什么雷电交加?不知道,反正听起来很有气氛。就在这个晚上,小贾出生了。出生的那一晚上,他的哭啼...
    soulproof阅读 115评论 0 1
  • 文章开头:本文是活动盒子运营社老师发表在产品壹佰的文章(http://www.chanpin100.com/art...
    萌丸1014阅读 185评论 0 3
  • 这几天的我,经常在怀疑,我的肚子里的宝宝还安在吗?因为,我一点孕吐反应都没有。 前几天的时候,肚子里白天的时候还能...
    朵朵去哪儿阅读 44评论 0 0