SSM框架多种整合方式,这里使用注解+XML文件的方式来进行整合开发
一、前期准备
1.1、创建数据库与表
打开数据库可视化工具,执行以下sql语句
1 2 3 4 5 6 7 8 9 10 11 12 13
| CREATE DATABASE ssm;
USE ssm;
CREATE TABLE `student`( id INT PRIMARY KEY AUTO_INCREMENT, `name` VARCHAR(32), score DOUBLE ); INSERT INTO `student` VALUES (1, 'A', 80); INSERT INTO `student` VALUES (2, 'B', 95); INSERT INTO `student` VALUES (3, 'C', 90); INSERT INTO `student` VALUES (4, 'D', 100);
|
1.2、创建maven项目
注:这里需要以maven-archetype-webapp为骨架构建项目
设置项目路径与坐标后,点击next
选择项目使用的maven版本及settings.xml文件,在属性中添加一键值对:**(archetypeCatalog:internal)**,这个键值对可以解决maven项目构建速度过慢的问题。
1.3、编辑pom.xml
在pom.xml文件中引入项目依赖与版本锁定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
| <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <spring.version>5.0.2.RELEASE</spring.version> <slf4j.version>1.6.6</slf4j.version> <log4j.version>1.2.12</log4j.version> <mysql.version>8.0.19</mysql.version> <mybatis.version>3.4.5</mybatis.version> </properties>
<dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.6.8</version> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</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-webmvc</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-tx</artifactId> <version>${spring.version}</version> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency>
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>compile</scope> </dependency>
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency>
<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency>
<dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency>
<dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency>
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency>
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency>
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency>
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency>
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.9</version> </dependency>
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.16</version> </dependency> </dependencies>
|
1.4、完善目录结构
- 在src/main目录下创建java文件夹与resource文件夹。
- 在上一步创建的java目录下创建com.hzx.entity、com.hzx.dao、com.hzx.controller、com.hzx.service和com.hzx.test包
完善后的目录如下:
1.5、创建基本类
根据数据库的表结构创建实体类,这里使用了Lombok简化开发
1 2 3 4 5 6 7
| package com.hzx.entity; @Data public class Student implements Serializable { private Integer id; private String name; private Double score; }
|
在service包下创建一个StudentService接口,再创建一个impl包,然后在impl包下新建一个StudentServiceImpl实现类,这个类实现StudentService接口。
1 2 3
| package com.hzx.service; public interface StudentService { }
|
1 2 3
| package com.hzx.service.impl; public class StudentServiceImpl implements StudentService { }
|
在mapper包下创建StudentMapper接口
1 2 3
| package com.hzx.mapper; public interface StudentMapper { }
|
在controller包下创建一个StudentController接口
1 2 3
| package com.hzx.controller; public class StudentController { }
|
二、Spring相关环境配置
2.1、编写Spring核心配置文件
在resource目录下创建Spring核心配置文件–applicationContext.xml
在这个核心配置文件中,我们需要
- 开启组件扫描,扫描com.hzx包下的所有组件
- 由于controller包下的控制器组件属于SpringMVC,所以我们需要在组件扫描中排除com.hzx包下所有添加了@Controller注解的组件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <?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">
<context:component-scan base-package="com.hzx"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
</beans>
|
2.2、测试
在StudentServiceImpl上添加@Service注解,同时添加两个方法进行测试
1 2 3 4 5 6 7 8
| @Service public class StudentServiceImpl implements StudentService { @Override public List<Student> getAllStudent() { System.out.println("Service层的getAll方法,需要调用Mapper层与数据库交互."); return null; } }
|
在com.hzx.test包下创建一个TestSpring类,编写方法使用junit进行测试
1 2 3 4 5 6 7 8
| public class TestSpring { @Test public void testGetAll() { ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml"); StudentService studentService = ioc.getBean(StudentServiceImpl.class); studentService.getAllStudent(); } }
|
结果
出现以上结果证明Spring基本环境已经搭建完成,下面配置SpringMVC
三、SpringMVC相关环境配置
3,1、配置web.xml
配置SpringMVC的核心前端控制器:DispatcherServlet
web.xml文件位置如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <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>
|
配置字符编码过滤器,用于解决中文乱码
注:如果配置了多个过滤器,那么这个字符编码过滤器必须放在最前
1 2 3 4 5 6 7 8 9 10 11 12 13
| <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>
|
可选:如果你在SSM框架中想使用REST风格的API,那么需要配置一个HiddenHttpMethodFilter
1 2 3 4 5 6 7 8 9
| <filter> <filter-name>hiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>hiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
|
3.2、配置springmvc.xml
在resource目录下创建一个springmvc.xml配置文件
1 2 3 4
| <context:component-scan base-package="com.hzx"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
|
- 配置视图解析器,在WEB-INF文件夹下创建一个pages文件夹
1 2 3 4 5 6 7
| <bean id="org" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"/> <property name="suffix" value=".jsp"/> </bean>
|
- 在webapp目录下创建三个用于存放静态资源的文件夹(css、images、js),并放行静态资源
1 2 3 4
| <mvc:resources mapping="/css/**" location="/css/"/> <mvc:resources mapping="/images/**" location="/images/"/> <mvc:resources mapping="/js/**" location="/js/"/>
|
1 2
| <mvc:annotation-driven/>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| <?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">
<context:component-scan base-package="com.hzx"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
<bean id="org" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"/> <property name="suffix" value=".jsp"/> </bean>
<mvc:resources mapping="/css/**" location="/css/"/> <mvc:resources mapping="/images/**" location="/images/"/> <mvc:resources mapping="/js/**" location="/js/"/>
<mvc:annotation-driven/> </beans>
|
3.3、编写页面
修改index.jsp
1 2 3 4 5 6 7 8 9
| <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>主页</title> </head> <body> <a href="student/getAll">查询所有学生</a> </body> </html>
|
在WEB-INF/pages目录下创建一个list.jsp
1 2 3 4 5 6 7 8 9
| <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <html> <head> <title>查询所有页面</title> </head> <body> <h3>这是学生列表</h3> </body> </html>
|
3.4、测试
在StudentController添加一方法,这个方法用于跳转到list.jsp页面
1 2 3 4 5 6 7 8 9 10
| @Controller @RequestMapping("/student") public class StudentController { @RequestMapping("/getAll") public ModelAndView getAll() { ModelAndView mv = new ModelAndView(); mv.setViewName("list"); return mv; } }
|
配置tomcat
点击超链接后跳转成功,证明Springmvc基本配置完成
四、Spring整合Spring MVC
4.1、配置监听器
通过对 Spring MVC 的代码编写,我们知道,在服务器启动的时候就回去加载 springmvc.xml 这个配置,现在我们就需要继续在 web.xml 中配置,使得在项目启动的时候,就去加载applicationContext.xml的配置文件
所以我们可以在 web.xml 中,配置spring核心监听器,它默认会以 /WEB-INF/applicationContext.xml作为配置文件,这里需要注意web.xml文件中各个组件的存放位置
1 2 3 4 5 6 7 8 9
| <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>
|
4.2、使用controller调用service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @Controller @RequestMapping("/student") public class StudentController { @Autowired private StudentService studentService; @RequestMapping("/getAll") public ModelAndView getAll() { System.out.println("控制层的getAll方法..."); studentService.getAllStudent(); ModelAndView mv = new ModelAndView(); mv.setViewName("list"); return mv; } }
|
4.3、重新启动tomcat,测试
在tomcat的VM options中填入:-Dfile.encoding=UTF-8,用于解决IDEA的控制台乱码问题
五、使用Spring整合Mybatis
5.1、编写Mybatis核心配置文件
在resource目录下新建一个SqlMapConfig.xml,这个文件其实可以省略,但我们还是用它来编写类名简化配置。
- 创建SqlMapConfig.xml配置文件
- 扫描com.hzx包,为包下的实体类起一个别名,并在控制台输出执行的sql
- 与数据库连接相关的配置我们放在Spring的核心配置文件中配置。
1 2 3 4 5 6 7 8 9 10 11 12 13
| <?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> <settings> <setting name="logImpl" value="STDOUT_LOGGING" /> </settings> <typeAliases> <package name="com.hzx"/> </typeAliases> </configuration>
|
5.2、编写StudentMapper接口
使用注解形式编写sql语句,也可以使用xml配置文件的方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @Repository public interface StudentMapper {
@Select("select * from `ssm`.`student`") List<Student> getAll();
@Insert("insert into `ssm`.`student`(name,score) values(#{name},#{score})") int addStudent(Student student); }
|
5.3、编写链接数据库的配置文件
1 2 3 4
| jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf8&useSSL=false&nullCatalogMeansCurrent=true&serverTimezone=Asia/Shanghai jdbc.username=root jdbc.password=tianxin1230.
|
5.4、修改Spring核心配置文件
在Spring核心配置文件配置数据库连接池,引入properties文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <context:property-placeholder location="classpath:db.properties" ignore-unresolvable="true" />
<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>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" > <property name="dataSource" ref="dataSource" /> </bean>
<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer" > <property name="basePackage" value="com.hzx.mapper" /> </bean>
|
5.5、修改service实现类和controller层
service实现类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @Service public class StudentServiceImpl implements StudentService { @Autowired private StudentMapper studentMapper; @Override public List<Student> getAllStudent() { System.out.println("Service层的getAll方法,需要调用Mapper层与数据库交互."); return studentMapper.getAll(); } @Override public int addStudent(Student student) { System.out.println("Service层的addStudent方法,需要调用Mapper层与数据库交互."); return studentMapper.addStudent(student); } }
|
controller层
修改getAll方法,并添加add方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| @Controller @RequestMapping("/student") public class StudentController { @Autowired private StudentService studentService;
@RequestMapping("/getAll") public ModelAndView getAll() { System.out.println("控制层的getAll方法..."); List<Student> students = studentService.getAllStudent(); ModelAndView mv = new ModelAndView(); mv.addObject("students",students); mv.setViewName("list"); return mv; }
@RequestMapping("/add") public void add(Student student, HttpServletRequest request, HttpServletResponse response) throws IOException, IOException { studentService.addStudent(student); response.sendRedirect(request.getContextPath()+"/student/getAll"); return; } }
|
5.6、修改index.jsp和
index.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>主页</title> </head> <body> <a href="student/getAll">查询所有学生</a> <form action="student/add" method="post"> 学生姓名:<input type="text" name="name"><br/> 学科成绩:<input type="text" name="score"><br/> <input type="submit" value="添加"/><br/> </form> </body> </html>
|
list.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13
| <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <html> <head> <title>学生列表</title> </head> <body> <h3>学生列表</h3> <c:forEach items="${students}" var="student"> ${student.name} 的成绩为: ${student.score} </c:forEach> </body> </html>
|
测试查询所有学生方法
测试添加所有学生方法
结果
5.7、添加事务控制
修改spring核心配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="find*" read-only="true"/> <tx:method name="*" isolation="DEFAULT"/> </tx:attributes> </tx:advice>
<aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.ideal.service.impl.*ServiceImpl.*(..))"/> </aop:config>
|