上篇整合了SSH项目,由于Struts2框架在性能上的一些劣势以及与Spring项目融合比较繁琐,使得SSH项目并没有在JavaEE开发中大量应用。这篇文章用来整合现在比较流行的SSM框架。在融合的过程中,需要以Spring框架为核心。
说明
SSM项目基于maven构建,所有的jar包如下
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.12.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.4</version>
</dependency>
</dependencies>
一、Spring和SpringMVC的整合
spring和springMVC的整合比较容易,毕竟都是Sprng家族的,这也是SSM项目大量应用的原因。整合过程中需要明白以下几点:
(1)有父子容器的概念,即Spring框架中的容器为父容器,SpringMVC框架的容器为子容器,父容器用来管理Service层和Dao层的bean对象。子容器用来管理Controller层的对象
(2)当浏览器请求的Controller层时,需要提前加载好Service层和Dao层的bean对象,因此需要使用监听器,在服务器启动的时候,就将Spring管理的对象加载服务器中供Controller层使用
(3)为了提高开发效率,这里采用xml文件 + 注解的方式
1. 搭建Spring框架
-
准备所需要的jar包,也就是Spring的核心包。
-
Spring的配置文件
在Spring框架中我们希望它只管理Serivce层和Dao层的bean对象。需要在配置文件中做以下设定。
-
编写Service层和dao层代码
为了整合SSM项目,我们这里实现一个简单的操作,即从浏览器出发,最终实现想数据库中保存数据。
service层代码
-
测试Spring框架
执行下面测试代码,验证Spring框架成功。
2.整合SpringMVC框架
- 导入相关jar包
- web.xml文件的配置
配置前端解析器:这是SpringMVC的核心
配置字符过滤器:用来解决中文乱码问题
配置监听器: 用来将Spring框架中的配置文件提前加载到容器中,供SpringMVC的Controller层使用。这里Spring管理Bean的容器为父容器,SpringMVC管理的容器为子容器。
<!-- 配置spring监听器 用来加载spring配置文件-->
<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>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置前端过滤器-->
<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>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- SpringMVC配置文件
<!--开启注解支持-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--只扫描Controller层的bean-->
<context:component-scan base-package="time.controller"></context:component-scan>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 过滤静态资源-->
<mvc:resources mapping="/js/**" location="/js/"></mvc:resources>
- Controller层编写代码,通过Spring的依赖注入将UserService对象注入
- 启动tomca服务器,验证是否整合成功。
二、Spring和MyBatis的整合
1.编写Dao层
MyBatis会根据UserDao接口实现具体的类,比较简便。
2. 将MyBatis配置文件中的内容配置在Spring框架的配置文件中
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">
<transactionManager type="jdbc"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/springdemo?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="Lei1995"/>
</dataSource>
</environment>
</environments>
<!-- 引入映射配置文件-->
<mappers>
<package name="time.dao"/>
</mappers>
</configuration>
将以上配置文件的内容配置进Spring的配置文件
<!--spring整合Mybatis框架-->
<!--配置连接池-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/springdemo?serverTimezone=UTC"/>
<property name="user" value="root"/>
<property name="password" value="Lei1995"/>
</bean>
<!--配置SqlSessionFactory-->
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--配置UserDao接口所在的包-->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="time.dao"></property>
</bean>
除了上述之外,还需要在Spring配置文件中配置事务,MyBatis中默认设置不提交。
<!--配置事务管理-->
<!--配置事务管理-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--配置事务通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="find" read-only="true"/>
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution( * time.servicce.*ServiceImp.*(..))"/>
</aop:config>
3.将UserDao层注入到Service层中
现在已经完成了SSM框架的整合,由于之前没有学习过MyBatis框架,对这块不够了解,但整合的原则就是,将MyBatis框架中用到bean对象交给Spring容器管理。