一、引入SSM框架依赖
<packaging>war</packaging> <dependencies> <!--服务器支持--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.3</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.4.1</version> </dependency> <!-- 注解 --> <dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.1</version> </dependency> <!--spring核心依赖+springmvc全部依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.13</version> </dependency> <!--spring事务管理--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.3.13</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.13</version> </dependency> <!--实现面向切面功能--> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.8</version> </dependency> <!--mybatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <!--数据库连接--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> <!--数据源--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency> <!--mybatis整合spring--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.7</version> </dependency> <!--jstl表达式--> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!--文件上传--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> <!--json格式转换--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.1</version> </dependency> <!--数据验证--> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.2.0.Final</version> </dependency> <!--日志--> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!--简化实体类--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.22</version> </dependency> <!--单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> </dependency> <!--分页查询--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.3.0</version> </dependency> <!--thymeleaf模板--> <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf</artifactId> <version>3.0.11.RELEASE</version> </dependency> </dependencies>
二、SSM框架搭建
1、创建maven项目。
2、在pom.xml文件中添加依赖。
需要注意的是pom文件打包方式为war。
3、在main根目录下创建webapp目录
1、在webapp根目录下创建WEB-INF目录
2、在WEB-INF根目录下创建views目录
views目录是用来存放视图文件(jsp或者是html文件)的,存放在该目录下的jsp文件是不能直接访问的需要在通过转发或者重定向的方式访问,也就是需要通过访问controller来访问。
3、在WEB-INF根目录下创建web.xml配置文件
该配置文件是SSM程序的入口,通过该配置文件程序能读取到spring和springmvc的配置文件。也就是需要在服务器启动的时候加载这两个配置文件。
<?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"> <!--配置前端控制器,接收除了访问.jsp请求之外的所有请求。--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--其他控制器都配置在了springmvc.xml文件里面交给Ioc管理了。因此需要在这里添加xml文件的路径--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-*.xml</param-value> <!--因为其他控制器是需要前端控制器(DispatcherServlet)的调度的,因此需要在服务器开启时就要 加载其他控制器,也是为了减少资源的消耗 --> </init-param> <!--启动时会调用servlet的构造方法创建servlet对象,还会调用init()方法初始化一些参数--> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> <!-- /:除了.jsp的请求都会匹配 /*:所有的请求都会匹配 .do、.action:结尾是do或者action的请求都会匹配 --> </servlet-mapping> <!--配置编过滤器CharacterEncodingFilter,编码的过滤器要写在所有过滤器的前面--> <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> <init-param> <!--同时设置请求和相应的编码规则--> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <!--配置过滤器要拦截那些请求--> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <!--设置拦截规则,使用 <servlet-name>springmvc</servlet-name> 表示只拦截拦截springmvc的请求。--> <!--<url-pattern></url-pattern>--> <servlet-name>springmvc</servlet-name> </filter-mapping> <!-- <!–处理HTML不支持put和delete提交方式–> <filter> <filter-name>hiddenHttpMethodFilter</filter-name> <filter-class> org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>hiddenHttpMethodFilter</filter-name> <servlet-name>springmvc</servlet-name> </filter-mapping>--> </web-app>
4、在Java目录下创建SSM三层结构(控制层、服务层、持久层和实体类)
5、在resources根目录下创建spring、springmvc、mybatis、数据库和日志的配置文件。
三、流程分析
客户端发出请求被springmvc框架及的前端控制器(dispatcherServlet)拦截,前端控制器将请求交给处理器映射器,处理器映射器需要从spring容器中检索到controller,因此需要在springmvc配置文件中配置扫描(该扫描仅仅是针对controller的),如下:
<!--扫描controller--> <context:component-scan base-package="cn.edu.qtc.Controller"/>
当controller实例被加载到spring容器中时,此时的处理器映射器会找到能够处理前端控制器传递来的url的controller,并生成调用链并将其传递给前端控制器。前端控制器接受到处理器映射器传递来的调用链后,将该调用链传递给处理器适配器,处理器适配器根据调用链找到具体的controller的方法来处理客户端发送来的请求。
controller只是负责接受客户端的请求,controller需要调用service层实现具体的业务逻辑。所以还需要在springmvc的配置文件中扫描service层。如下:
<context:component-scan base-package="cn.edu.qtc.Service"/>
service层负责具体的逻辑,但是对数据库的操作是由mybatis框架实现的,也就是dao层,因为spring框架既有数据库功能也有事务管理功能因此数据库与数据库的事务管理交给spring框架,mybatis框架只负责执行sql语句。 spring配置文件中的数据库配置和事务管理配置代码如下:
<!--数据库配置文件--> <context:property-placeholder location="druid.properties"/> <!-- 数据库--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${druid.driver}"/> <property name="url" value="${druid.url}"/> <property name="username" value="${druid.username}"/> <property name="password" value="${druid.password}"/> </bean> <!-- 事务管理 --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:annotation-driven transaction-manager="txManager"/>
这样, 就相当于是和数据库打通了,然后就是要让mybatis框架干活,spring框架和mybatis框架的链接是sqlsession对象,也就是说spring框架只有通过sqlsession对象执行SQL语句才能操作数据库,那么sqlSession对象能执行哪些SQL语句呢?这就看mapper文件中有哪些SQL语句了,sqlSessionFactory是生产sqlSession的工厂,是根据mapper文件生产出来的sqlSession对象,因此需要在spring配置文件中配置sqlSessionFactory的实例,代码如下:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="configLocation" value="classpath:mybatis-config.xml"></property> </bean>
可以看到首先是加载数据源,加载数据源之后sqlSessionFactory对象生产出来的sqlSession对象才知道它要操作哪个数据库!然后又加载了mybatis配置文件。 mybatis配置文件现在只需要加载mapper文件即可,代码如下:
<configuration> <mappers> <mapper resource="Mappers/userMapper.xml"/> </mappers> </configuration>
得到数据库信息和SQL语句的信息之后就能生产sqlSession对象了,代码如下:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> <property name="basePackage" value="cn.edu.qtc.Dao"></property> </bean>
在mybatis中sqlSession通过getMapper(xxx.class)来执行该接口对应的mapper文件的SQL语句,在SSM中dao层需要注入到service层中,因此我们还需要扫描Dao层。也就是
此时service会访问到dao层,controller层会访问到service层,得到service层的结果后还需要返回视图,因此还需要在springmvc配置文件中配置视图解析器,代码如下:
<!--视图解析器--> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean>
至此,整个SSM流程完毕。