SSM 框架即 SpringMVC+Spring+Mybatis,相比 SSH(Struts2+Spring+Hibernate)来说较新,SpringMVC 可与 Spring 更好的整合,Mybatis 相比 Hibernate 使用更简单、轻便,大部分公司都在使用 SSM 这套框架,主要是轻量级、易使用,故本达人课特选择 SSM 框架作为课程主题,希望通过实战项目让大家对 SSM 框架及其他相关技术有一个清楚的认识,并能够正确的运用到项目中去。
通过本课程,您将学习到以下内容:
本课程共包含三大部分:
第一部分(第1-4篇),基础环境搭建,包括 SSM 框架的整合,MySQL 表结构设计、实体类的生成、接口的设计等。
第二部分(第5-17篇),项目主要功能的实现,包括登录、注册、激活、首页展示及分页、评论回复点赞模块、个人主页、资料修改等功能的实现。通过实战直观、深入的了解 SSM 框架开发的特点及对各个技术点的掌握。
第三部分(第18-19篇),将项目打成 War 包并部署到 Linux 系统进行发布。最后对整个开发过程做一个总结。包括知识点的总结以及在开发工程中可能遇到的一些问题等。
王林永,现就职于某网络公司担任 Java 高级工程师,CSDN 博客作者,拥有自己的 Hexo 博客网页,在 Github 上有托管开源项目,擅长 Java 后台开发、Python 开发、C# 开发。
SSM 框架由 SpringMVC、Spring 和 Mybatis 三大开源框架整合而成,所以了解该框架需先从这三个框架着手。
Spring 是整个框架的核心,所以我们先从它开始讲起。
Spring 是 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 创建。它解决了业务逻辑层和其他各层的松耦合问题,并将面向接口的编程思想贯穿整个系统应用。简单来说,Spring 是一个分层的 JavaSE/EE Full-Stack(一站式) 轻量级开源框架。为什么说 spring 是分层、一站式、轻量级的框架呢?
首先看分层。JavaEE 经典的 MVC 三层结构为表现层、业务层、持久层,Web表现层负责页面数据显示、页面跳转调度,例如 JSP/Servlet、SpringMVC;Service业务层负责业务处理、功能逻辑和事务控制,例如 Service、JavaBean、EJB;而持久层Dao则负责数据存取和封装,及与数据库打交道,例如 JDBC、Hibernate、Mybatis。
而一站式,则指 Spring 为 JavaEE 的每一层都提供了解决方案,比如:
至于轻量,则是指从大小与开销两方面而言,Spring都是轻量的。完整的 Spring 框架可以在一个大小只有 1MB 多的 Jar 文件里发布。并且 Spring 所需的处理开销也是微不足道的。Spring 的出现解决了 EJB 臃肿、低效、繁琐复杂、脱离现实的情况。而且使用 Spring 编程是非侵入式的。Spring 应用中的对象不依赖于 Spring 的特定类。
Spring 框架是一个分层架构,它包含一系列的功能要素,被分为大约20个模块。这些模块分为 Core Container、Data Access/Integration、Web、AOP、Aspects、Instrumentation 和 Test,如下图所示:
核心容器(Core Container)包括 Core、Beans、Context、EL 模块。
Core 和 Beans 模块提供了 Spring 最基础的功能,Core 模块是核心,为其他模块提供支持,包括 Spring 的核心工具类。Beans 是 Spring 管理实体类 Bean 的主要模块,提供 IoC 控制反转和依赖注入 DI。控制反转即将控制权由原来的程序员自己管理交给 Spring 来管理,依赖注入就是注入对象实例,有四种方式,即接口注入、setter 方法注入、构造器注入和注解注入。
Context 上下文模块,主要基于 Core 和 Beans 模块,Context 模块的 Context 包继承了 Beans 包的功能,还增加了国际化(I18N)、事件传播等,Context 上下文模块,还包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
Expression Language,表达式语言模块,又称 SpEL,提供了在运行期间查询和操作对象图的强大能力。包含五个主要特性:(1)使用 Bean 的 ID 引用 Bean;(2)调用方法和访问对象的属性;(3)对值进行算术,关系和逻辑运算;(4)正则表达式匹配;(5)集合操作。
这三大核心分别为 IOC(Inverse of Control 控制反转)、DI(Dependency Injection,依赖注入)和AOP(Aspect Oriented Programming 面向切面编程)。
1.IOC(Inverse of Control 控制反转)
IOC,即将对象创建权利交给Spring工厂进行管理。比如说
Content content = new Content();
现在,可以这样写:
Content content = ContentFactory.getContent();
2.DI(Dependency Injection,依赖注入)
DI 是指在 Spring 框架创建 Bean 对象时,动态地将依赖对象注入到 Bean 组件。简单的说,就是将另外一个 Bean 对象动态地注入到另一个 Bean 中。
DI 的做法是:由 Spring 容器创建 Service、Dao 对象,并且通过注解或配置将 Dao 传入 Servcie,那么 Service 对象就包含了 Dao 对象的引用。比如:
@Service public class UserServiceImpl implements UserService { @Autowired //通过注解注入UserMapper对象 private UserMapper userMapper; }
3.AOP(Aspect Oriented Programming 面向切面编程)
AOP 采取横向抽取机制,取代了传统纵向继承体系重复性代码的编写方式(例如性能监视、事务管理、安全检查、缓存、日志记录等)。
AOP 基于代理思想,对原来目标对象,创建代理对象,在不修改原对象代码情况下,通过代理对象,调用增强功能的代码,从而对原有业务方法进行增强。例如可以在插入 User 对象之前进行打印日志,请看下面的代码示例。
UserService.java:
public interface UserService { void add(User user); }
前置增强类 PrintLogBefore.java:
//前置增强代码 public class PrintLogBefore implements MethodBeforeAdvice { private static final Logger log = Logger.getLogger(PrintLogBefore.class); @Override public void before(Method method, Object[] arguments, Object target) throws Throwable { log.info("在插入User之前执行的方法"); } }
最后配置切入点:
这样在调用 add(User user) 方法之前就会打印如下内容:
"在插入User之前执行的方法"
Spring 为 Web 表现层提供了一个优秀的框架 SpringMVC。和其他 Web 框架一样,也是基于 MVC 的设计理念,此外,它采用了松耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性。
SpringMVC 通过一套 MVC 注解,让 POJO 成为处理请求的控制器,无需任何接口,同时,SpringMVC 还支持 REST 风格的 URL 请求。此外,SpringMVC 在数据绑定、视图解析、本地化处理及静态资源处理上都有许多不俗的表现。它在框架设计、扩展性、灵活性等方面全面超越了 Struts、WebWork 等 MVC 框架,从原来的追赶者一跃成为 MVC 的领跑者。
SpringMVC 框架围绕 DispatcherServlet 这个核心展开,DispatcherServlet 是前端控制器设计模式的实现,提供 Spring Web MVC 的集中访问点,负责职责的分派,而且与 Spring IoC 容器无缝集成,从而可以获得 Spring 的所有好处。
其框架流程,如下图所示:
接下来,我们对每一个子流程做下说明。
Mybatis 的前身是 iBatis,Apache 的一个开源项目,在2010年这个项目从 Apache 迁移到 Google Code 改名为 Mybatis。Mybatis 是一个类似于 Hibernate 的 ORM 持久化框架,支持普通 SQL 查询、存储过程以及高级映射。Mybatis 通过使用简单的 XML 或注解用于配置和原始映射,将接口和 POJO 对象映射成数据库中的记录。由于 Mybatis 是直接基于 JDBC 做了简单的映射包装,所以从性能角度来看
JDBC > Mybatis > Hibernate
主要有以下5大特点:
整体架构如下图所示:
接下来,对架构的主要部分做下说明:
上面我们对 SSM 的各个组成部分做了详细介绍,接下来,我们将通过 SSM 与 SSH 的对比,带大家进一步深入了解 SSM。
其实,SSM 框架与 SSH 框架比较,主要还是 SpringMVC 和 Struts2,Mybatis 和 Hibernate 的对比。
我们从机制、性能、参数传递、设计思想四个方面来看看两者的差异:
我们从难易程度、对象管理、优势对比三个方面来看看两者的差异:
综上所述,在性能方面 SSM 框架要优于 SSH 框架,这也是越来越多互联网企业选择 SSM 框架的主要原因。而对于业务逻辑复杂,不太在乎执行效率的传统行业,一般会选择使用 SSH 框架。所以本达人课会选择 SSM 框架来开发,其中应用到的技术将适用于大部分的互联网企业。
在官网上,根据自己的系统配置(32/64位)选择相应的版本进行下载(附:下载地址)。下载完成后安装到自己喜欢的目录下。
安装完成后,我们进行环境变量配置。按该步骤进行操作:电脑 -> 属性 -> 高级系统设置 -> 环境变量 -> 系统变量 ->新建。在对应输入框内填入以下内容:
变量名:
JAVA_HOME
,变量值:D:\softs\java\jdk1.8.0_111
变量名:CLASSPATH,变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
点击已有的 path 变量打开,Win10 系统直接新建,输入:
%JAVA_HOME%\bin
再新建,输入:
%JAVA_HOME%\jre\bin
其他系统直接在 path 变量值的最后添加以下内容,注意与前面的配置要用“;”隔开:
%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
最后通过 cmd 打开命令提示符,键入:
java -version
查看版本号,若出现 Java 版本信息,说明安装并配置成功!
这里给出它的下载地址,请访问这里。下载完成后解压到自己喜欢的目录下
接下来进行环境变量配置。
配置步骤同上,这次在“新建系统变量”对话框中键入的内容请见下:
变量名:
MAVEN_HOME
,变量值:D:\softs\java\apache-maven-3.3.9
在 path 变量中加入 MAVEN_HOME:
%MAVEN_HOME%\bin
最后重新打开 cmd 命令提示符,键入:
mvn -version
查看 Maven版本,如出现 Maven 版本信息,说明配置成功!
如果 IDEA 已打开其他项目,可通过这一操作:File -> Close Project,关闭现有项目,然后通过:Create New Project -> Maven,创建父工程,直接点击 next,父工程就是空的工程,不需要勾选骨架。如下图所示。
填写好 GroupId、ArtifactId、Version 并选择好项目目录后点击 Finish,父工程就创建好了,我们命名为“dreamland”。
点击刚创建的父工程 dreamland,然后进行如下操作:File -> New -> Moudle -> Maven,见下图所示:
勾选 Web 骨架后点击 Next,填写好 ArtifactId 后点击 Next。
在这里要选择一个自己的 Maven 路径和仓库位置,还有要添加一个属性:
archetypeCatalog=internal
这个参数的意义是让该 Maven 项目的骨架不要到远程下载而是从本地获取,以提高加载速度。
创建好的整体目录结构如下:
可以看到我们的 dreamland-web 子工程没有 java、resources 和 test 目录,我们需要手动创建一下,操作过程如下:
main -> New -> Directory ==> 创建 java
main -> New -> Directory ==> 创建 resources
src -> New -> Directory ==> 创建 test
test -> New -> Directory ==> 创建 java
test -> New -> Directory ==> 创建 resources
然后对创建好的 java、resources 和 test/java、test/resourcs 目录均右键选择 Mark Diretory as,然后分别进行如下操作:
java -> Sources Root //java源码根目录
resources -> Resources Root//java 配置文件目录
test/java -> Test Sources Root//java 测试源码目录
test/java -> Test Sources Root//java 测试配置文件目录
如下图所示:
最后整体的目录结构如下:
这样 Maven 父子工程就创建好了!
上一篇通过 Maven 已将项目骨架搭好,本文主要向骨架中添充内容,也就是完成配置文件的配置。
我们首先看下 SSM 框架搭建核心步骤:
在配置之前,我们需先了解下 Maven 仓库。
Maven 仓库是 Maven 管理 jar 包的地方,有本地仓库,远程仓库和中央仓库之分。本地仓库即存在于本机。远程仓库,可通过配置 settings.xml 获取,比如阿里云的远程仓库。中央仓库为 Maven 的仓库,不配置远程仓库,默认从中央仓库下载 jar 依赖,然而中央仓库在国外,下载起来速度会很慢,所以我们多会选择配置阿里云远程仓库。
如何查看 Maven 本地仓库的位置,具体步骤如下。
首先,打开 CMD 命令窗口,输入如下 Maven 命令,即可查看 Maven 本地仓库的位置。
mvn help:effective-settings
如果没有配置 Maven 本地仓库的位置,默认位置在 C:\Users\你的主机名\.m2\repository
下,如图:
如果你有自己的 Maven 仓库,可在 Maven 的解压目录 apache-maven-3.3.9\conf
下的 settings.xml 中配置。
你的仓库路径
我的 Maven 仓库路径为 D:/repository
,配置如下图所示:
上面提到,我们多会使用阿里云远程仓库,接下来我们看看它的配置过程。
首先,配置阿里云镜像。这时我们可在 settings.xml 中找到 mirrors 标签,在 mirrors 标签内配置如下内容:
alimaven aliyun maven http://maven.aliyun.com/nexus/content/groups/public/ central
如下图所示:
配置阿里云镜像的目的是使用阿里云的远程仓库,如果不配置,则默认使用中央仓库,而中央仓库在国外,下载依赖时会很慢。
然后在 file -> settings 中找到 Maven,在下图所示的位置添加 Maven 的路径以及 Maven 配置文件 settings.xml 的路径,仓库的位置(即在 settings.xml 中配置的仓库)将自动显示出来。
MySQL 是一种开放源代码的关系型数据库管理系统(RDBMS),使用最常用的数据库管理语言——结构化查询语言(SQL)进行数据库管理。
因为 MySQL 相比 Oracle 开源、免费,很多企业也在用,所以本课程我们选用 MySQL 数据库作为存储数据库。
如果还没有安装 MySQL 数据的同学请参考这篇博文:《MySQL 安装》。
完成了以上的准备工作,接下来,我们就可以正式开始 SSM 的搭建了。首先是添加 Maven 依赖。
Maven 依赖有很多,这里只给出部分依赖,用来正常启动项目。每个依赖都在代码中添加了注释,这里就不赘述了。如果遇到报错,通过 Alt+Enter 组合键进行下载即可。
在 dreamland-web 子工程的 pom.xml 中添加以下代码:
UTF-8 1.7 1.7 4.2.5.RELEASE 3.2.8 5.1.29 1.7.18 1.2.17 4.1.3.RELEASE 1.7.1.RELEASE jstl jstl 1.2 javax javaee-api 7.0 org.springframework spring-core ${spring.version} org.springframework spring-web ${spring.version} org.springframework spring-oxm ${spring.version} org.springframework spring-tx ${spring.version} org.springframework spring-jdbc ${spring.version} org.springframework spring-webmvc ${spring.version} org.springframework spring-context ${spring.version} org.springframework spring-context-support ${spring.version} org.springframework spring-aop ${spring.version} org.springframework spring-test ${spring.version} org.mybatis mybatis ${mybatis.version} org.mybatis mybatis-spring 1.2.2 mysql mysql-connector-java ${mysql-driver.version} commons-dbcp commons-dbcp 1.2.2 log4j log4j ${log4j.version} org.slf4j slf4j-api ${slf4j.version} org.slf4j slf4j-log4j12 ${slf4j.version} org.springframework spring-jms ${spring.version} org.apache.xbean xbean-spring 4.0 commons-beanutils commons-beanutils 1.9.3 tk.mybatis mapper 3.1.2
pom.xml 的位置如下图所示:
这一小节,我们将完成配置文件的配置。配置文件的加载顺序以及各配置文件有什么作用,我会在最后进行介绍。
各配置文件位置如下图:
这个配置文件主要是 spring-mybatis.xml 引用的主要参数,jdbc.properties 包括 JDBC 加载类、URL、用户名和密码.
jdbcUrl=jdbc:mysql://localhost:3306/dream_db?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
上面代码表示使用的是 MySQL 数据库,关于 MySQL 数据库的下载安装,这里不做介绍了,MySQL 数据库的默认端口是3306,端口号后的 dream_db
是你的数据库名称,后面的 useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
是指定字符的编码和解码格式。
配置代码如下:
driverClasss=com.mysql.jdbc.Driver jdbcUrl=jdbc:mysql://localhost:3306/dream_db?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull username=root password=root #定义初始连接数 initialSize=0 #定义最大连接数 maxActive=20 #定义最大空闲 maxIdle=20 #定义最小空闲 minIdle=1 #定义最长等待时间 maxWait=60000
注意 dream_db 是数据库名称,username 和 password 分别是数据库用户名和密码。
log4j.properties 为 log4j 日志配置文件,主要将程序中打印的日志信息输出到控制台、保存到目录文件,可以通过配置设置日志文件的输出级别、格式、输出路径等。
配置代码如下:
log4j.rootLogger=DEBUG,Console,File #日志输出到控制台 og4j.appender.Console=org.apache.log4j.ConsoleAppender #指定输出到控制台 log4j.appender.Console.Target=System.out #灵活地指定布局模式 log4j.appender.Console.layout=org.apache.log4j.PatternLayout #日志输出格式设置 log4j.appender.Console.layout.ConversionPattern=[%p][%t][%d{yyyy-MM-dd HH\:mm\:ss}][%C] - %m%n #日志输出到文件 log4j.appender.File=org.apache.log4j.RollingFileAppender #日志存放位置 log4j.appender.File.File=D/wly/git/dreamland/logs/run.log #单个日志文件大小设置 log4j.appender.File.MaxFileSize=10MB #输出日志,如果换成DEBUG表示输出DEBUG以上级别日志 log4j.appender.File.Threshold=ALL log4j.appender.File.layout=org.apache.log4j.PatternLayout log4j.appender.File.layout.ConversionPattern=[%p][%t][%d{yyyy-MM-dd HH\:mm\:ss}][%C] - %m%n
下面我们解释下以上代码中需要注意的地方。
(1)日志输出级别分为以下四种,优先级别为:
ERROR > WARN > INFO > DEBUG
输出原则为:程序会打印出高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少,即:
设置级别为 ERROR 只会打印出 ERROR 日志;
设置级别为 WARN 会打印出 ERROR 和 WRAN 日志;
设置级别为 INFO 会打印出 ERROR、WARN 和 INFO 日志;
设置为 DEBUG 会打印出所有日志。
本案例中 log4j.rootLogger=DEBUG,Console,File
表示输出 DEBUG 以上级别日志。
(2)上面代码中出现的 %m
、%p
、%d
、%c
、%n
……分别代表的含义如下所示:
%m 输出代码中指定的消息 %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL %r 输出自应用启动到输出该log信息耗费的毫秒数 %c 输出所属的类目,通常就是所在类的全名 %t 输出产生该日志事件的线程名 %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n” %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 :10:28,921 %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。 %x Used to output the NDC (nested diagnostic context) associated with the thread that generated the logging event %X Used to output the MDC (mapped diagnostic context) associated with the thread that generated the logging event for specified key
(3)如下代码用来设定当文件到达设定大小时产生一个新的文件。
log4j.appender.File=org.apache.log4j.RollingFileAppender
将 RollingFileAppender 换成 DailyRollingFileAppender,则表示每天产生一个日志文件。
(4)可以在下面的代码中设置你的日志文件的存放位置。
log4j.appender.File.File=D/wly/git/dreamland/logs/run.log
srping-mvc.xml 为 SpringMVC 核心配置文件,主要包括 Controller 层的包扫描、视图模式配置(跳转路径的前后缀)、文件上传配置、静态资源处理等。
配置代码如下,关键地方均有注释说明:
text/html;charset=UTF-8
配置后会看到有报红,我们创建相对应的包路径和文件夹,注意 css、js、images 在 webapp 路径下。
在 java 目录右键 new -> Package -> wang.dreamland.www.controller。
然后在 webapp 下右键 new -> Directory 分别创建 css、js 和 images 文件夹,如下图:
spring-mybatis.xml 为 Spring 和 Mybatis 整合配置文件,主要进行扫描包的配置、数据源的配置、映射文件的配置、事务管理配置等,配置文件中都有注释,这里不再赘述。
配置代码如下:
classpath:jdbc.properties
注意 dao 接口扫描包路径是 wang.dreamland.www.dao,之后配置 dao 时记得别配错路径了,否则会报错。
mybatis-config.xml 是 MyBatis 的核心配置文件,包括驼峰命名、别名、通用 mapper、分页插件配置等。
配置代码如下,关键地方均有注释说明:
上面代码中,wang.dreamland.www.entity 对应的是实体类包路径,之后新建实体时就放在该路径下:
web.xml 为 Web 容器的配置文件,用来初始化配置信息,主要定义了:
配置代码如下所示:
dreamland-web contextConfigLocation classpath*:spring-mybatis.xml log4jConfigLocation classpath:log4j.properties encodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 encodingFilter /* org.springframework.web.context.ContextLoaderListener org.springframework.web.util.IntrospectorCleanupListener SpringMVC org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:spring-mvc.xml 1 true SpringMVC / default *.xml default *.css index.jsp 15
配置完成后的整体目录结构如下:
点击右上角的倒三角 -> Edit Configurations,如下图所示:
接下来的设置请参考下面图示说明:
启动项目后,访问 127.0.0.1:8080 或者 localhost:8080,可以看到页面上出现了熟悉的 “Hello World!”,表示 SSM 框架搭建完成!
上面,我们把配置文件配置好了,那怎样才能起作用呢?这就需要 Web 容器来加载了。Web 容器加载配置文件的过程如下。
启动 Tomcat 后,Web 容器首先加载 web.xml 文件。
web.xml 文件是创建 Web 项目所需要的配置文件,用来初始化配置信息,主要包含拦截器、过滤器、servlet 等的配置,它的位置在项目 WEB-INF 目录下。
在 web.xml 的
中加载其他 XML 和 log4j.properties 文件,代码如下:
contextConfigLocation classpath*:spring-mybatis.xml, classpath*:applicationContext-redis.xml, classpath*:applicationContext-activemq.xml, log4jConfigLocation classpath:log4j.properties
其中 param-name 的名称是固定格式,param-value 是要加载的配置文件名,多个用逗号隔开,通过 Ctrl+鼠标左键可定位到相应配置文件。
接着,根据 spring-mybatis.xml 中的 PropertiesFactoryBean 加载多个 properties 文件,代码如下:
classpath:jdbc.properties classpath:redis.properties
通过 property 标签内的 list 标签可以加载多个 properties 文件,value 标签内就是具体的 properties 文件的路径,通过 Ctrl+鼠标左键可以定位到相应的文件。
根据 spring-mybatis.xml 的 SqlSessionFactoryBean 加载 mybatis 核心配置文件 mybatis-config.xml 以及其他映射文件
其中 property 标签的 name 值是固定的,通过该属性加载对应的 value 中的值,value 的值是配置文件的路径,通过 Ctrl+鼠标左键可访问该文件。
然后,加载前端控制器 DispatcherServlet 的配置文件 srping-mvc.xml。
SpringMVC org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:spring-mvc.xml 1 true SpringMVC /
其中 init-param 标签是前端控制器的初始化参数配置,param-name 参数名为固定值,param-value 参数值为具体的配置文件路径,以此来加载对应的配置文件。
的正数值越小,启动该 Servlet 的优先级越高。
这样所有的配置文件就加载完毕了!
阅读全文: http://gitbook.cn/gitchat/column/5afa86a515da5a21f341cd7f