前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SSM 单体框架 - 教育平台后台管理系统:Maven 进阶使用

SSM 单体框架 - 教育平台后台管理系统:Maven 进阶使用

作者头像
RendaZhang
发布2020-09-24 11:03:24
9340
发布2020-09-24 11:03:24
举报
文章被收录于专栏:RendaRenda

项目架构

项目介绍

教育后台管理系统是提供给相关业务人员使用的一个后台管理系统,业务人员可以在这个后台管理系统中,对课程信息、广告信息、用户信息、 权限信息等数据进行维护。

在 Java web 阶段已经完成了教育后台管理系统中的课程模块,接下来将对教育后台管理系统进行升级改造,基于 SSM 框架来完成课程信息模块、广告信息模块、用户信息模块、权限信息模块。

技术选型
前端技术选型
  • Vue.js:是一套用于构建用户界面的渐进式 JavaScript 框架
  • Element UI 库:是饿了么前端出品的基于 Vue.js 的后台组件库,方便程序员进行页面快速布局和构建
  • Node.js:是运行在服务端的 JavaScript 运行环境
  • Axios:实现了对 Ajax 的封装,而 Ajax 技术实现了局部数据的刷新
后端技术选型
  • Web 层借助 SpringMVC 接收请求,进行视图跳转
  • Service 层借助 Spring 进行 IOC、AOP、及事务管理
  • Dao 层借助 MyBatis 进行数据库交互
项目开发环境

开发工具:后端 - IDEA 2019,前端 - VS code,数据库客户端工具 - SQLYog

开发环境:JDK 11,Maven 3.6.3,MySQL 5.7

Maven 进阶使用(Maven 聚合工程)

Maven 基础知识
Maven 介绍

Maven 是一个项目管理工具,主要作用是在项目开发阶段对 Java 项目进行依赖管理和项目构建。

依赖管理:是对 jar 包的管理。通过导入 maven 坐标,就相当于将仓库中的 jar 包导入了当前项目中。

项目构建:通过 maven 的一个命令就可以完成项目从清理、编译、测试、报告、打包,部署整个过程。

Maven 的仓库类型

本地仓库

远程仓库

  1. Maven 中央仓库(http://repo2.maven.org/maven2/)
  2. Maven 私服(公司局域网内的仓库,需要自己搭建)
  3. 其他公共远程仓库(例如 apache 提供的远程仓库,http://repo.maven.apache.org/maven2/)

本地仓库 ---> maven 私服 --> maven 中央仓库

Maven 常用命令

clean 清理

compile 编译

test 测试

package 打包

install 安装

Maven 坐标书写规范

代码语言:javascript
复制
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
</dependency>
Maven 的依赖传递
什么是依赖传递

在 maven 中,依赖是可以传递的,假设存在三个项目,分别是项目 A,项目 B 以及项目C。假设 C 依赖 B,B 依赖 A,那么可以根据 Maven 项目依赖的特征推出项目 C 也依赖 A。

代码语言:javascript
复制
...
<!-- springMVC 相关坐标-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.1.5.RELEASE</version>
</dependency>
...

如上所示,当 web 项目直接依赖了 spring-webmvc,而 spring-webmvc 依赖了 sping-aopspring-beans 等。最终的结果就是在 web 项目中间接依赖了 spring-aopspring-beans 等。

依赖冲突
代码语言:javascript
复制
...
<!-- springMVC-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.1.5.RELEASE</version>
</dependency>
<!-- springAOP-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>5.1.6.RELEASE</version>
</dependency>
...

如上所示,由于依赖传递现象的存在,spring-webmvc 依赖 spring-beans-5.1.5,而spring-aop 依赖 spring-beans-5.1.6,但是发现 spirng-beans-5.1.5 已经加入到了工程中,这时候如果希望 spring-beans-5.1.6 加入工程,就造成了依赖冲突。

如何解决依赖冲突
  1. 使用 maven 提供的依赖调解原则:第一声明者优先原则、路径近者优先原则
  2. 排除依赖
  3. 锁定版本
依赖调节原则
第一声明者优先原则

在 POM 文件中定义依赖,以先声明的依赖为准。其实就是根据坐标导入的顺序来确定最终使用哪个传递过来的依赖。

代码语言:javascript
复制
...
<!-- springAOP 第一声明者优先使用 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>5.1.6.RELEASE</version>
</dependency>
<!-- springMVC-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.1.5.RELEASE</version>
</dependency>
...

结论:spring-aopspring-webmvc 都传递过来了 spring-beans,但是因为 spring-aop 在前面,所以最终使用的 spring-beans 是由 spring-aop 传递过来的,而 spring-webmvc 传递过来的 spring-beans 则被忽略了。

路径近者优先原则
代码语言:javascript
复制
...
<!-- springAOP-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>5.1.6.RELEASE</version>
</dependency>
<!-- springMVC-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.1.5.RELEASE</version>
</dependency>
<!-- 直接依赖 spring-beans,路径更近,优先使用 5.1.7 版本 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>5.1.7.RELEASE</version>
</dependency>
...

总结:直接依赖大于依赖传递。

排除依赖

可以使用 exclusions 标签将传递过来的依赖排除出去。

代码语言:javascript
复制
...
<!-- springMVC-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.1.5.RELEASE</version>
    <!-- 排除依赖 5.1.5 版本的 spring-beans -->
    <exclusions>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- springAOP -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>5.1.6.RELEASE</version>
</dependency>
...
版本锁定

采用直接锁定版本的方法确定依赖 jar 包的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本为准添加到工程中,此方法在企业开发中经常使用。

版本锁定的使用方式:

第一步 - 在 dependencyManagement 标签中锁定依赖的版本 第二步 - 在 dependencies 标签中声明需要导入的 maven 坐标

  1. dependencyManagement 标签中锁定依赖的版本
代码语言:javascript
复制
...
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.1.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.5.RELEASE</version>
        </dependency>
    </dependencies>
</dependencyManagement>
...
  1. dependencies 标签中声明需要导入的 maven 坐标
代码语言:javascript
复制
...
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.1.5.RELEASE</version>
    </dependency>
    <!-- 对应的 jar 包就无需配置版本号  -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>
</dependencies>
...
`properties` 标签的使用
代码语言:javascript
复制
...

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
    <java.version>1.11</java.version>
    <maven.compiler.source>1.11</maven.compiler.source>
    <maven.compiler.target>1.11</maven.compiler.target>
    <spring.version>5.1.5.RELEASE</spring.version>
    <springmvc.version>5.1.5.RELEASE</springmvc.version>
    <mybatis.version>3.5.1</mybatis.version>
</properties>

...

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    ...
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>${mybatis.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</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-test</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${springmvc.version}</version>
    </dependency>
    ,,,
</dependencies>
,,,
Maven 聚合工程(分模块)

概念:在现实生活中,汽车厂家进行汽车生产时,由于整个生产过程非常复杂和繁琐,工作量非常大,所以厂家都会将整个汽车的部件分开生产,最终再将生产好的部件进行组装,形成一台完整的汽车。

分模块构建 maven 工程分析

在企业项目开发中,由于项目规模大,业务复杂,参与的人员比较多,一般会通过合理的模块拆分将一个大型的项目拆分为 N 多个小模块,分别进行开发。而且拆分出的模块可以非常容易的被其他模块复用。

常见的拆分方式有两种:

  1. 按照业务模块进行拆分,每个模块拆分成一个 maven 工程,例如将一个项目分为用户模块,订单模块,购物车模块等,每个模块对应就是一个 maven 工程
  2. 按照层进行拆分,例如持久层、业务层、表现层等,每个层对应就是一个 maven 工程

不管上面哪种拆分方式,通常都会提供一个父工程,将一些公共的代码和配置提取到父工程中进行统一管理和配置。

父工程:资源的统一管理 - 依赖管理、版本锁定

代码语言:javascript
复制
按层拆分

- maven_web 依赖 mavent_service 依赖 mavent_dao 依赖 maven_pojo

- maven_web、mavent_service、mavent_dao、maven_pojo 四个工程都继承 maven_parent
Maven 工程的继承

在 Java 语言中,类之间是可以继承的,通过继承,子类就可以引用父类中非 private 的属性和方法。同样,在 maven 工程之间也可以继承,子工程继承父工程后,就可以使用在父工程中引入的依赖。继承的目的是为了消除重复代码。

被继承的 Maven 工程通常称为父工程,父工程的打包方式必须为 POM,所以区分某个 Maven 工程是否为父工程就看这个工程的打包方式是否为 POM:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.renda</groupId>
    <artifactId>edu_home_parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <modules>
        <module>ssm-utils</module>
        <module>ssm-domain</module>
        <module>ssm-dao</module>
        <module>ssm-service</module>
        <module>ssm-web</module>
    </modules>

    <properties>
        <spring.version>5.1.5.RELEASE</spring.version>
        <springmvc.version>5.1.5.RELEASE</springmvc.version>
        <mybatis.version>3.5.1</mybatis.version>
    </properties>

    <!-- 统一版本锁定 -->
    <dependencyManagement>
        <dependencies>
            ...
        </dependencies>
    </dependencyManagement>

    <!-- 统一依赖管理 -->
    <dependencies>
        ...
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

继承其他 Maven 父工程的工程通常称为子工程,在 pom.xml 文件中通过 parent 标签进行父工程的继承:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.renda</groupId>
        <artifactId>edu_home_parent</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <artifactId>ssm-web</artifactId>
    <packaging>war</packaging>

    <dependencies>
        <dependency>
            <groupId>com.lagou</groupId>
            <artifactId>ssm-service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

</project>
Maven 工程的聚合

在 maven 工程的 pom.xml 文件中可以使用标签将其他 maven 工程聚合到一起,聚合的目的是为了进行统一操作。

例如拆分后的 maven 工程有多个,如果要进行打包,就需要针对每个工程分别执行打包命令,操作起来非常繁琐。这时就可以使用标签将这些工程统一聚合到 maven 父工程中,需要打包的时候,只需要在此工程中执行一次打包命令,其下被聚合的工程就都会被打包了。

使用 Maven 聚合工程搭建教育后台管理系统

工程整体结构如下:

1)lagou_edu_home_parent 为父工程,其余工程为子工程,都继承父工程 lagou_edu_home_parent

2)lagou_edu_home_parent 工程将其子工程都进行了聚合

3)子工程之间存在依赖关系:

代码语言:javascript
复制
- ssm_utils:编写工具类
- ssm_domain:编写实体类
- ssm_dao:编写 dao 层代码及配置文件
- ssm_service:编写 service 层代码及配置文件
- ssm_web:编写 web 层代码及配置文件

- ssm_domain 依赖 ssm_utils
- ssm_dao 依赖 ssm_domain
- ssm_service 依赖 ssm_dao
- ssm_web 依赖 ssm_service

- ssm_utils、ssm_domain、ssm_dao、ssm_service、ssm_web 都继承 lagou_edu_home_parent

依赖关系建立原则:当前项目要用到哪个项目的资源,那么当前项目就依赖要用到的资源的项目(通过直接依赖和间接依赖的方式)。

父工程 `lagou_edu_home_parent` 构建

修改 pom.xml 添加依赖:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.renda</groupId>
    <artifactId>lagou_edu_home_parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <!-- 指定编码及版本 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
        <java.version>1.11</java.version>
        <maven.compiler.source>1.11</maven.compiler.source>
        <maven.compiler.target>1.11</maven.compiler.target>
        <spring.version>5.1.5.RELEASE</spring.version>
        <springmvc.version>5.1.5.RELEASE</springmvc.version>
        <mybatis.version>3.5.1</mybatis.version>
    </properties>

    <!-- 锁定 jar 版本 -->
    <dependencyManagement>
        <dependencies>
            <!-- Mybatis -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>${mybatis.version}</version>
            </dependency>
            <!-- springMVC -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>${springmvc.version}</version>
            </dependency>
            <!-- spring -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</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-web</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-expression</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</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-test</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-tx</artifactId>
                <version>${spring.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!-- mybatis 相关坐标-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.15</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
        </dependency>
        <!-- java Junit 测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <!-- spring 相关坐标 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.13</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
        </dependency>
        <!-- MyBatis 整合 Spring 坐标-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.1</version>
        </dependency>
        <!-- springMVC 相关坐标 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- jackson 解析 JSON -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.8</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.8</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.0</version>
        </dependency>
        <!-- 分页助手 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>4.1.6</version>
        </dependency>
        <!-- 文件上传和 BeanUtils -->
        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.8.3</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        <!-- 解决跨域问题所需依赖 -->
        <dependency>
            <groupId>com.thetransactioncompany</groupId>
            <artifactId>cors-filter</artifactId>
            <version>2.5</version>
        </dependency>
        <!-- log4j -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.7</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>

<!--    <build>-->
<!--        <plugins>-->
<!--            <plugin>-->
<!--                <groupId>org.apache.maven.plugins</groupId>-->
<!--                <artifactId>maven-compiler-plugin</artifactId>-->
<!--                <version>3.1</version>-->
<!--                <configuration>-->
<!--                    <source>${maven.compiler.source}</source>-->
<!--                    <target>${maven.compiler.target}</target>-->
<!--                    <encoding>${maven.compiler.encoding}</encoding>-->
<!--                </configuration>-->
<!--            </plugin>-->
<!--        </plugins>-->
<!--    </build>-->

</project>
子工程 `ssm-utils` 构建

默认生成的 pom.xml 文件

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>lagou_edu_home_parent</artifactId>
        <groupId>com.renda</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>ssm-utils</artifactId>
</project>
子工程 `ssm-domain` 构建

配置 ssm-domain 工程的 pom.xml 文件

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>lagou_edu_home_parent</artifactId>
        <groupId>com.renda</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>ssm-domain</artifactId>

    <!-- 依赖 ssm_utils -->
    <dependencies>
        <dependency>
            <groupId>com.renda</groupId>
            <artifactId>ssm-utils</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

</project>

创建实体类 Test.java

代码语言:javascript
复制
package com.renda.domain;

public class Test {

    private Integer id;
    private String name;

    public Test() {
    }

    public Test(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Test{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
子工程 `ssm-dao` 构建

配置 ssm-dao 工程的 pom.xml 文件

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>lagou_edu_home_parent</artifactId>
        <groupId>com.renda</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>ssm-dao</artifactId>

    <dependencies>
        <dependency>
            <!-- 依赖 ssm_domain -->
            <groupId>com.renda</groupId>
            <artifactId>ssm-domain</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

</project>

创建 DAO 接口和 Mapper 映射文件

代码语言:javascript
复制
public interface TestMapper {
    List<Test> findAllTest();
}
代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.renda.dao.TestMapper">
    <select id="findAllTest" resultType="test">
        select * from test
    </select>
</mapper>

在 resources 目录下创建 Spring 配置文件 applicationContext-dao.xml

代码语言:javascript
复制
<?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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- spring 整合 mybatis -->

    <!-- 引入 jdbc.properties -->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!-- 1.数据源配置 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}"></property>
        <property name="url" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>

    <!-- 2.sqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="typeAliasesPackage" value="com.renda.domain"/>
        <!-- 引入加载 mybatis 核心配置文件 -->
        <property name="configLocation" value="classpath:sqlMapConfig.xml"></property>
    </bean>

    <!-- 3.mapper 映射扫描,没有别的地方用到这个 bean,所以可以省略 id -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.renda.dao"/>
    </bean>

</beans>

sqlMapConfig.xml

代码语言:javascript
复制
<?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>
        <!--
            是否开启自动驼峰命名规则(camel case)映射。
            即从数据库列名 A_COLUMN 到属性名 aColumn 的类似映射。
            如从 a_name 映射为 aName
        -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
</configuration>
子工程 `ssm-service` 构建

配置 ssm-service 工程的 pom.xml 文件

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>lagou_edu_home_parent</artifactId>
        <groupId>com.renda</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>ssm-service</artifactId>


    <dependencies>
        <!-- 依赖 ssm_dao -->
        <dependency>
            <groupId>com.renda</groupId>
            <artifactId>ssm-dao</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

</project>

创建 TestService 接口和实现类

代码语言:javascript
复制
public interface TestService {
    /**
     * 对 test 表进行查询所有
     */
    List<Test> findAllTest();
}
代码语言:javascript
复制
@Service
public class TestServiceImpl implements TestService {
    @Autowired
    private TestMapper testMapper;

    @Override
    public List<Test> findAllTest() {
        return testMapper.findAllTest();
    }
}

创建 spring 配置文件 applicationContext-service.xml

代码语言:javascript
复制
<?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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    <!-- 进行 service 的相关配置:IOC -->

    <!-- 开启 IOC 注解扫描 -->
    <context:component-scan base-package="com.renda.service"/>

    <!-- 引入 applicationContext-dao.xml -->
    <import resource="classpath:applicationContext-dao.xml"/>

</beans>
子工程 `ssm-web` 构建

配置 ssm-web 工程的 pom.xml 文件

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>lagou_edu_home_parent</artifactId>
        <groupId>com.renda</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>ssm-web</artifactId>

    <!-- 打包方式为 war -->
    <packaging>war</packaging>

    <dependencies>
        <!-- 依赖 ssm_service -->
        <dependency>
            <groupId>com.renda</groupId>
            <artifactId>ssm-service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

</project>

创建 Controller

代码语言:javascript
复制
@RestController // 等同于 @Controller + @ResponseBody
public class TestController {
    @Autowired
    private TestService testService;

    @RequestMapping("/findAllTest")
    public List<Test> findAllTest() {
        return testService.findAllTest();
    }
}

创建 SpringMVC 配置文件 springmvc.xml

代码语言:javascript
复制
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 1.组件扫描 -->
    <context:component-scan base-package="com.renda.controller"/>

    <!-- 2.mvc 注解增强 -->
    <mvc:annotation-driven/>

    <!-- 3.视图解析器:暂时不用配置,因为没有用到视图跳转 -->

    <!-- 4.静态资源放行 -->
    <mvc:default-servlet-handler/>

</beans>

编写 applicationContext.xml

代码语言:javascript
复制
<?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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- 引入 applcationContext-service.xml -->
    <import resource="classpath:applicationContext-service.xml"/>

</beans>

配置 web.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!-- 前端控制器 -->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- spring 的监听器 contextLoaderListener -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <!-- 中文乱码过滤器 -->
    <filter>
        <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 配置跨域过滤器 -->
    <filter>
        <filter-name>corsFilter</filter-name>
        <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>corsFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Renda 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 项目架构
    • 项目介绍
      • 技术选型
        • 前端技术选型
        • 后端技术选型
      • 项目开发环境
      • Maven 进阶使用(Maven 聚合工程)
        • Maven 基础知识
          • Maven 介绍
          • Maven 的仓库类型
          • Maven 常用命令
        • Maven 的依赖传递
          • 什么是依赖传递
          • 依赖冲突
          • 如何解决依赖冲突
          • 依赖调节原则
          • 排除依赖
          • 版本锁定
          • `properties` 标签的使用
        • Maven 聚合工程(分模块)
          • 分模块构建 maven 工程分析
          • Maven 工程的继承
          • Maven 工程的聚合
          • 使用 Maven 聚合工程搭建教育后台管理系统
      相关产品与服务
      云数据库 MySQL
      腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档