目录
4.Spring 配置文件(通常是 applicationContext.xml)
5.Spring MVC 配置文件(通常是 spring-mvc.xml)
6.MyBatis 配置文件(通常是 SqlMapConfig.xml)
一个完整的SSM(Spring+SpringMVC+MyBatis)项目理应包含以下几个目录结构:
上面是一个普通的maven项目。
一、项目启动时各组件的初始化顺序
从宏观层面看,Spring 容器、MyBatis、SpringMVC 这三部分的初始化基本是按照 “Spring 容器 -> MyBatis -> SpringMVC” 的顺序进行,主要原因如下:
- Spring 容器先初始化:Spring 是整个项目的基础框架,负责管理众多 Bean。MyBatis 和 SpringMVC 都依赖于 Spring 容器来管理其相关组件,例如 MyBatis 的
SqlSessionFactory
、SpringMVC 的DispatcherServlet
等都需要在 Spring 容器中注册为 Bean。所以 Spring 容器需要先完成初始化,才能为后续组件的初始化提供环境支持。 - MyBatis 初始化在 SpringMVC 之前:MyBatis 主要负责与数据库交互,它的初始化会创建数据源、构建
SqlSessionFactory
等,这些都是应用程序进行数据持久化操作的基础。SpringMVC 作为 Web 层框架,处理 HTTP 请求,在处理请求过程中可能会涉及到数据库操作,这就依赖于 MyBatis 已经完成初始化并能正常工作。
侧重层次
Spring:
-
Spring是一个全面的框架,它不专注于特定的层次,而是提供了整个应用的基础设施支持。
-
在SSM框架中,Spring主要用于管理Bean的生命周期和依赖注入,包括Service层和DAO层的Bean。
-
Spring还提供了AOP(面向切面编程)的支持,可以用于实现如日志记录、事务管理等横切关注点。
Spring MVC:
-
Spring MVC专注于Web层,特别是Controller层。
-
它提供了一个灵活的MVC架构,用于处理HTTP请求和响应。
-
Spring MVC通过注解或配置文件定义URL映射,将请求分发到相应的Controller处理。
MyBatis:
-
MyBatis专注于数据访问层,即DAO层。
-
它提供了一个简单而强大的SQL映射框架,用于将Java方法映射到数据库操作。
-
MyBatis允许开发者编写自定义的SQL语句,或者使用其提供的ORM特性来简化数据库操作。
请求打过来时项目的启动顺序
一个基于 SSM(Spring + Spring MVC + MyBatis)框架搭建的项目启动时,其处理请求的过程顺序如下:
当项目启动,Tomcat 作为 Servlet 容器会首先加载并解析 web.xml 文件。web.xml 文件是 Web 应用的配置文件,其中配置了 Spring MVC 的前端控制器(通常是 DispatcherServlet)。当客户端发起请求时,请求会首先被发送到该前端控制器。前端控制器接收到请求后,会根据请求的信息(如 URL、请求方法等),将请求分发给对应的 Controller 层组件进行处理。Controller 层主要负责接收请求、解析请求参数,并调用相应的业务逻辑。Controller 层会调用 Service 层的服务方法来处理具体的业务逻辑。Service 层是业务逻辑层,它会组织和协调数据的处理流程,可能会调用多个 DAO(数据访问对象)层的方法来完成数据的增删改查操作。DAO 层主要负责与数据库进行交互,根据 Service 层的调用,执行相应的 SQL 语句,从数据库中获取所需的数据或对数据库进行更新操作,然后将查询到的数据或操作结果返回给 Service 层。Service 层接收到 DAO 层返回的数据后,会对数据进行进一步的处理和封装,然后将处理结果返回给前端控制器,前端控制器再将处理结果返回给客户端。
二、SSM结构
1.组件结构
2.处理请求流程
在一个典型的SSM(Spring、Spring MVC、MyBatis)框架的Java Web应用程序中,一个HTTP请求的处理流程大致如下:
【整体:Controller层 -> Service层 -> DAO层(与数据库交互) -> DAO层返回数据 -> Service层返回业务逻辑处理结果 -> Controller层返回HTTP响应。】
①Controller层接收请求
用户通过浏览器或其他客户端发送HTTP请求到服务器。
请求首先到达Spring MVC的前端控制器DispatcherServlet
。
DispatcherServlet
根据URL映射规则(在SSM项目中配置在web.xml文件中)将请求转发给相应的Controller处理。
DispatcherServlet
是 Spring MVC 框架中的核心前端控制器,起到连接客户端请求和Controller
的关键作用。
②Controller层处理请求
Controller层负责处理HTTP请求,解析请求参数,调用Service层的业务逻辑处理方法,并接收Service层返回的结果。
Controller层通常不包含复杂的业务逻辑,而是作为请求的分发器和响应的组装者。
③Service层处理业务逻辑
Service层接收Controller层的调用,处理具体的业务逻辑。
Service层可以调用多个DAO层的方法来完成数据的增删改查操作。
Service层负责协调多个DAO层的操作,封装业务逻辑,并返回业务处理结果给Controller层。
④DAO层访问数据库
DAO层(Data Access Object层)负责与数据库进行交互,执行SQL语句或调用MyBatis提供的API来完成数据的持久化操作。
DAO层接收Service层的调用,执行相应的数据库操作,并返回数据给Service层。
⑤返回响应
DAO层将查询结果返回给Service层,Service层完成业务逻辑处理后,将结果返回给Controller层。
Controller层将结果封装为HTTP响应,通过Spring MVC的DispatcherServlet
返回给客户端。
⑥视图层展示结果
对于需要展示的请求,Controller层通常会将数据传递给视图(如JSP、Thymeleaf等),由视图负责将数据展示给用户。
三、SSM配置文件
现在来讲一讲一个基础SSM项目的配置文件应该包括哪些部分以及分别承载着什么内容和功能。
1.项目结构各部分功能
①.idea
和.mvn
:这两个文件夹是由 IDE(如 IntelliJ IDEA)自动生成的,用于存储项目的配置信息和 Maven 相关的设置,一般不需要手动修改。
②src/main/java
:存放 Java 源代码。
controller
包:包含控制器类,如StudentController
,负责接收前端请求,调用业务逻辑,并返回响应结果。dao
包:定义数据访问接口,如StudentDao
,用于与数据库进行交互。entity
包:存放实体类,如Student
,用于封装业务数据,对应数据库中的表结构。service
包:包含业务逻辑接口(如StudentService
)和实现类(如StudentServiceImpl
),处理具体的业务逻辑。
③src/main/resources
:存放配置文件。
mapper
文件夹:存放 MyBatis 的 SQL 映射文件,如StudentMapper.xml
,用于定义 SQL 语句和映射关系。applicationContext.xml
:Spring 的配置文件,用于配置 Spring 容器中的 bean、事务管理等。springmvc.xml
:SpringMVC 的配置文件,配置视图解析器、拦截器等。SqlMapConfig.xml
:MyBatis 的核心配置文件,配置数据源、事务管理器等。
④src/main/webapp
:存放 Web 应用资源。
WEB-INF
文件夹:存放应用的配置文件和受保护的资源。web.xml
是 Web 应用的部署描述符,用于配置 Servlet、过滤器等。jsp
文件夹:存放 JSP 页面,如index.jsp
,用于展示数据。
⑤target
:Maven 构建项目时生成的目标文件夹,包含编译后的 class 文件、打包后的 war 包等。
⑥pom.xml
:Maven 项目的核心配置文件,用于管理项目的依赖、插件和构建信息。
2.pom.xml文件
首先作为一个maven文件,配置pom.xml文件的依赖十分重要。
maven的中央仓库:https://mvnrepository.com/repos/central
进入官网后:
maven项目底层依赖就是连接maven中央仓库,在有网络的情况下,maven上配置的依赖就会默认连接这个网址,如果用的是阿里云,那么就会连接到阿里云,在查找阿里云的依赖时如果没有找到,那么依旧会回到这个网站进行查找,但是若是说在这个网站上都没有查找到,那么就是真的不存在这个依赖。
maven需要什么依赖都可以来这个网站上搜索:
以搜索MySql的依赖为例:
点进去后会看见有各种版本的依赖,需要哪个自行选择:
比如说我选择了8.0.11版本的点进去:
就可以直接复制粘贴拿来用了
在此我的这个SSM项目中,我选择了如下依赖:
<dependencies>
<!-- Jackson JSON 处理库 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
<!-- Spring 框架相关依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.2.RELEASE</version>
<scope>test</scope>
</dependency>
<!-- Servlet API 和 JSP API -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- 日志相关依赖 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- Thymeleaf 模板引擎 -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring4</artifactId>
<version>3.0.9.RELEASE</version>
</dependency>
<!-- Commons IO -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<!-- MySQL 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<!-- MyBatis 相关依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<!-- Druid 数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
<!-- 导包 -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>
也就是如下的依赖项:
3.web.xml文件
web.xml
配置的关键组件:
Spring ContextLoaderListener:初始化Spring应用上下文并加载配置文件。
Spring MVC DispatcherServlet:处理所有HTTP请求并映射到相应的控制器。
字符编码Filter:确保请求和响应的字符编码正确。
欢迎文件列表:指定访问Web应用根目录时显示的欢迎文件。
错误页面:指定自定义错误页面以处理404和500错误。
参考我的部署:
<?xml version="1.0" encoding="UTF-8"?>
<web-app
version="4.0"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:javaee="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xml="http://www.w3.org/XML/1998/namespace"
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">
<display-name>Archetype Created Web Application</display-name>
<!-- 配置 Spring 上下文监听器 -->
<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>
<!-- 配置 Spring MVC 前端控制器 -->
<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:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
4.Spring 配置文件(通常是 applicationContext.xml
)
承担功能
Spring 配置文件主要负责整个项目的基础配置,包括组件扫描、数据源配置、事务管理、MyBatis 相关配置等,它是整个项目的核心配置,管理着项目中各个组件的生命周期和依赖关系。
注:在ssm集成项目中,mybatis的数据源配置通常是配置在spring的配置xml文件中的。
比如我的配置成:
<?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"
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">
<!-- 开启组件扫描 -->
<context:component-scan base-package="com.qcby"/>
<!-- 配置数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ssmdemo"/>
<property name="username" value="root"/>
<property name="password" value="2020"/>
</bean>
<!-- 配置 SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
<!-- 配置 Mapper 扫描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.qcby.dao"/>
</bean>
</beans>
5.Spring MVC 配置文件(通常是 spring-mvc.xml
)
承担功能
Spring MVC 配置文件主要负责处理 Web 请求相关的配置,包括视图解析器、静态资源映射、拦截器、消息转换器等,它是 Web 层的核心配置,负责将客户端请求映射到相应的控制器方法,并将处理结果返回给客户端。
比如我配置:
<?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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
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">
<!-- 开启组件扫描 -->
<context:component-scan base-package="com.qcby.controller"/>
<!-- 开启 Spring MVC 注解支持 -->
<mvc:annotation-driven/>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
6.MyBatis 配置文件(通常是 SqlMapConfig.xml
)
承担功能
在 SSM 集成项目中,MyBatis 配置文件主要负责一些 MyBatis 自身的特性配置,如类型别名、插件、映射器等,通常不再配置数据源。
就可以精简成下面的模式:
<?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>
<environments default="mysql">
<environment id="mysql">
<!--配置事务的类型,使用Spring管理事务-->
<transactionManager type="MANAGED"></transactionManager>
<!--使用Spring配置的数据源-->
<dataSource type="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy"/>
</environment>
</environments>
<mappers>
<mapper resource="mapper/StudentMapper.xml"></mapper>
</mappers>
</configuration>