SSM整合完整流程讲解
目錄
一、SSM整合說明
1、各個框架擔任的角色
2、兩個Ioc容器的創建順序
1)SpringMVC中IOC容器的創建時間
2)Spring中IOC容器的創建時間
3)Spring提供的監聽器ContextLoaderListener
二、SSM整合步驟
1、準備工作
1)導入依賴
?2)創建表
3)包結構
?2、配置web.xml
3、創建SpringMVC的配置文件并配置
4、搭建MyBatis環境
1)創建屬性文件jdbc.properties
2)創建MyBatis的核心配置文件mybatis-config.xml
3)創建Mapper接口和映射文件
4)創建日志文件log4j.xml
5、創建Spring的配置文件并配置
6、測試功能
1)創建組件
2)創建控制層組件EmpController
3)創建接口EmpService及其實現類
4)創建頁面
5)訪問測試功能
?三、總結
一、SSM整合說明
1、各個框架擔任的角色
- SpringMVC:表述層框架,處理瀏覽器發送給服務器的請求,將一些數據響應到瀏覽器。
- MyBatis:持久層框架,連接數據庫,訪問數據庫,操作數據庫
- Spring:整合型框架,通過 IOC管理對象,比如MyBatis中操作數據庫的SqlSession對象,MyBatis操作數據庫時需要事務功能,也可以使用Spring中Aop的重要應用,聲明式事務實現。
Spring 和 SpringMVC 本身就是同源的,作為 Spring 家族的一個框架,整合不整合都行,我們所說的不整合是指 Spring 和 SpringMVC 創建同一個 IOC 容器,整合是指 Spring 和 SpringMVC 各自創建自己的 IOC 容器,管理各自的組件。(建議整合)
既然是兩個IOC容器,他們如何關聯呢?
SpringMVC是子容器,Spring是父容器,子容器可以訪問父容器的bean,父容器訪問不了子容器。(具體在源碼中體現,這里不再贅述)
2、兩個Ioc容器的創建順序
Java工程我們可以控制代碼的執行,寫一個測試類,但是我們要創建的是 web 工程,我們創建IOC容器的代碼要寫在哪里?
SpringMVC 管理的是控制層組件,其他的組件交給 Spring 管理,控制層依賴于Service組件,又自動裝配是在獲取 IOC 容器時完成的,即 Controller 裝配 Service組件就是在獲取 SpringMVC 的 IOC 容器時完成的,那么Spring創建IOC容器要先與SpringMVC的創建時間 ,才能完成自動裝配。
1)SpringMVC中IOC容器的創建時間
SpringMVC的IOC容器是在 DispatcherServlet 初始化的過程中創建的,又 DispatcherServlet 注冊的時候加入了 loadonstartup 標簽,DispatcherServlet 初始化就提前到了服務器啟動的時候。
2)Spring中IOC容器的創建時間
服務器啟動時三大組件執行順序:監聽器,過濾器,Servlet
SpringMVC 的 IOC 容器是在 Servlet 的初始化方法中執行的,那我們把獲取 Spring 的 IOC 容器的代碼放在過濾器或者監聽器的初始化方法中執行,就可以保證在獲取 SpringMVC 的 IOC 容器時,?Spring 的 IOC 容器是提前創建好的,完成 Controller 中對 Service 自動裝配。
但是,過濾器并不適合,過濾器是用來過濾當前的請求和響應,如果我們在過濾器的初始化方法中寫了創建 Spring 的 IOC 容器的代碼,那在執行過濾的方法中什么都不寫,直接放行的話,那創建過濾器的意義就沒有了。
創建過濾器的初始化方法,銷毀方法我們完全可以不寫,最主要的就是dofilter方法,但是現在我們的過濾器就執行了一個初始化方法,之后執行過濾的時候 dofilter 沒有寫任何代碼,我們不能為了實現一個目的而忽視了組件的最初目的。
所以創建Spring的IOC容器只能交給監聽器了。
3)Spring提供的監聽器ContextLoaderListener
監聽器常見的分為三種:ServletContextListener,HttpSesionListener,HttpSessionAttributeListener,后兩個是監聽HttpSession的,只能使用第一種。
ServletContextListener里面有兩個抽象方法ServletContext初始化方法,ServletContext銷毀方法。
public interface ServletContextListener extends EventListener {void contextInitialized(ServletContextEvent var1);void contextDestroyed(ServletContextEvent var1); }Spring提供了監聽器ContextLoaderListener,實現ServletContextListener接口,可監聽?
ServletContext的狀態,在web服務器的啟動,讀取Spring的配置文件,創建Spring的IOC容器。
web?應用中必須在web.xml中配置
<!--配置Spring的監聽器,在服務器啟動的時候加載Spring的配置文件Spring配置文件默認位置和名稱:/WEB-INF/applicationContext.xml可通過上下文參數自定義Spring配置文件的位置和名稱--><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!--設置spring配置文件自定義的位置和名稱--><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring.xml</param-value></context-param>二、SSM整合步驟
1、準備工作
1)導入依賴
<?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.atguigu</groupId><artifactId>ssmbuild</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><spring.version>5.3.1</spring.version></properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency><!--springmvc--><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><!--這里主要使用是里面的事務管理器,連接池用的時下面的Druid--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</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-test</artifactId><version>${spring.version}</version></dependency><!-- Mybatis核心 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency><!--mybatis和spring的整合包--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.6</version></dependency><!-- 連接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.9</version></dependency><!-- junit測試 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!-- MySQL驅動 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version></dependency><!-- log4j日志 --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><!-- ServletAPI --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!-- 日志 --><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version></dependency><!--springmvc中處理json的依賴--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.1</version></dependency><!--只是文件上傳,文件下載不需要這個依賴--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version></dependency><!-- Spring5和Thymeleaf整合包 --><dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring5</artifactId><version>3.0.12.RELEASE</version></dependency><!-- 分頁插件 --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.2.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build> </project>?2)創建表
CREATE TABLE `t_emp` ( `emp_id` int(11) NOT NULL AUTO_INCREMENT, `emp_name` varchar(20) DEFAULT NULL, `age` int(11) DEFAULT NULL, `sex` char(1) DEFAULT NULL, `email` varchar(50) DEFAULT NULL, PRIMARY KEY (`emp_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf83)包結構
?
?2、配置web.xml
相比單獨的SpringMVC,整合時多配置了ContextLoaderListener,主要作用是Spring的監聽器,在服務器啟動的時候加載Spring的配置文件。
<?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"><!--配置Spring的編碼過濾器--><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><url-pattern>/*</url-pattern></filter-mapping><!-- 配置處理請求方式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><url-pattern>/*</url-pattern></filter-mapping><!-- 配置SpringMVC的前端控制器 --><servlet><servlet-name>DispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 設置SpringMVC的配置文件的位置和名稱 --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><!-- 將DispatcherServlet的初始化時間提前到服務器啟動時--><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>DispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!--配置Spring的監聽器,在服務器啟動的時候加載Spring的配置文件 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!--設置spring配置文件自定義的位置和名稱--><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring.xml</param-value></context-param> </web-app>3、創建SpringMVC的配置文件并配置
需要什么組件在里面注冊即可。
<?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:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--掃描控制層組件--><context:component-scan base-package="com.atguigu.ssm.controller"/><!-- 配置Thymeleaf視圖解析器 --><bean id="viewResolver"class="org.thymeleaf.spring5.view.ThymeleafViewResolver"><property name="order" value="1"/><property name="characterEncoding" value="UTF-8"/><property name="templateEngine"><bean class="org.thymeleaf.spring5.SpringTemplateEngine"><property name="templateResolver"><bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"><!-- 視圖前綴 --><property name="prefix" value="/WEB-INF/templates/"/><!-- 視圖后綴 --><property name="suffix" value=".html"/><property name="templateMode" value="HTML5"/><property name="characterEncoding" value="UTF-8" /></bean></property></bean></property></bean><!-- 配置默認的servlet處理靜態資源 --><mvc:default-servlet-handler/><!-- 開啟MVC的注解驅動 --><mvc:annotation-driven/><!--配置視圖控制器--><mvc:view-controller path="/" view-name="index"/><!-- 配置文件上傳解析器 --><bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/><!-- 配置異常解析器 --><bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"/> </beans>這里解釋一下以下三者的關系,順便復習一下前面的知識
<!-- 配置默認的servlet處理靜態資源 --><mvc:default-servlet-handler/><!-- 開啟MVC的注解驅動 --><mvc:annotation-driven/><!--配置視圖控制器--><mvc:view-controller path="/" view-name="index"/>配置 <mvc:default-servlet-handler/> ?原因:SpringMVC 將接收到的所有請求都看作是一個普通的請求,包括對于靜態資源的請求。這樣以來,所有對于靜態資源的請求都會被看作是一個普通的后臺控制器請求,導致請求找不到而報 404 異常錯誤。
對于這個問題 Spring MVC 在全局配置文件中提供了一個 <mvc:default-servlet-handler/> 標簽。在 WEB 容器啟動的時候會在上下文中定義一個 DefaultServletHttpRequestHandler,它會對DispatcherServlet的請求進行處理,如果該請求已經作了映射,那么會接著交給后臺對應的處理程序,如果沒有作映射,就交給 WEB 應用服務器默認的 Servlet 處理,從而找到對應的靜態資源,只有再找不到資源時才會報錯。
只配置 <mvc:default-servlet-handler/>??表示瀏覽器發送的請求都由默認的servlet處理,控制層所寫的請求映射就處理不了了。
只配置 <mvc:view-controller path="/" view-name="index"/>?,只有視圖控制器所配置的路徑才會被解析,控制層以及靜態資源所寫的請求映射就處理不了了。
配置 <mvc:annotation-driven/> ,讓控制層所寫的請求映射被處理。
4、搭建MyBatis環境
1)創建屬性文件jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm jdbc.username=root jdbc.password=123452)創建MyBatis的核心配置文件mybatis-config.xml
其余的配置都在Spring配置文件中,這里面的所有內容都可以在Spring配置文件中配置,我配置了一部分。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><settings><!--將表中字段的下劃線自動轉換為駝峰--><setting name="mapUnderscoreToCamelCase" value="true"/></settings></configuration>3)創建Mapper接口和映射文件
public interface EmpMapper {List<Emp> getAllEmp(); } <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.atguigu.ssm.mapper.EmpMapper"><select id="getAllEmp" resultType="emp">select * from t_emp</select> </mapper>4)創建日志文件log4j.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"><log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"><appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"><param name="Encoding" value="UTF-8" /><layout class="org.apache.log4j.PatternLayout"><param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}%m (%F:%L) \n" /></layout></appender><logger name="java.sql"><level value="debug" /></logger><logger name="org.apache.ibatis"><level value="info" /></logger><root><level value="debug" /><appender-ref ref="STDOUT" /></root> </log4j:configuration>5、創建Spring的配置文件并配置
SpringMVC掃描的是controller包,Spring就要把其他的包掃描了
<?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.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!--掃描組件(除控制層)--><context:component-scan base-package="com.atguigu.ssm"><!-- 按照注解進行排除,標注了指定注解的組件不要掃描 --> <!-- <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>--><!-- 指定排除某個具體的類,按照類排除 --><context:exclude-filter type="assignable" expression="com.atguigu.ssm.controller.EmpController"/></context:component-scan><!--引入jdbc.properties--><context:property-placeholder location="classpath:jdbc.properties"/><!-- 配置數據源--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></bean><!-- 配置事務管理器 --><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!--開啟事務的注解驅動,將使用注解 @Transactional 標識的方法或類中所有的方法進行事務關聯--><tx:annotation-driven transaction-manager="transactionManager"/><!-- 配置SqlSessionFactoryBean,可以直接在Spring的IOC中獲取SqlSessionFactory--><bean class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 設置MyBatis的核心配置文件的路徑 --><property name="configLocation" value="classpath:mybatis-config.xml"/><!-- 設置數據源 --><property name="dataSource" ref="dataSource"/><!-- 設置類型別名,默認為類名 --><property name="typeAliasesPackage" value="com.atguigu.ssm.pojo"/><!-- 設置映射文件所在的包,只有在映射文件的包和mapper接口的包不一致時需要設置 --><property name="mapperLocations" value="classpath:mappers/*.xml"/><!--引入分頁插件--><property name="plugins"><array><bean class="com.github.pagehelper.PageInterceptor"/></array></property></bean><!--配置mapper接口的掃描配置,由mybatis-spring提供,可以將指定包下所有的mapper接口創建動態代理,并將這些動態代理作為IOC容器的bean管理,可以直接在Spring的IOC中獲取Mapper接口了。--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.atguigu.ssm.mapper"/></bean> </beans>6、測試功能
1)創建組件
public class Emp {private Integer empId;private String empName;private Integer age;private String sex;private String email;public Emp() {}public Emp(Integer empId, String empName, Integer age, String sex, String email) {this.empId = empId;this.empName = empName;this.age = age;this.sex = sex;this.email = email;}public Integer getEmpId() {return empId;}public void setEmpId(Integer empId) {this.empId = empId;}public String getEmpName() {return empName;}public void setEmpName(String empName) {this.empName = empName;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}@Overridepublic String toString() {return "Emp{" +"empId=" + empId +", empName='" + empName + '\'' +", age=" + age +", sex='" + sex + '\'' +", email='" + email + '\'' +'}';} }2)創建控制層組件EmpController
@Controller public class EmpController {@Autowiredprivate EmpService empService;@RequestMapping(value = "/emps",method = RequestMethod.GET)public String getAllEmp(Model model){List<Emp> emps = empService.getAllEmp();model.addAttribute("emps",emps);return "emp_list";} }3)創建接口EmpService及其實現類
public interface EmpService {List<Emp> getAllEmp(); } @Service @Transactional //事務注解 public class EmpServiceImpl implements EmpService {@Autowiredprivate EmpMapper empMapper;@Overridepublic List<Emp> getAllEmp() {List<Emp> emps = empMapper.getAllEmp();return emps;} }4)創建頁面
index.html
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head><meta charset="UTF-8"><title>首頁</title> </head> <body> <h1>首頁</h1> </body> </html>emp_list.html?
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head><meta charset="UTF-8"><title>員工列表</title> </head> <body> <table><tr><th colspan="6">員工列表</th></tr><tr><th>流水號</th><th>員工姓名</th><th>年齡</th><th>姓別</th><th>郵箱</th><th>操作</th></tr><tr th:each="employee : ${emps}"><td th:text="${employee.empId}"></td><td th:text="${employee.empName}"></td><td th:text="${employee.age}"></td><td th:text="${employee.sex}"></td><td th:text="${employee.email}"></td><td><a href="">刪除</a><a href="">修改</a></td></tr> </table> </body> </html>5)訪問測試功能
?三、總結
SSM整合核心有以下幾點:
- Spring的IOC容器創建先于SpringMVC的IOC容器
- SpringMVC掃描的是controller包,Spring要把其他的包掃描了,兩個框架管理各自的組件
- 了解?ContextLoaderListener?監聽器的作用,在服務器啟動的時候加載Spring的配置文件
- Spring配置文件代替原來的 mybatis-config.xml
其余的配置與單獨使用時基本一致。?
?
總結
以上是生活随笔為你收集整理的SSM整合完整流程讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: undefined运算
- 下一篇: 5G,仅仅是更快的网速吗?