SSM整合及聚合工程的搭建
顶哥说官网同步更新:www.dintalk.cn
Spring整合MyBatis
Spring整合SpringMVC
使用Maven搭建SSM工程
使用Maven搭建SSM聚合工程
所谓整合,即将配置汇总到一起统一管理。在整合之前要确保由其单独搭建的开发环境是没有任何错误的,这样利于排错。
一.Spring整合MyBatis
1.搭建mybatis的开发环境并测试通过
mybatis-config.xml主要配置
<!-- 1.引入外部的配置文件 -->
<properties resource="jdbc.properties"/>
<!-- 2.配置延迟加载,即sql优化 -->
<settings>
<!-- 启用懒加载策略 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 覆盖掉延迟加载的触发方法 -->
<setting name="lazyLoadTriggerMethods" value=""/>
<!-- 二级缓存配置(默认开启,此行可省略) -->
<!-- 使用二级缓存,在对应的mapper.xml中加入cache即可 -->
<!--<setting name="cacheEnabled" value="true"/>-->
</settings>
<!-- 3.类别名的配置 -->
<typeAliases>
<!-- 单个类的配置 -->
<!--<typeAlias type="User" alias="user"/>-->
<!-- 配置druid数据源工厂类别名 -->
<typeAlias type="DataSourceFactory" alias="DRUID"/>
<!-- 给包中所有的类配置默认别名, 即类名首字母小写-->
<package name="cn.dintalk.domain"/>
</typeAliases>
<!-- 4.使用默认的环境配置(可以是多个) -->
<environments default="mysql">
<environment id="mysql">
<!-- 事务管理器,此处配置 为JDBC -->
<!--<transactionManager type="JDBC"></transactionManager>-->
<transactionManager type="JDBC"></transactionManager>
<!-- 数据源配置,此处配置为 POOLED-->
<!--<dataSource type="POOLED">-->
<dataSource type="POOLED">
<!-- 配置数据库连接 -->
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</dataSource>
</environment>
</environments>
<!-- 5.注册映射文件 -->
<mappers>
<!-- 指定资源文件路径 -->
<!--<mapper resource="cn/dintalk/dao/UserMapper.xml"></mapper>-->
<!--<mapper resource="cn/dintalk/dao/LoginInfoMapper.xml"></mapper>-->
<!-- 基于Mapper接口的开发:指定类名-->
<!--<mapper class="UserMapper"/>-->
<!-- 指定基于Mapper接口开发的包:(需类名和xml文件名一致,包名一致)-->
<package name="cn.dintalk.dao"/>
</mappers>
2.搭建Spring的开发环境并测试通过
applicationContext.xml主要配置
<!-- 1.导入外部的数据源属性配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 2.配置注解扫描包路径 -->
<context:component-scan base-package="cn.dintalk"/>
<!-- 3.Druid数据源的配置 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 基于xml的 声明式事务控制 -->
<!-- 1.将事务管理器交给Spring进行管理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 2.配置事务通知的属性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager" >
<tx:attributes>
<tx:method name="transfer" propagation="REQUIRED" read-only="false"/>
<tx:method name="add*" propagation="REQUIRED" read-only="false"/>
</tx:attributes>
</tx:advice>
<!-- 3.配置切面 -->
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.dintalk..*.*(..))"/>
</aop:config>
3.进行整合
第一步:导入整合包的坐标
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
第二步:Spring接管Mybatis的主要配置
applicationContext.xml接管mybatis的主要配置
<!-- Spring接管mybatis-config.xml的配置 -->
<!-- 1.接管SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--类别名配置-->
<property name="typeAliasesPackage" value="cn.dintalk.estore"/>
<!--数据源配置-->
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 2.基于接口的mybatis的Mapper交给Spring管理 -->
<bean id="mapperScan" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--指定Mapper所在的包,Spring接管Mapper接口对应的代理对象存于容器-->
<property name="basePackage" value="cn.dintalk.estore.dao"/>
<!--指定sqlSessisonFactory的名字,若容器中仅有一个可忽略-->
<!--<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>-->
</bean>
二.Spring整合SpringMVC
1.搭建Spring开发环境并测试通过
同上
2.搭建SpringMVC的开发环境并测试通过
第一步:创建springmvc.xml并添加以下配置
<!-- 扫描web层的包 -->
<context:component-scan base-package="cn.dintalk.estore.web.controller"/>
<mvc:annotation-driven/>
<!-- 配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
第二步:修改web.xml头约束并配置如下
<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_3_1.xsd"
version="3.1">
<!-- 配置前端控制器 -->
<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>
<!-- 配置post请求过滤器 -->
<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>
</web-app>
3.整合
第一步:在web.xml中添加配置如下
<!-- 配置spring父容器的启动时机 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
Tips: 这样配置的目的就是为了使springmvc的容器可以获得spring容器内的实例。因此配置一个监听器,在应用加载时就加载spring容器。
三.使用Maven搭建SSM工程
按照清晰的思路并进行阶段的测试,搭建SSM工程就是一个小case!(导入pom文件中的依赖坐标是基本功,这里不再赘述)。
1.思路整理
第一步:保证mybatis独立运行
第二步:保证spring的Ioc可以独立运行
第三步:整合spring和mybatis(spring接管SqlSessionFactory的创建,以及dao接口的代理实现类创建)
第四步:保证spring的事务可以使用,测试整合结果
第五步:保证springmvc可以独立运行第六步:整合spring和springMVC
2.编写顺序:
第一:实体类(数据模型,三层都用)
第二:编写持久层接口和映射配置(..Dao.xml)
第三:编写业务层的接口和实现类
第四:编写applicationContext.xml文件并测试(service+dao)
第五:编写sprinmvc.xml、web.xml、控制器和页面并测试(springmvc)
第六:web+service+dao测试
3.配置文件主要内容
applicationContext.xml
<!-- 1.导入数据源的外部配置 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 2.指定注解扫描的包 -->
<context:component-scan base-package="cn.dintalk.dao"/>
<context:component-scan base-package="cn.dintalk.service"/>
<!-- 3.配置数据源 -->
<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>
<!-- 4.配置sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 配置别名 -->
<property name="typeAliasesPackage" value="cn.dintalk.domain"/>
</bean>
<!-- 5.配置mapper扫描 -->
<bean id="mapperScan" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.itheima.dao"/>
</bean>
<!-- 6.配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 7.配置事务通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" read-only="false" propagation="REQUIRED"/>
<tx:method name="find*" read-only="true" propagation="SUPPORTS"/>
</tx:attributes>
</tx:advice>
<!-- 8.配置切面 -->
<aop:config>
<aop:pointcut id="pt1" expression="execution(* cn.dintalk.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"/>
</aop:config>
springmvc.xml主要配置
<!-- 1.配置注解扫描的路径 -->
<context:component-scan base-package="cn.dintalk.web"/>
<!-- 2.开启注解支持 -->
<mvc:annotation-driven/>
<!-- 3.配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 4.静态资源放行 -->
<mvc:default-servlet-handler />
web.xml主要配置
<!-- 1.配置监听器 -->
<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>
<!-- 2.配置前端控制器 -->
<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:spring-mvc.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>
<!-- 3.配置字符过滤器 -->
<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>
四.使用Maven搭建SSM聚合工程
1.创建父工程
第一步:创建父工程
创建父工程时不选择任何的maven骨架,使用其默认的(java项目)即可。
第二步:配置父工程的pom文件
<!--1.父工程的打包方式:pom-->
<packaging>pom</packaging>
<!-- 2.集中定义依赖版本号 -->
<properties>
<junit.version>4.12</junit.version>
<spring.version>5.0.2.RELEASE</spring.version>
<pagehelper.version>5.1.2</pagehelper.version>
<servlet-api.version>2.5</servlet-api.version>
<mybatis.version>3.2.8</mybatis.version>
<mybatis.spring.version>1.2.2</mybatis.spring.version>
<mysql.version>5.1.32</mysql.version>
<druid.version>1.0.9</druid.version>
<commons-fileupload.version>1.3.1</commons-fileupload.version>
<activemq.version>5.11.2</activemq.version>
</properties>
<!-- 3.导入依赖 -->
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
...
</dependencies>
2.创建子模块
父工程上右击,创建子模块,(只将ssm_web模块建为web骨架即可,其他默认(java))。
-| ssm_parent
-| ssm_common
-| ssm_domain
-| ssm_dao
-| ssm_service
-| ssm_web
第一步:创建各模块建的依赖关系
修改各个模块建的pom文件,添加依赖关系(利用依赖的传递性,简化结构)。
第二步:在各模块下配置各模块的配置文件
|- ssm_dao
|-resources
|-cn.... // ..Dao.xml 映射文件
|- jdbc.properties
|- spring/applicaitonContext-dao.xml //只做关于dao层的相关配置
|- ssm_service
|- resources
|-spring/applicationContext-tx.xml //只做关于service层的相关配置
|- ssm_web
|- resources
|- spring/spring-mvc.xml //只做web层的相关配置
第三步:修改web.xml文件中的路径
<!-- 配置监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/applicationContext-*.xml</param-value>
</context-param>
<!-- 配置前端控制器 -->
<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:spring/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Tips: 父工程不写代码的,只在pom文件中对依赖做统一限定。配置文件也分模块后,在web.xml中配置监听器时需要使用通配符* 进行匹配,确保所有的配置文件可以加载。在service层配置文件中会需要用到dao层中配置文件的引用,在编译阶段会报错,但是运行阶段不会。