SSM 博客系统开发实战

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/valada/article/details/80892576

课程简介

SSM 框架即 SpringMVC+Spring+Mybatis,相比 SSH(Struts2+Spring+Hibernate)来说较新,SpringMVC 可与 Spring 更好的整合,Mybatis 相比 Hibernate 使用更简单、轻便,大部分公司都在使用 SSM 这套框架,主要是轻量级、易使用,故本达人课特选择 SSM 框架作为课程主题,希望通过实战项目让大家对 SSM 框架及其他相关技术有一个清楚的认识,并能够正确的运用到项目中去。

通过本课程,您将学习到以下内容:

  1. SSM 框架的搭建及使用;
  2. MySQL 数据库的基本使用方法;
  3. Redis 缓存数据库的配置及使用方法;
  4. ActiveMQ 消息中间件的配置及使用;
  5. Spring Security 安全框架的整合及使用;
  6. Ajax 异步更新技术;
  7. Solr 搜索引擎技术;
  8. Bootstrap、ZUI 等前端框架的组件及控件的使用;
  9. Linux 系统部署及发布项目。

本课程共包含三大部分:

第一部分(第1-4篇),基础环境搭建,包括 SSM 框架的整合,MySQL 表结构设计、实体类的生成、接口的设计等。

第二部分(第5-17篇),项目主要功能的实现,包括登录、注册、激活、首页展示及分页、评论回复点赞模块、个人主页、资料修改等功能的实现。通过实战直观、深入的了解 SSM 框架开发的特点及对各个技术点的掌握。

第三部分(第18-19篇),将项目打成 War 包并部署到 Linux 系统进行发布。最后对整个开发过程做一个总结。包括知识点的总结以及在开发工程中可能遇到的一些问题等。

作者介绍

王林永,现就职于某网络公司担任 Java 高级工程师,CSDN 博客作者,拥有自己的 Hexo 博客网页,在 Github 上有托管开源项目,擅长 Java 后台开发、Python 开发、C# 开发。

课程内容

导读:为什么选择 SSM 框架开发项目

SSM 框架由 SpringMVC、Spring 和 Mybatis 三大开源框架整合而成,所以了解该框架需先从这三个框架着手。

Spring

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 的每一层都提供了解决方案,比如:

  • 表现层:Struts1、Struts2、Spring MVC;
  • 业务层:IoC 控制反转、AOP 面向切面编程、事务控制;
  • 持久层:JdbcTemplate、HibernateTemplate、ORM 框架(对象关系映射)的整合。

至于轻量,则是指从大小与开销两方面而言,Spring都是轻量的。完整的 Spring 框架可以在一个大小只有 1MB 多的 Jar 文件里发布。并且 Spring 所需的处理开销也是微不足道的。Spring 的出现解决了 EJB 臃肿、低效、繁琐复杂、脱离现实的情况。而且使用 Spring 编程是非侵入式的。Spring 应用中的对象不依赖于 Spring 的特定类。

Spring 的体系结构

Spring 框架是一个分层架构,它包含一系列的功能要素,被分为大约20个模块。这些模块分为 Core Container、Data Access/Integration、Web、AOP、Aspects、Instrumentation 和 Test,如下图所示:

核心容器(Core Container)包括 Core、Beans、Context、EL 模块。

  1. Core 和 Beans 模块提供了 Spring 最基础的功能,Core 模块是核心,为其他模块提供支持,包括 Spring 的核心工具类。Beans 是 Spring 管理实体类 Bean 的主要模块,提供 IoC 控制反转和依赖注入 DI。控制反转即将控制权由原来的程序员自己管理交给 Spring 来管理,依赖注入就是注入对象实例,有四种方式,即接口注入、setter 方法注入、构造器注入和注解注入。

  2. Context 上下文模块,主要基于 Core 和 Beans 模块,Context 模块的 Context 包继承了 Beans 包的功能,还增加了国际化(I18N)、事件传播等,Context 上下文模块,还包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。

  3. Expression Language,表达式语言模块,又称 SpEL,提供了在运行期间查询和操作对象图的强大能力。包含五个主要特性:(1)使用 Bean 的 ID 引用 Bean;(2)调用方法和访问对象的属性;(3)对值进行算术,关系和逻辑运算;(4)正则表达式匹配;(5)集合操作。

Spring 的三大核心

这三大核心分别为 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之前执行的方法");      }    }

最后配置切入点:

    <bean id="printBefore" class="dreamland.aop.test.PrintLogBefore"></bean>    <aop:config>        <aop:pointcut expression="execution(public void save(dreamland.aop.entity.User))" id="pointcut"/>                 <aop:advisor advice-ref="printBefore" pointcut-ref="pointcut"/>    </aop:config>

这样在调用 add(User user) 方法之前就会打印如下内容:

"在插入User之前执行的方法"

SpringMVC

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 的所有好处。

SpringMVC 框架流程

其框架流程,如下图所示:

接下来,我们对每一个子流程做下说明。

  1. 用户发送请求,被 SpringMVC 的前端控制器 DispatcherServlet 拦截。
  2. DispatcherServlet 收到请求后调用 HandlerMapping 处理器映射器。
  3. 处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet。
  4. DispatcherServlet 调用 HandlerAdapter 处理器适配器。
  5. HandlerAdapter 经过适配器调用具体的处理器(Controller,也叫后端控制器)。
  6. Controller 将结果封装到 ModelAndView 返回给 HandlerAdapter。
  7. HandlerAdapter 将 Controller 执行结果 ModelAndView 返回给 DispatcherServlet。
  8. DispatcherServlet 将 ModelAndView 传给 ViewReslover 视图解析器。
  9. ViewReslover 解析后返回具体的 View。
  10. DispatcherServlet 根据 View 进行渲染视图(即将模型数据填充至视图中)。
  11. DispatcherServlet 响应用户。

Mybatis 介绍

Mybatis 的前身是 iBatis,Apache 的一个开源项目,在2010年这个项目从 Apache 迁移到 Google Code 改名为 Mybatis。Mybatis 是一个类似于 Hibernate 的 ORM 持久化框架,支持普通 SQL 查询、存储过程以及高级映射。Mybatis 通过使用简单的 XML 或注解用于配置和原始映射,将接口和 POJO 对象映射成数据库中的记录。由于 Mybatis 是直接基于 JDBC 做了简单的映射包装,所以从性能角度来看

JDBC > Mybatis > Hibernate

Mybatis 特点

主要有以下5大特点:

  1. 支持自定义 SQL、存储过程、高级映射;
  2. 实现自动对 SQL 的参数设置;
  3. 实现自动对结果集进行解析和封装;
  4. 通过 XML 或者注解进行配置和映射,大大减少代码量;
  5. 数据源的连接信息通过配置文件进行配置。

Mybatis 整体架构

整体架构如下图所示:

接下来,对架构的主要部分做下说明:

  1. 配置文件:全局配置文件 mybatis-config.xml,其作用为配置数据源,引入映射文件 Mapper.xml,映射文章的作用是配置 SQL 语句、参数、结果集封装类型等。
  2. SqlSessionFactory:相当于 Hibernate 的 SessionFactory,作用为获取 SqlSession,通过 newSqlSessionFactoryBuilder().build(inputStream) 来构建,inputStream用来读取配置文件的 IO 流。
  3. SqlSession:相当于 Hibernate 的 Session,作用为执行 CRUD 操作。
  4. Executor:执行器,SqlSession 通过调用它来完成具体的 CRUD,它是一个接口,提供了两种实现,即缓存的实现、数据库的实现。
  5. Mapped Statement:在映射文件里面配置,包含3部分内容:具体的 SQL,SQL执行所需的参数类型,SQL 执行结果的封装类型,参数类型和结果集封装类型包括3种,即 HashMap,基本数据类型,POJO。

SSM 框架与 SSH 框架对比

上面我们对 SSM 的各个组成部分做了详细介绍,接下来,我们将通过 SSM 与 SSH 的对比,带大家进一步深入了解 SSM。

其实,SSM 框架与 SSH 框架比较,主要还是 SpringMVC 和 Struts2,Mybatis 和 Hibernate 的对比。

SpringMVC 和 Struts2 比较

我们从机制、性能、参数传递、设计思想四个方面来看看两者的差异:

  1. 机制:SpringMVC 的入口是 Servlet,Struts2 的入口是 Filter, 两者的实现机制不同;
  2. 性能:SpringMVC 稍微比 Struts 快些。SpringMVC 是基于方法的设计,而 Struts2 是基于类,每发一次请求都会实例化一个 action,每个 action 都会被注入属性,而 SpringMVC 基于方法,粒度更细。
  3. 参数传递:Struts2 在接受参数时,可以用属性来接受参数,这就说明参数可被多个方法共享。SpringMVC 是基于方法的设计,传递参数是通过方法形参。多个方法间不能共享。
  4. 设计思想上:Struts2 更加符合 OOP 的编程思想,SpringMVC 就比较谨慎,在 Servlet 上扩展。

Mybatis 和 Hibernate 比较

我们从难易程度、对象管理、优势对比三个方面来看看两者的差异:

  1. 难易程度:Hibernate 的真正掌握要比 Mybatis 难些。Mybatis 框架相对简单容易上手。
  2. 对象管理:Hibernate 是完整的对象/关系映射解决方案,它提供了对象状态管理的功能,使开发者不需要关心底层数据库系统的细节。而 Mybatis 在这一块没有文档说明,用户需要自己对对象进行详细的管理。
  3. 优势对比:Mybatis 可以进行更为细致的 SQL 优化,可以减少查询字段。Hibernate 数据库移植性很好,Mybatis 的数据库移植性不好,不同的数据库需要些不同的 SQL。

综上所述,在性能方面 SSM 框架要优于 SSH 框架,这也是越来越多互联网企业选择 SSM 框架的主要原因。而对于业务逻辑复杂,不太在乎执行效率的传统行业,一般会选择使用 SSH 框架。所以本达人课会选择 SSM 框架来开发,其中应用到的技术将适用于大部分的互联网企业。

第01课:基础环境安装及 Maven 创建父子工程

基础环境安装及配置

JDK 下载及环境变量配置

在官网上,根据自己的系统配置(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下载并配置环境变量

这里给出它的下载地址,请访问这里。下载完成后解压到自己喜欢的目录下

接下来进行环境变量配置。

配置步骤同上,这次在“新建系统变量”对话框中键入的内容请见下:

变量名:MAVEN_HOME,变量值:D:\softs\java\apache-maven-3.3.9

在 path 变量中加入 MAVEN_HOME:

%MAVEN_HOME%\bin

最后重新打开 cmd 命令提示符,键入:

mvn -version

查看 Maven版本,如出现 Maven 版本信息,说明配置成功!

Maven 创建父子工程

创建 Maven 父工程

如果 IDEA 已打开其他项目,可通过这一操作:File -> Close Project,关闭现有项目,然后通过:Create New Project -> Maven,创建父工程,直接点击 next,父工程就是空的工程,不需要勾选骨架。如下图所示。

填写好 GroupId、ArtifactId、Version 并选择好项目目录后点击 Finish,父工程就创建好了,我们命名为“dreamland”。

创建 Maven 子工程

点击刚创建的父工程 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 父子工程就创建好了!

第02课:SSM 框架的搭建

上一篇通过 Maven 已将项目骨架搭好,本文主要向骨架中添充内容,也就是完成配置文件的配置。

我们首先看下 SSM 框架搭建核心步骤:

  1. 在 pom.xml 中添加 Maven 依赖,主要目的是将项目中所需要用到的 jar 包引入到项目,通过 Maven 进行管理。
  2. 配置文件的配置,主要是 web.xml 的配置,数据库连接池的配置,日志文件的配置,SpringMVC 的配置,MyBatis 的配置等,具体配置内容下面会做详细说明。
  3. 添加 Web 服务器 Tomcat,因为项目启动需要载体。
  4. 启动 Tomcat 服务,访问 127.0.0.1:8080 或者 localhost:8080,页面成功访问,即表示 SSM 框架搭建完成。

查看 Maven 的本地仓库

在配置之前,我们需先了解下 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 中配置。

<localRepository>你的仓库路径</localRepository>    

我的 Maven 仓库路径为 D:/repository,配置如下图所示:

上面提到,我们多会使用阿里云远程仓库,接下来我们看看它的配置过程。

首先,配置阿里云镜像。这时我们可在 settings.xml 中找到 mirrors 标签,在 mirrors 标签内配置如下内容:

     <mirror>      <id>alimaven</id>      <name>aliyun maven</name>      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>      <mirrorOf>central</mirrorOf>            </mirror>

如下图所示:

配置阿里云镜像的目的是使用阿里云的远程仓库,如果不配置,则默认使用中央仓库,而中央仓库在国外,下载依赖时会很慢。

然后在 file -> settings 中找到 Maven,在下图所示的位置添加 Maven 的路径以及 Maven 配置文件 settings.xml 的路径,仓库的位置(即在 settings.xml 中配置的仓库)将自动显示出来。

选用 MySQL 数据库

MySQL 是一种开放源代码的关系型数据库管理系统(RDBMS),使用最常用的数据库管理语言——结构化查询语言(SQL)进行数据库管理。

因为 MySQL 相比 Oracle 开源、免费,很多企业也在用,所以本课程我们选用 MySQL 数据库作为存储数据库。

如果还没有安装 MySQL 数据的同学请参考这篇博文:《MySQL 安装》

添加 Maven 依赖

完成了以上的准备工作,接下来,我们就可以正式开始 SSM 的搭建了。首先是添加 Maven 依赖。

Maven 依赖有很多,这里只给出部分依赖,用来正常启动项目。每个依赖都在代码中添加了注释,这里就不赘述了。如果遇到报错,通过 Alt+Enter 组合键进行下载即可。

在 dreamland-web 子工程的 pom.xml 中添加以下代码:

        <properties>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>        <maven.compiler.source>1.7</maven.compiler.source>        <maven.compiler.target>1.7</maven.compiler.target>        <!-- spring版本号 -->        <spring.version>4.2.5.RELEASE</spring.version>        <!-- mybatis版本号 -->        <mybatis.version>3.2.8</mybatis.version>        <!-- mysql驱动版本号 -->        <mysql-driver.version>5.1.29</mysql-driver.version>        <!-- log4j日志包版本号 -->        <slf4j.version>1.7.18</slf4j.version>        <log4j.version>1.2.17</log4j.version>        <!--spring-security版本号-->        <spring-security.version>4.1.3.RELEASE</spring-security.version>        <!--spring-data-redis版本号-->        <spring.data.redis.version>1.7.1.RELEASE</spring.data.redis.version>    </properties>    <dependencies>        <!-- 添加jstl依赖 -->        <dependency>            <groupId>jstl</groupId>            <artifactId>jstl</artifactId>            <version>1.2</version>        </dependency>        <dependency>            <groupId>javax</groupId>            <artifactId>javaee-api</artifactId>            <version>7.0</version>        </dependency>        <!-- 添加spring核心依赖 -->        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-core</artifactId>            <version>${spring.version}</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-web</artifactId>            <version>${spring.version}</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-oxm</artifactId>            <version>${spring.version}</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-tx</artifactId>            <version>${spring.version}</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-jdbc</artifactId>            <version>${spring.version}</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-webmvc</artifactId>            <version>${spring.version}</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-context</artifactId>            <version>${spring.version}</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-context-support</artifactId>            <version>${spring.version}</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-aop</artifactId>            <version>${spring.version}</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-test</artifactId>            <version>${spring.version}</version>        </dependency>        <!-- 添加mybatis依赖 -->        <dependency>            <groupId>org.mybatis</groupId>            <artifactId>mybatis</artifactId>            <version>${mybatis.version}</version>        </dependency>        <!-- 添加mybatis/spring整合包依赖 -->        <dependency>            <groupId>org.mybatis</groupId>            <artifactId>mybatis-spring</artifactId>            <version>1.2.2</version>        </dependency>        <!-- 添加mysql驱动依赖 -->        <dependency>            <groupId>mysql</groupId>            <artifactId>mysql-connector-java</artifactId>            <version>${mysql-driver.version}</version>        </dependency>        <!-- 添加数据库连接池依赖 -->        <dependency>            <groupId>commons-dbcp</groupId>            <artifactId>commons-dbcp</artifactId>            <version>1.2.2</version>        </dependency>        <!-- 添加日志相关jar包 -->        <dependency>            <groupId>log4j</groupId>            <artifactId>log4j</artifactId>            <version>${log4j.version}</version>        </dependency>        <dependency>            <groupId>org.slf4j</groupId>            <artifactId>slf4j-api</artifactId>            <version>${slf4j.version}</version>        </dependency>        <dependency>            <groupId>org.slf4j</groupId>            <artifactId>slf4j-log4j12</artifactId>            <version>${slf4j.version}</version>        </dependency>        <!-- log end -->        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-jms</artifactId>            <version>${spring.version}</version>        </dependency>        <!-- https://mvnrepository.com/artifact/org.apache.xbean/xbean-spring -->        <dependency>            <groupId>org.apache.xbean</groupId>            <artifactId>xbean-spring</artifactId>            <version>4.0</version>        </dependency>        <!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->        <dependency>            <groupId>commons-beanutils</groupId>            <artifactId>commons-beanutils</artifactId>            <version>1.9.3</version>        </dependency>        <!-- 通用mapper -->        <dependency>            <groupId>tk.mybatis</groupId>            <artifactId>mapper</artifactId>            <version>3.1.2</version>        </dependency>    </dependencies>

pom.xml 的位置如下图所示:

配置文件

这一小节,我们将完成配置文件的配置。配置文件的加载顺序以及各配置文件有什么作用,我会在最后进行介绍。

各配置文件位置如下图:

jdbc.properties文件配置——数据库连接的配置

这个配置文件主要是 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文件配置——log日志的配置

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

spring-mvc.xml 的配置

srping-mvc.xml 为 SpringMVC 核心配置文件,主要包括 Controller 层的包扫描、视图模式配置(跳转路径的前后缀)、文件上传配置、静态资源处理等。

配置代码如下,关键地方均有注释说明:

    <?xml version="1.0" encoding="UTF-8"?>    <beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"       xmlns:context="http://www.springframework.org/schema/context"       xmlns:mvc="http://www.springframework.org/schema/mvc"       xsi:schemaLocation="http://www.springframework.org/schema/beans                        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd                        http://www.springframework.org/schema/context                        http://www.springframework.org/schema/context/spring-context-4.0.xsd                        http://www.springframework.org/schema/mvc                        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">    <mvc:default-servlet-handler />    <!-- 自动扫描 -->    <context:component-scan base-package="wang.dreamland.www.controller"/>    <!--避免IE执行AJAX时,返回JSON出现下载文件 -->    <bean id="mappingJacksonHttpMessageConverter"          class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">        <property name="supportedMediaTypes">            <list>                <value>text/html;charset=UTF-8</value>            </list>        </property>    </bean>    <!-- 默认的注解映射的支持,自动注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->    <mvc:annotation-driven />    <!-- 定义跳转的文件的前后缀 ,视图模式配置 -->    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">        <property name="prefix" value="/WEB-INF/" />        <property name="suffix" value=".jsp"/>    </bean>    <!-- 文件上传配置 -->    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">        <!-- 默认编码 -->        <property name="defaultEncoding" value="UTF-8"/>        <!-- 上传文件大小限制为31M,31*1024*1024 -->        <property name="maxUploadSize" value="32505856"/>        <!-- 内存中的最大值 -->        <property name="maxInMemorySize" value="4096"/>    </bean>    <!-- 对静态资源文件的访问-->    <mvc:resources mapping="/images/**" location="/images/" cache-period="31556926"/>    <mvc:resources mapping="/js/**" location="/js/" cache-period="31556926"/>    <mvc:resources mapping="/css/**" location="/css/" cache-period="31556926"/>    </beans>

配置后会看到有报红,我们创建相对应的包路径和文件夹,注意 css、js、images 在 webapp 路径下。

在 java 目录右键 new -> Package -> wang.dreamland.www.controller。

然后在 webapp 下右键 new -> Directory 分别创建 css、js 和 images 文件夹,如下图:

spring-mybatis.xml 配置

spring-mybatis.xml 为 Spring 和 Mybatis 整合配置文件,主要进行扫描包的配置、数据源的配置、映射文件的配置、事务管理配置等,配置文件中都有注释,这里不再赘述。

配置代码如下:

    <?xml version="1.0" encoding="UTF-8"?>    <beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"       xsi:schemaLocation="http://www.springframework.org/schema/beans                        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd                        http://www.springframework.org/schema/context                        http://www.springframework.org/schema/context/spring-context-3.1.xsd                        http://www.springframework.org/schema/tx                        http://www.springframework.org/schema/tx/spring-tx.xsd">    <!-- 自动扫描 -->    <context:component-scan base-package="wang.dreamland.www"/>     <!--第二种方式:加载多个properties文件-->    <bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">        <property name="locations">            <list>                <value>classpath:jdbc.properties</value>            </list>        </property>        <property name="fileEncoding" value="UTF-8"/>    </bean>    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">        <property name="properties" ref="configProperties"/>    </bean>    <!-- 配置数据源 -->    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"          destroy-method="close">        <property name="driverClassName" value="${driverClasss}"/>        <property name="url" value="${jdbcUrl}"/>        <property name="username" value="${username}"/>        <property name="password" value="${password}"/>        <!-- 初始化连接大小 -->        <property name="initialSize" value="${initialSize}"></property>        <!-- 连接池最大数量 -->        <property name="maxActive" value="${maxActive}"></property>        <!-- 连接池最大空闲 -->        <property name="maxIdle" value="${maxIdle}"></property>        <!-- 连接池最小空闲 -->        <property name="minIdle" value="${minIdle}"></property>        <!-- 获取连接最大等待时间 -->        <property name="maxWait" value="${maxWait}"></property>    </bean>    <!-- mybatis和spring完美整合,不需要mybatis的配置映射文件 -->    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">        <property name="dataSource" ref="dataSource"/>        <!-- 配置Mybati的核心配置文件 -->        <property name="configLocation" value="classpath:mybatis-config.xml" />        <!-- 自动扫描mapping.xml文件 -->     <!--   <property name="mapperLocations" value="classpath:mapping/*.xml"></property>-->    </bean>    <!--  DAO接口所在包名,Spring会自动查找其下的类 -->    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">        <property name="basePackage" value="wang.dreamland.www.dao"/>        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>    </bean>    <!-- 事务管理-->    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">        <property name="dataSource" ref="dataSource"/>    </bean>    <tx:annotation-driven transaction-manager="transactionManager"/>    </beans>

注意 dao 接口扫描包路径是 wang.dreamland.www.dao,之后配置 dao 时记得别配错路径了,否则会报错。

     <property name="basePackage" value="wang.dreamland.www.dao"/>

mybatis-config.xml 配置

mybatis-config.xml 是 MyBatis 的核心配置文件,包括驼峰命名、别名、通用 mapper、分页插件配置等。

配置代码如下,关键地方均有注释说明:

    <?xml version="1.0" encoding="UTF-8" ?>    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-config.dtd">    <configuration>    <!-- 开启驼峰匹配 -->    <settings>        <setting name="mapUnderscoreToCamelCase" value="true"/>    </settings>    <!-- 别名 -->    <typeAliases>        <!--默认别名为:javabean 的首字母小写的非限定类名来作为它的别名-->        <package name="wang.dreamland.www.entity" />    </typeAliases>    <plugins>        <plugin interceptor="tk.mybatis.mapper.mapperhelper.MapperInterceptor">            <!--主键自增回写方法,默认值MYSQL,详细说明请看文档HSQLDB-->            <property name="IDENTITY" value="MYSQL"/>            <!--可选参数一共3个,对应0,1,2,分别为SequenceName,ColumnName,PropertyName-->            <property name="seqFormat" value="{0}.nextval"/>            <!--通用Mapper接口,多个通用接口用逗号隔开-->            <property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>        </plugin>            <!-- 自定义分页插件 -->         <!--   <plugin interceptor="wang.dreamland.www.common.PageHelper"></plugin>-->    </plugins>    </configuration>

上面代码中,wang.dreamland.www.entity 对应的是实体类包路径,之后新建实体时就放在该路径下:

     <package name="wang.dreamland.www.entity" />

web.xml 配置

web.xml 为 Web 容器的配置文件,用来初始化配置信息,主要定义了:

  1. Web 应用的名字、描述(display-name 和 description 标签);
  2. 应用范围的初始化参数(context-param 标签);
  3. 过滤器配置(filter 标签);
  4. 监听器配置(listener 标签);
  5. servlet 配置(servlet 标签,如前端控制器和验证码);
  6. 欢迎页面(welcome-file-list 标签,如 index.jsp 页面);
  7. session失效时间(session-config 标签);
  8. 错误页面配置(error-page 标签,如 404、500错误页面等)。

配置代码如下所示:

    <?xml version="1.0" encoding="UTF-8"?>    <web-app xmlns="http://java.sun.com/xml/ns/javaee"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee          http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"         version="3.0">    <display-name>dreamland-web</display-name>    <context-param>    <param-name>contextConfigLocation</param-name>    <param-value>      classpath*:spring-mybatis.xml    </param-value>    </context-param>      <context-param>    <param-name>log4jConfigLocation</param-name>    <param-value>classpath:log4j.properties</param-value>      </context-param>    <!-- 编码过滤器 解决POST乱码问题-->    <filter>    <filter-name>encodingFilter</filter-name>    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>    <init-param>      <param-name>encoding</param-name>      <param-value>UTF-8</param-value>    </init-param>      </filter>      <filter-mapping>    <filter-name>encodingFilter</filter-name>    <url-pattern>/*</url-pattern>      </filter-mapping>      <!-- spring监听器 -->      <listener>    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>      </listener>      <!-- 防止spring内存溢出监听器,比如quartz -->      <listener>    <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>      </listener>      <!-- spring mvc servlet-->      <servlet>    <servlet-name>SpringMVC</servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    <init-param>      <param-name>contextConfigLocation</param-name>      <param-value>classpath:spring-mvc.xml</param-value>    </init-param>    <load-on-startup>1</load-on-startup>    <async-supported>true</async-supported>      </servlet>      <!-- servlet-mapping -->      <servlet-mapping>    <servlet-name>SpringMVC</servlet-name>    <!-- 此处也可以配置成 *.do 形式 -->    <url-pattern>/</url-pattern>      </servlet-mapping>      <!-- 指明对于如下资源文件不采用spring的过滤器 -->      <servlet-mapping>    <servlet-name>default</servlet-name>    <url-pattern>*.xml</url-pattern>      </servlet-mapping>      <servlet-mapping>    <servlet-name>default</servlet-name>    <url-pattern>*.css</url-pattern>      </servlet-mapping>      <welcome-file-list>    <welcome-file>index.jsp</welcome-file>      </welcome-file-list>      <!-- session配置 -->      <session-config>    <session-timeout>15</session-timeout>      </session-config>    </web-app>

配置完成后的整体目录结构如下:

添加 Tomcat 服务并启动

添加 Tomcat Server

点击右上角的倒三角 -> Edit Configurations,如下图所示:

接下来的设置请参考下面图示说明:

启动 Tomcat

启动项目后,访问 127.0.0.1:8080 或者 localhost:8080,可以看到页面上出现了熟悉的 “Hello World!”,表示 SSM 框架搭建完成!

配置文件加载顺序

Web 容器加载配置文件顺序

上面,我们把配置文件配置好了,那怎样才能起作用呢?这就需要 Web 容器来加载了。Web 容器加载配置文件的过程如下。

启动 Tomcat 后,Web 容器首先加载 web.xml 文件。

web.xml 文件是创建 Web 项目所需要的配置文件,用来初始化配置信息,主要包含拦截器、过滤器、servlet 等的配置,它的位置在项目 WEB-INF 目录下。

在 web.xml 的 <context-param>中加载其他 XML 和 log4j.properties 文件,代码如下:

     <context-param>    <param-name>contextConfigLocation</param-name>    <param-value>      classpath*:spring-mybatis.xml,      classpath*:applicationContext-redis.xml,      classpath*:applicationContext-activemq.xml,    </param-value>      </context-param>     <context-param>    <param-name>log4jConfigLocation</param-name>    <param-value>classpath:log4j.properties</param-value>      </context-param>

其中 param-name 的名称是固定格式,param-value 是要加载的配置文件名,多个用逗号隔开,通过 Ctrl+鼠标左键可定位到相应配置文件。

接着,根据 spring-mybatis.xml 中的 PropertiesFactoryBean 加载多个 properties 文件,代码如下:

       <bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">        <property name="locations">            <list>                <value>classpath:jdbc.properties</value>                <value>classpath:redis.properties</value>                          </list>        </property>        <property name="fileEncoding" value="UTF-8"/>    </bean>    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">        <property name="properties" ref="configProperties"/>    </bean>

通过 property 标签内的 list 标签可以加载多个 properties 文件,value 标签内就是具体的 properties 文件的路径,通过 Ctrl+鼠标左键可以定位到相应的文件。

根据 spring-mybatis.xml 的 SqlSessionFactoryBean 加载 mybatis 核心配置文件 mybatis-config.xml 以及其他映射文件

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">        <property name="dataSource" ref="dataSource"/>        <!-- 配置Mybatis的核心配置文件 -->        <property name="configLocation" value="classpath:mybatis-config.xml" />        <!-- 自动扫描mapping.xml文件 -->        <property name="mapperLocations" value="classpath:mapping/*.xml"></property>    </bean>

其中 property 标签的 name 值是固定的,通过该属性加载对应的 value 中的值,value 的值是配置文件的路径,通过 Ctrl+鼠标左键可访问该文件。

然后,加载前端控制器 DispatcherServlet 的配置文件 srping-mvc.xml。

      <!-- spring mvc servlet-->      <servlet>    <servlet-name>SpringMVC</servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    <init-param>      <param-name>contextConfigLocation</param-name>      <param-value>classpath:spring-mvc.xml</param-value>    </init-param>    <load-on-startup>1</load-on-startup>    <async-supported>true</async-supported>      </servlet>      <!-- servlet-mapping -->      <servlet-mapping>    <servlet-name>SpringMVC</servlet-name>    <!-- 此处也可以配置成 *.do 形式 -->    <url-pattern>/</url-pattern>      </servlet-mapping>

其中 init-param 标签是前端控制器的初始化参数配置,param-name 参数名为固定值,param-value 参数值为具体的配置文件路径,以此来加载对应的配置文件。

<load-on-startup>1</load-on-startup>的正数值越小,启动该 Servlet 的优先级越高。

这样所有的配置文件就加载完毕了!

第03课:MySQL 表结构设计及反向生成实体类
第04课:接口设计及通用 Mapper
第05课:注册(邮件激活、Redis 缓存、Ajax 异步获取)
第06课:登录之账号登录(验证码)
第07课:登录之手机快捷登录(ActiveMQ+阿里大于)
第08课:首页展示及分页(PageHelper)
第09课:评论、回复及点赞模块
第10课:个人主页模块
第11课:博客书写页面——KindEditor 富文本编辑器
第12课:个人资料修改页面
第13课:第三方 QQ 登录及账号绑定与解除
第14课:首页搜索功能(Solr)
第15课:Spring Security 源码解读及账号登录认证授权
第16课:Spring Security 之手机登录认证授权
第17课:Spring Security 之第三方 QQ 登录认证授权
第18课:Linux 系统部署发布
第19课:项目总结

阅读全文: http://gitbook.cn/gitchat/column/5afa86a515da5a21f341cd7f

展开阅读全文

没有更多推荐了,返回首页