本文主要是介绍JavaWeb笔记(30)-SSM整合,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
- 框架的整合(SpringMVC+Spring+Mybatis)
1. 由之前学习的三大框架进行整合开发:
- 表现层(Web层):SpringMVC框架
- 业务层:Spring框架
- 持久层:Mybatis框架
2. 该三大框架的整合一定是由Spring框架去整合(配置)其他两个框架
- 在整合时需要注意Mybatis和Spring版本匹配关系
- 在开发过程中更多的使用:配置文件+注解 的方式进行配置
3. 项目结构:
domain包:存放自定义Bean对象的包
web包:存放自定义的web层控制器的包
service包:存放自定义的service层方法
dao包:存放自定义的数据库操作方法
4. 导包:
pom.xml文件
<properties>
<spring.version>5.0.2.RELEASE</spring.version>
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.12</log4j.version>
<mysql.version>5.1.6</mysql.version>
<mybatis.version>3.4.5</mybatis.version>
</properties>
<!-- spring AOP -->
aspectjweaver 1.6.8
spring-aop ${spring.version}
<!-- Spring容器 -->
spring-context ${spring.version}
<!-- Spring MVC -->
spring-web ${spring.version}
spring-webmvc ${spring.version}
<!-- Spring 单元测试框架 -->
spring-test ${spring.version}
<!-- Spring 事务管理 -->
spring-tx ${spring.version}
<!-- Spring JdbcTemplate技术 -->
spring-jdbc ${spring.version}
<!-- 单元测试 -->
junit 4.12
<!-- mysql驱动 -->
mysql-connector-java ${mysql.version}
<!-- servlet 和 jsp -->
servlet-api 2.5 provided
jsp-api 2.0 provided
<!-- jsp页面EL表达式 -->
jstl 1.2
<!-- 日志相关技术 -->
log4j ${log4j.version}
slf4j-api ${slf4j.version}
slf4j-log4j12 ${slf4j.version}
<!-- mybatis和Spring整合Mybatis所使用的包 -->
mybatis ${mybatis.version}
mybatis-spring 1.3.0
<!-- 数据库连接池技术 -->
c3p0 0.9.1.2 compile
- Spring环境配置
1. 在resources目录下创建applicationContext.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"
xmlns:aop="http://www.springframework.org/schema/aop"
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
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
2. Spring需要扫描service层和dao层的注解,并管理业务层对象添加到容器中
web层对象和注解交由SpringMVC进行管理
- 配置注解扫描
<context:component-scan base-package="cn.mysilent">
<!-- 配置要忽略web层的Controller注解 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
3. 结束符
</beans>
- SpringMVC环境配置
1. web.xml文件配置
a. 在web.xml配置文件中配置前端控制器,所有请求将交由前端控制器管理
- 在<web-app>标签中添加<servlet>配置
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置初始化参数,创建完DispatcherServlet对象,加载springmvc.xml配置文件 -->
<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>
b. 在web.xml配置文件中配置过滤器,解决中文乱码问题
- 在<web-app>标签中添加<filter>配置
<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>
2. 在resources目录下创建springmvc.xml配置文件
a. 约束头
<?xml version="1.0" encoding="UTF-8"?>
<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">
b. 配置注解扫描,仅扫描web层的Controller注解
<context:component-scan base-package="cn.mysilent">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
c. 配置视图解析器,使得方法返回字符串可以自动搜索应目录下的同名jsp文件作为跳转页面
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- JSP文件所在的目录 -->
<property name="prefix" value="/WEB-INF/pages/" />
<!-- 文件的后缀名 -->
<property name="suffix" value=".jsp" />
</bean>
d. 设置静态资源不过滤
<mvc:resources location="/css/" mapping="/css/**" />
<mvc:resources location="/images/" mapping="/images/**" />
<mvc:resources location="/js/" mapping="/js/**" />
e. 开启SpringMVC的注解扫描
<mvc:annotation-driven />
f. 结束符
</beans>
- Spring整合SpringMVC:为了能在Controller的方法中调用service层的方法
1. Spring管理对象都是放在容器中,为了能调用service层的方法,首先需要想到定义对象,然后进行注入
- 当前状况:在web.xml文件中仅配置了扫描springmvc.xml配置文件,没有加载Spring的配置文件
- 解决方案:在Tomcat服务器启动时需要加载Spring配置文件
- 一个web应用的核心对象ServletContext域对象仅有唯一的一个,在服务器启动时创建,在服务器关闭时销毁
- 存在一系列监听器用于监听ServletContext对象的创建和销毁
- 于是在配置对象创建监听器时,读取Spring的配置文件
- Spring提供了这样一个监听器用于创建web版的工厂,存储在ServletContext域对象中(ContextLoaderListener监听器)
- ContextLoaderListener监听器默认加载WEB-INF目录下的applicationContext.xml配置文件,原配置文件放在resources目录下
- 配置初始化参数,修改配置文件加载路径
2. 在web.xml配置文件中添加<listener>标签
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listenerclass>
</listener>
<!-- 配置加载类路径的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
3. 在web表现层中定义service层对象,使用@Autowired注解自动注入
- Mybatis配置
1. 在resources目录下创建sqlMapConfig.xml配置文件
- 约束头
<?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">
2. 在<configuration>标签中插入<environments>标签配置数据库环境
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///ssm"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
3. 配置需要扫描的dao包,在<configuration>标签中添加<mappers>标签
<mappers>
<!-- 该包下所有的dao接口都可以使用 -->
<package name="cn.mysilent.dao"/>
</mappers>
4. 结束符
</configuration>
- Spring整合Mybatis:为了在service层调用dao层的方法,实际整合过程就是将sqlMapConfig.xml配置文件中的内容转移到applicationContext.xml配置文件中去。
1. 正常使用Mybatis是
a. 通过读取sqlMapConfig.xml文件来读取数据库信息
b. 通过创建SqlSessionFactory工厂来获取SqlSession对象
c. 通过SqlSession对象来创建dao的代理对象
d. 通过代理对象来调用dao方法
2. Spring整合Mybatis同样是考虑自动注入的方式来获取代理对象
a. 第一步:在Spring配置文件中配置连接池(在这里使用c3p0连接池技术)
在<beans>标签中添加<bean>标签配置数据库连接池
<bean id="dataSource" class="org.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql:///ssm" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
b. 第二步:在Spring配置文件中配置SqlSessionFactory工厂,存入IOC容器中
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
c. 第三步:配置注解扫描的包
<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.mysilent.dao"/>
</bean>
3. 在dao层的接口编写中添加@Repository注解,由Spring创建代理对象并添加到容器中
4. 在service层的实现类中定义dao接口对象,并使用@AutoWired注解自动注入
- Spring整合Mybatis的事务管理
1. 在没有配置事物管理时,查找功能可以正确执行,但是增删改功能并不能对数据库进行实质操作,需要手动调用commit方法进行提交
2. 在Spring中配置事务管理
a. 配置事务管理器,在applicationContext.xml配置文件<beans>标签中插入<bean>标签
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
b. 配置事务的通知,在applicationContext.xml中使用tx的标签约束
<!-- 配置事务的通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 使用通配符来标识事务的管理 -->
<tx:method name="*" propagation="REQUIRED" read-only="false"/>
<!-- 标明find打头的方法(查找类)不需要进行事务管理 -->
<!-- 编程时需要遵循命名规范 -->
<tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice>
c. 配置AOP的增强,将事务管理的前,后,异常通知使用注解标注并使用动态代理的技术来管理实现
<aop:config>
<!-- 配置切入点表达式,表示该包下任意实现类的任意方法都是切入点 -->
<aop:pointcut expression="execution(* com.mysilent.service.impl.*.*(..))" id="pt1"/>
<!-- 建立通知和切入点表达式的关系 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"/>
</aop:config>
3. spring框架基于注解的AOP控制(除环绕通知手动控制)在执行顺序上存在瑕疵
前置--业务方法--最终--后置
前置--业务方法--最终--异常
因此使用注解,建议使用环绕通知
这篇关于JavaWeb笔记(30)-SSM整合的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!