整合思路
1、先搭建整合的环境
2、先把Spring的配置搭建完成
3、再使用Spring整合SpringMVC框架
4、之后使用Spring整合MyBatis框架
5、最后spring整合mybatis框架配置事务(Spring的声明式事务管理)
以下是循序渐进
整合,如果你已经有相关知识的基础,只想直接看各个文件的源码
请直接看最后的 源码部分
基本环境搭建
1、创建maven工程
2、完善好目录结构
3、pom.xml加入ssm必须的依赖,加在<dependencies></dependencies>
标签内
唯一注意:mysql连接驱动5.7要修改成正确的版本
<!-- junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- spring支持-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.4</version>
</dependency>
<!-- servlet,jsp支持-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- 数据库驱动mysql8.0-->
<!-- mysql5.7注意更换版本-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
<!-- 数据库连接池-->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!-- mybatis支持-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
<!-- jackson,json字符串转换插件-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version> 2.9.8 </version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.8</version>
</dependency>
<!-- lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.18</version>
</dependency>
<!-- springAop支持-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-aop</artifactId>
<version>5.6.2</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
maven有可能会有资源导出问题,在pom.xml末尾位置加入下面一段话
直接替换默认<build></build>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
4、编写数据库(model就简单建个库)
sql:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
`name` varchar(255) DEFAULT NULL,
`age` int DEFAULT NULL,
`email` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
BEGIN;
INSERT INTO `test` VALUES ('张三', 12, '12213@qq.com');
INSERT INTO `test` VALUES ('李四', 21, 'dddew@qq.com');
INSERT INTO `test` VALUES ('ads', 12, 'sd@qq.com');
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
5、编写pojo实体类
这是数据库字段映射到java的类
注意 :属性名
要与数据库中的字段名称
对应
这里使用的lombok插件,如果不想使用插件需要自己写getter / setter / toString
package com.ssm.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String name;
private Integer age;
private String email;
}
web
依赖于service
,service
依赖于dao
6、编写dao接口
根据业务需求书写抽象方法
package com.ssm.dao;
import com.ssm.pojo.User;
import java.util.List;
public interface UserDao {
List<User> getAll();//查询所有的用户
}
7、编写service接口 以及 对应实现类
UserService:
package com.ssm.service;
import com.ssm.pojo.User;
import java.util.List;
public interface UserService {
List<User> getAll();
}
UserServiceImpl:
package com.ssm.service.Impl;
import com.ssm.pojo.User;
import com.ssm.service.UserService;
import java.util.List;
@Service("userService")//注册bean,放入ioc容器中统一管理
public class UserServiceImpl implements UserService {
@Override
public List<User> getAll() {
System.out.println("进入getAll()方法");
return null;
}
}
基本环境搭建完成
spring的搭建
1、编写spring的配置文件applicationContext.xml
注意:controller的注解应该不被spring扫描到
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 开启注解支持-->
<context:annotation-config/>
<!-- 扫描service包-->
<context:component-scan base-package="com.ssm.service"/>
</beans>
第一次书写spring的配置时idea会提示创建新的上下文,按以下步骤确认即可
2、写一个单元测试类来测试我们spring环境是否配置成功
package com.ssm.test;
import com.ssm.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
@Test
public void MyTest(){
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
UserService as = (UserService) context.getBean("userService");
as.getAll();
}
}
如下,说明搭建Spring的开发环境成功!
SpringMVC框架搭建
1、编写web.xml,配置springMVC的核心
<?xml version="1.0" encoding="UTF-8"?>
<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_4_0.xsd"
version="4.0">
<!-- web-app标签书写顺序-->
<!-- (icon?,display-name?,description?,distributable?,context-param*,-->
<!-- filter*,filter-mapping*,listener*,servlet*,servlet-mapping*,-->
<!-- session-config?,mime-mapping*,welcome-file-list?,error-page*,-->
<!-- taglib*,resource-env-ref*,resource-ref*,security-constraint*,-->
<!-- login-config?,security-role*,env-entry*,ejb-ref*,ejb-local-ref*)-->
<display-name>Archetype Created Web Application</display-name>
<!-- spring mvc核心:分发servlet -->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- spring mvc的配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC.xml</param-value>
</init-param>
<!-- 启动顺序,数字越小越先启动-->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 所有请求都由mvc处理-->
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
可以看到xml中有一行爆红
2、那是因为我们还没写springMVC的配置文件
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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
<!-- 只扫描controller层注解-->
<context:component-scan base-package="com.ssm.controller">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 开启注解支持-->
<mvc:annotation-driven/>
<!--静态资源默认servlet配置-->
<mvc:default-servlet-handler/>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
现在发现springMVC配置文件有报错
3、这是因为还没创建controller文件夹
报错解决后,我们正式进行controller的书写
4、编写 UserController
package com.ssm.controller;
import com.ssm.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("User")
public class UserController {
@RequestMapping("/getAll")
public String getAll(){
System.out.println("MVC配置成功");
return "list";
}
}
5、先把 index.jsp 编辑好
index.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<a href="User/getAll">测试SpringMVC查询</a>
</body>
</html>
6、接下来要创建跳转后的页面,list.jsp
list.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
这里是list页面
</body>
</html>
7、页面都写好后进行tomcat的部署
跳转成功
Spring整合SpringMVC的框架
整合成功的表现:在controller(SpringMVC)中能成功的调用service(Spring)对象中的方法。
要想在controller中调用service方法,就要注入service到controller中来,有service对象才可以调用service方法。方法是这样没有错,但是有一个问题,就是启动Tomcat之后试想一下,在web.xml中配置有前端控制器,web容器会帮我们加载springmvc.xml配置文件,在springmvc.xml配置文件中我们配置情况是只扫描controller,别的不扫,而spring.xml文件就从头到尾没有执行过,spring中的配置扫描自然也不会去扫描,就相当于没有将spring交到IOC容器当中去
这时候我们的监听器
就上场了
1、在web.xml中配置监听器,顺便解决乱码问题
web.xml最终版本:
<?xml version="1.0" encoding="UTF-8"?>
<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_4_0.xsd"
version="4.0">
<!-- web-app标签书写顺序-->
<!-- (icon?,display-name?,description?,distributable?,context-param*,-->
<!-- filter*,filter-mapping*,listener*,servlet*,servlet-mapping*,-->
<!-- session-config?,mime-mapping*,welcome-file-list?,error-page*,-->
<!-- taglib*,resource-env-ref*,resource-ref*,security-constraint*,-->
<!-- login-config?,security-role*,env-entry*,ejb-ref*,ejb-local-ref*)-->
<display-name>Archetype Created Web Application</display-name>
<!-- spring的配置文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!--解决中文乱码的过滤器,spring自带-->
<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>
<!-- 监听spring-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- spring mvc核心:分发servlet -->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- spring mvc的配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC.xml</param-value>
</init-param>
<!-- 启动顺序,数字越小越先启动-->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 所有请求都由mvc处理-->
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2、在UserController中调用service
UserController:
package com.ssm.controller;
import com.ssm.pojo.User;
import com.ssm.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@Controller
@RequestMapping("User")
public class UserController {
@Autowired
private UserService userService;//调用service
@RequestMapping("/getAll")
public String getAll(){
System.out.println("MVC配置成功");
List<User> list = userService.getAll();
return "list";
}
}
进行单元测试
package com.ssm.test;
import com.ssm.pojo.User;
import com.ssm.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
public class MyTest {
@Test
public void MyTest(){
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
UserService as = (UserService) context.getBean("userService");
List<User> list =as.getAll();
}
}
像上面一样点击跳转链接,控制台出现以下结果说明整合成功
MyBatis框架的搭建与整合
1、创建*Mapper.xml文件
这是用来声明dao接口方法使用什么sql语句去数据库中查询
也可以直接在接口上使用注解实现,但是sql语句的最好还是配置在xml文件中,对项目后期的维护和可读性有大大提高
UserDaoMapper.xml:
<?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="com.ssm.dao.UserDao">
<select id="getAll" resultType="com.ssm.pojo.User">
SELECT * FROM test
</select>
</mapper>
2、重新编写applicationContext.xml
1)配置连接池,连接到数据库
2)创建sqlsession
3)使*Mapper.xml文件生效
4)扫描Dao包下的bean注册到ioc
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 开启注解支持-->
<context:annotation-config/>
<!-- 扫描service包-->
<context:component-scan base-package="com.ssm.service"/>
<!-- 使用外部配置文件-->
<!-- <context:property-placeholder location="database.properties"/>-->
<!-- 配置数据库连接,使用c3p0连接池-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/MVClearnTest?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true"/>
<property name="user" value="root"/>
<property name="password" value="@Zz1269499710"/>
<!-- c3p0连接池的私有属性 -->
<property name="maxPoolSize" value="30"/>
<property name="minPoolSize" value="10"/>
<!-- 关闭连接后不自动commit -->
<property name="autoCommitOnClose" value="false"/>
<!-- 获取连接超时时间 -->
<property name="checkoutTimeout" value="10000"/>
<!-- 当获取连接失败重试次数 -->
<property name="acquireRetryAttempts" value="2"/>
</bean>
<!-- 配置sqlsession,创建SqlSessionFactoryBean-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 别名-->
<property name="typeAliasesPackage" value="com.ssm.pojo"/>
<!-- 和上面数据连接池的id对应-->
<property name="dataSource" ref="dataSource"/>
<!-- 使**mapper.xml生效-->
<property name="mapperLocations" value="classpath:mappers/*.xml"/>
</bean>
<!-- 扫描mapper包-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.ssm.dao"/>
</bean>
</beans>
3、重新编写UserServiceImpl调用dao接口
UserServiceImpl:
package com.ssm.service.Impl;
import com.ssm.dao.UserDao;
import com.ssm.pojo.User;
import com.ssm.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;//调用dao
@Override
public List<User> getAll() {
System.out.println("进入getAll()方法");
return userDao.getAll();
}
}
4、单元测试看看能不能查到数据
package com.ssm.test;
import com.ssm.pojo.User;
import com.ssm.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
public class MyTest {
@Test
public void MyTest(){
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
UserService as = (UserService) context.getBean("userService");
List<User> list =as.getAll();
System.out.println(list.toString());
}
}
成功读到数据
5、改写UserController
参数添加Model,并把查到的数据以json字符串的形式返回给前端
package com.ssm.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ssm.pojo.User;
import com.ssm.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@Controller
@RequestMapping("User")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/getAll")
public String getAll(Model model) throws JsonProcessingException {
System.out.println("MVC配置成功");
List<User> list = userService.getAll();
//jckson转化为json字符串,放入model-view中
model.addAttribute("list", new ObjectMapper().writeValueAsString(list));
return "list";
}
}
6、完善list.jsp页面
显示从后端拿到的json字符串,用js或者别的方式进行处理
list.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
这里是list页面
<%--拿出session中的json字符串--%>
${list}
</body>
</html>
基本整合完毕!!
spring的声明式事务
刚刚我们只是进行查询操作,但是真实业务中一个请求中有可能很多增删改查的复杂条件
所以我们必须配置事务,spring也为我们提供的事务的整合,这部分就是aop(面向切面编程)的实际使用
在applicationContext.xml的末尾添加事务的支持
<!-- 配置Spring框架声明式事务管理-->
<!-- 配置jdbc事务管理器-->
<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="add" propagation="REQUIRED"/>
<tx:method name="delete" propagation="REQUIRED"/>
<tx:method name="update" propagation="REQUIRED"/>
<tx:method name="search*" propagation="REQUIRED"/>
<tx:method name="get" read-only="true"/>
<tx:method name="*" propagation="REQUIRED"/>
<!-- <tx:method name="find*" read-only="true"/>-->
<!-- <tx:method name="*" isolation="DEFAULT"/>-->
</tx:attributes>
</tx:advice>
<!--配置AOP增强,配置aop织入事务-->
<aop:config>
<!-- 表示com.ssm.service.Impl下所有以ServiceImpl结尾的类方法都为织入点-->
<aop:pointcut id="txPointcut" expression="execution(* com.ssm.service.Impl.*ServiceImpl.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>
源码部分
整体结构
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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 开启注解支持-->
<context:annotation-config/>
<!-- 扫描service包-->
<context:component-scan base-package="com.ssm.service"/>
<!-- 使用外部配置文件-->
<!-- <context:property-placeholder location="database.properties"/>-->
<!-- 配置数据库连接,使用c3p0连接池-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/MVClearnTest?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true"/>
<property name="user" value="root"/>
<property name="password" value="@Zz1269499710"/>
<!-- c3p0连接池的私有属性 -->
<property name="maxPoolSize" value="30"/> <property name="minPoolSize" value="10"/>
<!-- 关闭连接后不自动commit -->
<property name="autoCommitOnClose" value="false"/>
<!-- 获取连接超时时间 -->
<property name="checkoutTimeout" value="10000"/>
<!-- 当获取连接失败重试次数 -->
<property name="acquireRetryAttempts" value="2"/>
</bean>
<!-- 配置sqlsession,创建SqlSessionFactoryBean-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 别名-->
<property name="typeAliasesPackage" value="com.ssm.pojo"/>
<!-- 和上面数据连接池的id对应-->
<property name="dataSource" ref="dataSource"/>
<!-- 使**mapper.xml生效-->
<property name="mapperLocations" value="classpath:mappers/*.xml"/>
</bean>
<!-- 扫描mapper包-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.ssm.dao"/>
</bean>
<!-- 配置Spring框架声明式事务管理-->
<!-- 配置jdbc事务管理器-->
<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="add" propagation="REQUIRED"/>
<tx:method name="delete" propagation="REQUIRED"/>
<tx:method name="update" propagation="REQUIRED"/>
<tx:method name="search*" propagation="REQUIRED"/>
<tx:method name="get" read-only="true"/>
<tx:method name="*" propagation="REQUIRED"/>
<!-- <tx:method name="find*" read-only="true"/>-->
<!-- <tx:method name="*" isolation="DEFAULT"/>-->
</tx:attributes>
</tx:advice>
<!--配置AOP增强,配置aop织入事务-->
<aop:config>
<!-- 表示com.ssm.service.Impl下所有以ServiceImpl结尾的类方法都为织入点-->
<aop:pointcut id="txPointcut" expression="execution(* com.ssm.service.Impl.*ServiceImpl.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>
</beans>
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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
<!-- 只扫描controller层注解-->
<context:component-scan base-package="com.ssm.controller">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 开启注解支持-->
<mvc:annotation-driven/>
<!--静态资源默认servlet配置-->
<mvc:default-servlet-handler/>
<!-- 视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<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_4_0.xsd"
version="4.0">
<!-- web-app标签书写顺序-->
<!-- (icon?,display-name?,description?,distributable?,context-param*,-->
<!-- filter*,filter-mapping*,listener*,servlet*,servlet-mapping*,-->
<!-- session-config?,mime-mapping*,welcome-file-list?,error-page*,-->
<!-- taglib*,resource-env-ref*,resource-ref*,security-constraint*,-->
<!-- login-config?,security-role*,env-entry*,ejb-ref*,ejb-local-ref*)-->
<display-name>Archetype Created Web Application</display-name>
<!-- spring的配置文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!--解决中文乱码的过滤器,spring自带-->
<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>
<!-- 监听spring-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- spring mvc核心:分发servlet -->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- spring mvc的配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC.xml</param-value>
</init-param>
<!-- 启动顺序,数字越小越先启动-->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 所有请求都由mvc处理-->
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
UserDaoMapper.xml
<?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="com.ssm.dao.UserDao">
<select id="getAll" resultType="com.ssm.pojo.User">
SELECT * FROM test
</select>
</mapper>
UserController
package com.ssm.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ssm.pojo.User;
import com.ssm.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@Controller
@RequestMapping("User")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/getAll")
public String getAll(Model model) throws JsonProcessingException {
System.out.println("MVC配置成功");
List<User> list = userService.getAll();
//jckson转化为json字符串,放入model-view中
model.addAttribute("list", new ObjectMapper().writeValueAsString(list));
return "list";
}
}
UserDao
package com.ssm.dao;
import com.ssm.pojo.User;
import java.util.List;
public interface UserDao {
List<User> getAll();//查询所有的用户
}
User
package com.ssm.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String name;
private Integer age;
private String email;
}
UserService
package com.ssm.service;
import com.ssm.pojo.User;
import java.util.List;
public interface UserService {
List<User> getAll();
}
UserServiceImpl
package com.ssm.service.Impl;
import com.ssm.dao.UserDao;
import com.ssm.pojo.User;
import com.ssm.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public List<User> getAll() {
System.out.println("进入getAll()方法");
return userDao.getAll();
}
}
页面
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<a href="User/getAll">测试SpringMVC查询</a>
</body>
</html>
list.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
这里是list页面
${list}
</body>
</html>