l 需求:SSM整合实现查询商品列表
l 整合思路回顾
SSM=(Mybatis+Spring)+SpringMVC
=(Dao层+Service层)+Web层
Dao层和Service分别开发完毕之后,然后按照三个整合目标完成后续工作:
目标1:数据库连接池和数据库事务交给Spring管理
目标2:SqlSessionFactory作为单例交给Spring管理
目标3:Spring扫描Mapper接口创建并管理Mapper代理对象,我们使用的时候直接去容器中拿到Mapper代理对象进行使用
测试Mybatis+Spring
再整合SpringMVC(相当于在已有整合工程的基础上开发SpringMVC的入门案例)
细节1:Controller层扫描应该配置在Springmvc的配置文件中
细节2:Spring框架使用监听器启动(配置在web.xml中)
l POM.xml
注意:以后到公司使用Maven也是这样,引入一个Jar包需要三步:定义版本、锁定版本、引入jar包;但是这么干未免太过麻烦,所以每个公司都有自己的POM文件模板,项目经理会提供给你你直接使用即可,比如像我们今天的项目就需要一个这样的模板
(一)依赖传递[理解]
在Maven的POM文件中导入一个jar的坐标,那么Maven会把这个jar所依赖的jar全部下载下来,这种机制就叫做依赖传递。
我们直接导入的jar叫做直接依赖;由Maven补全的jar叫做间接依赖。
(二)依赖冲突的解决[理解]
l 第一声明者优先原则:哪个jar坐标导入在前(pom文件中该jar的坐标配置在上面),依赖jar的版本和这个jar的版本保持一致
l 路径近者优先原则:在pom.xml中明确配置了某一个jar的版本(明确告诉maven我要使用哪个版本,那就是用哪个版本),那么就以此为准
l 版本锁定:好处在父子工程中体现的更明显
(三)搭建SSM工程[应用]
1.新建一个 ssm_maven 项目,使用下图选中的骨架
2.下一步填写坐标
3.确认是否使用的自己的私服,然后直接下一步完成
4.在 main 目录下新建 java 和 resources 文件夹
5.把 java 和 resources 文件夹转成 source root
6.修改编译版本,在 pom.xml 文件中添加
<build>
<plugins>
<!-- 设置编译版本为 1.8 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version >
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
7.定义 pom.xml
maven 工程首先要识别依赖,web 工程实现 SSM 整合,需要依赖 spring-webmvc5.0.2、
spring5.0.2、mybatis3.4.5 等,在 pom.xml 添加工程如下依赖:(在实际企业开发中会有专门得人来编写 pom.xml)
分两步:
1)锁定依赖版本
2)添加依赖
<groupId>com.mavenDemo.maven</groupId>
<artifactId>ssm_maven</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<!-- POM文件模板开始 -->
<properties>
<!-- 项目编码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 编译及输出的时候应用那个版本的jdk -->
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<!-- 定义spring的版本 -->
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- 底层容器 -->
<!-- SpringBean管理 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring IOC管理 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring AOP管理 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 切面功能包里面包含了我们用的切面切入点织入等功能-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.7</version>
</dependency>
<!-- 数据库操作 -->
<!-- mybatis的核心包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!-- mybatis与spring的整合包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!-- 事务操作 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- JDBC辅助 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 页面功能 -->
<!-- SpringMVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- ServletAPI -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!-- JSTL -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- 底层容器 -->
<!-- SpringBean管理 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<!-- Spring IOC管理 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<!-- Spring AOP管理 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
<!-- 切面功能包里面包含了我们用的切面切入点织入等功能-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<!-- 数据库操作 -->
<!-- mybatis的核心包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
<!-- mybatis与spring的整合包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</dependency>
<!-- 事务操作 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<!-- JDBC辅助 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<!-- 页面功能 -->
<!-- SpringMVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<!-- ServletAPI -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</dependency>
<!-- JSTL -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<!-- 数据库驱动 -->
<!-- Oracle驱动 -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>10.2.0.4.0</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.7</version>
</dependency>
<!-- 数据源 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
</dependencies>
<!-- POM文件模板结束 -->
8.Dao 层
在src/main/java 中定义 dao 接口,实现查询全部:
(1)pojo 模型类
在src/main/java 创建模型类
(2) dao 层代码
配置文件:注意配置文件的位置
在 src/main/resources 创建 spring-core.xml
<!-- 1. 引入外部的配置文件 -->
<context:property-placeholder location="classpath:ssm.properties" />
<!-- 2. 配置注解bean的包扫描 -->
<context:component-scan base-package="cn.mavenDemo">
<!-- 排除springmvc的Controller注解 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 3. 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<!-- 四大属性 -->
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.userpass}" />
</bean>
<!-- 4.session 工厂 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 绑定数据源 -->
<property name="dataSource" ref="dataSource" />
<!-- 加载配置文件 -->
<property name="configLocation" value="classpath:SqlMapConfig.xml" />
<!-- 加载映射文件 -->
<property name="mapperLocations" value="classpath:com/**/*Mapper.xml" />
</bean>
<!-- 5.mybaits的专用接口扫描 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.mavenDemo.ssm.dao" />
</bean>
<!-- 6.事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 绑定数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 7.声明式事务 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<!-- 查询方法 : 只读事务,当前有事务沿用当前的事务,没事务以非事务方式运行,保证快 -->
<tx:method name="find*" read-only="true" propagation="SUPPORTS"/>
<!-- 操作方法 : 非只读,以读已提交数据为事务隔离界别,如果有事务用当前事务,没事创建一个新的始终保持在事务方法中运行 -->
<!-- READ_COMMITTED 读已提交 并发访问速度快 但是不安全 牺牲安全保证速度 -->
<tx:method name="insert*" isolation="READ_COMMITTED" />
<tx:method name="update*" isolation="READ_COMMITTED" />
<tx:method name="delete*" isolation="READ_COMMITTED" />
<tx:method name="*" read-only="true" propagation="SUPPORTS"/>
</tx:attributes>
</tx:advice>
<!-- 8.AOP 代理实现 -->
<aop:config>
<!-- 配置切入点 -->
<aop:pointcut id="serviceCut" expression="execution(* cn.mavenDemo.ssm.service..*.*(..))" />
<!-- 织入 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceCut" />
</aop:config>
在 src/main/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">
<configuration>
<!-- 1. 显示SQL语句 -->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!-- 2. 配置别名包 -->
<typeAliases>
<package name="cn.mavenDemo.pojo" />
</typeAliases>
</configuration>
创建ssm.properties
jdbc.driver = oracle.jdbc.OracleDriver
jdbc.url = jdbc:oracle:thin:@127.0.0.1:1521:orcl
jdbc.username = ssmoperate
jdbc.userpass = orcl
(3)Service 层
(4)Web 层
配置文件
在 src/main/resources 创建 spring-mvc.xml
<!-- 1.配置controller注解 -->
<context:component-scan base-package="cn.mavenDemo">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 2.加载预置的SpringMVC -->
<mvc:annotation-driven />
<!-- 3.配置视图解析器/WEB-INF/pages/account_list.jsp -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/pages/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>
Web.xml
加载 spring 容器,配置 springmvc 前端控制器
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 加载spring配置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-core.xml</param-value>
</context-param>
<!-- 过滤器 -->
<filter>
<filter-name>EncodingFilter</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>
<filter-name>RestFulFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>RestFulFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置spring的监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- springmvc核心servlet -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 加载一下springmvc的配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
(5)JSP
Index.jsp
<%@ page isELIgnored="false" contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>系统首页</title>
<script type="text/javascript">
function goView() {
window.location.href = "${pageContext.request.contextPath}/AccountViewAction/AccountView";
}
function goAdd() {
alert("准备添加");
}
</script>
</head>
<body>
<div>
<h1>欢迎使用账户信息管理系统</h1>
<h3>请选择你要使用的功能 :</h3>
<input type="button" value="添加" onclick="goAdd();" />
<input type="button" value="查询" onclick="goView();" />
</div>
</body>
</html>
AccountList.jsp
<%@ page isELIgnored="false" contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>数据展示</title>
</head>
<body>
<div>
<c:if test="${not empty accounts}">
<table border="1">
<thead>
<tr>
<th>编号</th>
<th>姓名</th>
<th>金额</th>
</tr>
</thead>
<tbody>
<c:forEach items="${accounts}" var="a">
<tr align="center">
<td>${a.id}</td>
<td>${a.name}</td>
<td>
<fmt:formatNumber type="currency" value="${a.money}" />
</td>
</tr>
</c:forEach>
</tbody>
</table>
</c:if>
</div>
</body>
</html>
(6)运行与调试
已添加 tomcat7 插件,双击右侧 tomcat7 运行