目录
1 需求
2 准备数据库
3 创建一个 maven 工程
4 知识点准备
4.1 依赖传递
4.2 依赖冲突的解决
4.2.1 依赖调解原则
4.2.2 排除依赖
4.2.3 锁定版本
5 定义 pom.xml
6 Dao 层
6.1 pojo 模型类
6.2 dao 层代码
6.3 配置文件
6.4 单元测试
7 Service 层
8 Web 层
9 Jsp
10 运行与测试
-
1 需求
- 实现 SSM 工程构建,规范依赖管理。场景:根据 id 展示商品信息
-
2 准备数据库
- 导入以下语句
-
3 创建一个 maven 工程
- 1) 新建一个 ssm_maven 项目,使用下图选中的骨架
- 2) 填写坐标
-
3) 查看是否使用的自己的私服
- 4) 在 main 目录下新建 java 和 resources 文件夹
- 5) 把 java 和 resources 文件夹转成 source root
- Source roots (or source folders)
- 通过这个类指定一个文件夹,告诉IntelliJ IDEA,这个文件夹及其子文件夹中包含的源代码,可以编译为构建过程的一部分。
- Test source roots (or test source folders; shown as rootTest)
- 这些根类似于源根,但用于用于测试的代码(例如用于单元测试)。测试源文件夹允许您将与测试相关的代码与生产代码分开。
- 通常,源和测试源的编译结果被放置在不同的文件夹中。
- Resource roots (重要:springmvc使用时,web.xml常用配置的classpath所指的位置就是这个设置后的resources包下的位置)
- 用于应用程序中的资源文件(图像、各种配置XML和属性文件等)。在构建过程中,资源文件夹的所有内容都复制到输出文件夹中.
- 类似于源,您可以指定生成资源。您还可以指定输出文件夹中的文件夹,您的资源应该复制到。
- Test resource roots
- (或测试资源文件夹;如roottestresourceij;只有在java模块)是资源文件与您的测试源有关。在所有其他方面,这些文件夹类似于资源文件夹。
- Excluded
- 将文件标记为Excluded目录后,idea就不会为该文件创建索引,全局搜索也不会搜里面的内容,编辑代码不会智能提示,Excluded Folders相当于代码废弃场
- Source roots (or source folders)
- 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>
-
- 1) 新建一个 ssm_maven 项目,使用下图选中的骨架
-
4 知识点准备
-
4.1 依赖传递
- 先添加 springmvc 的核心依赖的坐标
-
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.2.4.RELEASE</version> </dependency> </dependencies>
- 会发现出现除了 spring-webmvc 以外的其他 jar。因为我们的项目依赖 spring-webmv.jar,而spring-webmv.jar 会依赖 spring-beans.jar 等等,所以 spring-beans.jar 这些 jar 包也出现在 maven 工程中,这种现象称为依赖传递。从下图中可看到他们的关系:(请注意spring-beans 的版本)
-
4.2 依赖冲突的解决
- 接着添加一个依赖
- 我们会发现这两个 jar 包同时都依赖了 spring-beans
- 但是:
- spring-webmvc 依赖 spirng-beans-4.2.4,
- spring-context 依赖 spring-beans-5.0.2,
- 发现spirng-beans-4.2.4 加入到工程中,而我们希望 spring-beans-5.0.2 加入工程。这就造成了依赖冲突。解决依赖冲突有以下原则:
-
-
4.2.1 依赖调解原则
- maven 自动按照下边的原则调解:
- 1)第一声明者优先原则
- 在 pom 文件定义依赖,先声明的依赖为准。
- 测试:
- 如果将上边 spring-webmvc 和 spring-context 顺序颠倒,系统将导入 spring-beans-5.0.2。
- 分析:
- 由于 spring-webmvc 在前边以 spring-webmvc 依赖的 spring-beans-5.0.2 为准,所以最终
- spring-beans-5.0.2 添加到了工程中。
- 2)路径近者优先原则
- 例如:还是上述情况,spring-contex 和 spring-webmvc 都会传递过来 spirng-beans,那如果直接把 spring-beans 的依赖直接写到 pom 文件中,那么项目就不会再使用其他依赖传递来的 spring-beans,因为自己直接在 pom 中定义 spring-beans 要比其他依赖传递过来的路径要近。
- 在本工程中的 pom 中加入 spirng-beans-5.0.2 的依赖,根据路径近者优先原则,系统将导入spirng-beans-5.0.2:
-
-
4.2.2 排除依赖
- 上边的问题也可以通过排除依赖方法辅助依赖调解,如下:
- 比如在依赖 spring-webmvc 的设置中添加排除依赖,排除 spring-beans,
- 下边的配置表示:依赖 spring-webmvc,但排除 spring-webmvc 所依赖的 spring-beans。
-
4.2.3 锁定版本
- 面对众多的依赖,有一种方法不用考虑依赖路径、声明优化等因素可以采用直接锁定版本的方法确定依赖构件的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本的为准添加到工程中,此方法在企业开发中常用。
- 如下的配置是锁定了 spring-beans 和 spring-context 的版本:
-
- 还可以把版本号提取出来,使用<properties>标签设置成变量。
-
- 注意:在工程中锁定依赖的版本并不代表在工程中添加了依赖,如果工程需要添加锁定版本的依赖则需要单独添加<dependencies></dependencies>标签,如下:
-
- 上边添加的依赖并没有指定版本,原因是已在<dependencyManagement>中锁定了版本,所以在<dependency>下不需要再指定版本。
-
-
5 定义 pom.xml
- maven 工程首先要识别依赖,web 工程实现 SSM 整合,需要依赖 spring-webmvc5.0.2、spring5.0.2、mybatis3.4.5 等,在 pom.xml 添加工程如下依赖:
- 分两步:
- 1)锁定依赖版本
- 2)添加依赖
-
<?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>cn.itcast.ssm_maven</groupId> <artifactId>ssm_maven</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <properties> <spring.version>5.0.2.RELEASE</spring.version> <springmvc.version>5.0.2.RELEASE</springmvc.version> <mybatis.version>3.4.5</mybatis.version> </properties> <!--锁定依赖版本--> <dependencyManagement> <dependencies> <!-- Mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <!-- springMVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${springmvc.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</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-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> </dependencies> </dependencyManagement> <!--添加依赖--> <dependencies> <!-- Mybatis 和 mybatis 与 spring 的整合 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> <!-- MySql 驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.32</version> </dependency> <!-- druid 数据库连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.9</version> </dependency> <!-- springMVC 核心--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </dependency> <!-- spring 相关 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> </dependency> <!-- junit 测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> <!-- jstl --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> <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> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <path>/</path> <port>8080</port> </configuration> </plugin> </plugins> </build> </project>
-
6 Dao 层
- 在 src/main/java 中定义 dao 接口,实现根据 id 查询商品信息:
-
6.1 pojo 模型类
- 在 src/main/java 创建模型类
-
-
public class Items { private Integer id; private String name; private Float price; private String pic; private Date createtime; private String detail; ……… }
-
6.2 dao 层代码
-
-
6.3 配置文件
- 注意配置文件的位置
-
- 内容如下
-
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="cn.itcast.ssm.dao.ItemsMapper" > <select id="findById" parameterType="int" resultType="items"> select * from items where id=#{id} </select> </mapper>
-
- 在 src/main/resources 创建applicationContext.xml
-
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 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-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <!-- 数据库连接池 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <!-- 驱动 --> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <!-- url --> <property name="url" value="jdbc:mysql://localhost:3306/maven" /> <!-- 用户名 --> <property name="username" value="root" /> <!-- 密码 --> <property name="password" value="root" /> </bean> <!-- mapper 配置 --> <!-- 让 spring 管理 sqlsessionfactory 使用 mybatis 和 spring 整合包中的 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 数据库连接池 --> <property name="dataSource" ref="dataSource" /> <property name="typeAliasesPackage" value="cn.itcast.ssm.pojo"></property> </bean> <!-- mapper 扫描器 :用来产生代理对象--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="cn.itcast.ssm.dao"></property> </bean> </beans>
-
- 在 src/main/resources 配置 log4j.properties
-
### direct log messages to stdout ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5 p %c{1}:%L - %m%n ### set log levels - for more verbose logging change 'info' to 'debug' ### #在开发阶段日志级别使用 debug log4j.rootLogger=debug, stdout ### 在日志中输出 sql 的输入参数 ### log4j.logger.org.hibernate.type=TRACE
-
- 注意配置文件的位置
-
6.4 单元测试
- 在 src/test/java 创建单元测试类
-
public class ItemsMapperTest { @Test public void testFindItemsById() { //获取 spring 容器 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); //获取 Mapper ItemsMapper itemsMapper = applicationContext.getBean(ItemsMapper.class); //调用 Mapper 方法 Items items = itemsMapper.findById(1); System.out.println(items); } }
-
- 在 src/test/java 创建单元测试类
-
7 Service 层
- 7.1 代码
-
@Service @Transactional public class ItemsServiceImpl implements ItemsService { @Autowired private ItemsMapper itemsMapper; @Override public Items findById(int itemId) { return itemsMapper.findById(itemId); } }
-
- 7.1 代码
- 7.2 配置文件
- 在 applicationContext.xml 中配置 service
- <context:component-scan base-package="cn.itcast.ssm.service"/>
- 在 applicationContext.xml 中配置 service
-
8 Web 层
- 8.1 代码
-
@Controller @RequestMapping("/items/") public class ItemsController { @Autowired private ItemsService itemsService ; // 展示商品信息页面 @RequestMapping("/showItem") public String showItem(int id,Model model){ Items items = itemsService.findById(id); model.addAttribute("item", items); return "viewItem"; } }
-
- 8.1 代码
- 8.2 配置文件
- 在 springmvc.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:p="http://www.springframework.org/schema/p" 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-4.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"> <context:component-scan base-package="cn.itcast.ssm.controller"></context:component-scan> <!-- 配置视图解析器的前缀和后缀 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"></property> <property name="suffix" value=".jsp"></property> </bean> </beans>
- Web.xml
- 加载 spring 容器,配置 springmvc 前端控制器
-
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <!-- 前端控制器 加载 springmvc 容器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servl et-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping> <!-- 监听器 加载 spring 容器 --> <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> </web-app>
-
- 加载 spring 容器,配置 springmvc 前端控制器
-
- 在 springmvc.xml
-
9 Jsp
- /WEB-INF/jsp/viewItem.jsp 如下:
-
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>商品信息</title> </head> <body> <form> <table width="100%" border=1> <tr> <td>商品名称</td> <td> ${item.name } </td> </tr> <tr> <td>商品价格</td> <td> ${item.price } </td> </tr> <tr> <td>生成日期</td> <td> <fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/> </td> </tr> <tr> <td>商品简介</td> <td>${item.detail} </textarea></td> </tr> </table> </form> </body> </html>
-
- /WEB-INF/jsp/viewItem.jsp 如下:
-
10 运行与测试
- 添加tomcat7插件,双击右侧tomcat7运行
-
- 运行结果如下
- 添加tomcat7插件,双击右侧tomcat7运行