1. SpringMVC中异常处理
1.1 各层处理异常原则即实现方法
1.1.1 各层处理异常原则
dao:不处理,抛异常;
service:不处理,抛异常;
controller/servlet:必须处理,否则错误信息将直接在浏览器显示给用户看。
1.1.2 异常处理实现方法
- 方法1:控制层的方法中写try…catch。异常处理信息一多,控制层方法就会十分冗余,而且每个控制器都有可能有异常,即每个控制器都要写;
- 方法2:使用异常过滤器,拦截所有请求。在过滤器中对异常进行处理;
- 方法3:使用框架自带的异常处理机制。
1.2 异常处理
- 使用异常处理器统一对dao、service、controller的异常进行处理
- SpringMVC提供了HandlerExceptionResolver异常处理器接口
1.3 SpringMVC异常处理实现
1.3.1 环境准备
1.3.1.1 创建项目、添加依赖
<?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>com.azure</groupId>
<artifactId>day57projects_SpringMVC_ssm</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--spring核心包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!--springmvc支持包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!--servlet支持包-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
</dependency>
<!--日志包-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</project>
1.3.1.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: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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--1.开启注解扫描-->
<context:component-scan base-package="com.azure"></context:component-scan>
<!--2.开启视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--3.开启mvc注解-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--4.放行资源-->
<mvc:resources mapping="/pages/**" location="/pages/"></mvc:resources>
<mvc:resources mapping="/js/**" location="/pages/"></mvc:resources>
</beans>
1.3.1.3 web.xml配置
<?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"
version="2.5">
<!--设置springMVC前端控制器-->
<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>
</web-app>
1.3.2 控制类模拟异常
@Controller
public class ExpController {
/**
* 模拟异常
*/
@RequestMapping("/save")
public String save(){
int i = 1/0;
return "success";
}
}
1.3.3 使用方法1手动捕获异常
1.3.3.1 error.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>error</title>
</head>
<body>
<h4>出错啦~系统繁忙~</h4>
</body>
</html>
1.3.3.2 控制类调整
@Controller
public class ExpController {
/**
* 模拟异常
*/
@RequestMapping("/save")
public String save(ModelMap modelMap){
try {
int i = 1/0;
} catch (Exception e) {
e.printStackTrace();
//将异常信息发送给error.jsp页面,error页面获取并显示错误信息
modelMap.addAttribute("errorMsg","出错啦~系统繁忙~");
return "error";
}
return "success";
}
}
1.3.3.3 总结
- 每个请求方法都要写异常代码,都要手动捕获异常处理,效率低。
1.3.4 使用方法3自定义异常处理器
- 使用SpringMVC提供的异常处理接口(HandlerExceptionResolver)实现类
1.3.4.1 设置自定义异常处理器
public class CustomerExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
//1.打印异常信息
e.printStackTrace();
//2.保存异常信息并跳转到错误页面
ModelAndView mv = new ModelAndView();
mv.addObject("errorMsg", "出错啦~系统繁忙~");
mv.setViewName("error");
return mv;
}
}
1.3.4.2 springMVC.xml配置异常处理器
- 除了在springMVC.xml配置,也可以在自定义异常处理器类上使用@Component注解创建对象
<!--5.配置异常处理器-->
<bean class="com.azure._01exception.CustomerExceptionResolver">
1.3.4.3 测试控制类
@Controller
public class HERController {
/**
* 模拟异常
*/
@RequestMapping("/saved")
public String saved(ModelMap modelMap) {
int i = 1 / 0;
return "success";
}
}
2. SpringMVC中的拦截器
2.1 拦截器的作用
- SpringMVC的处理器拦截类似于 的处理器拦截类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。
- 拦截器链:多个拦截器按一定的顺序连接成链,访问被拦截方法或字段时,按定义的顺序调用拦截器
2.1.1 拦截器与过滤器的异同
相同点:
- 都可以对请求进行拦截:过滤器拦截所有请求、拦截器只拦截控制器请求;
- 请求处理前可以做一些前期操作,在请求处理完毕后,也可以做后续的操作。
区别:
- 过滤器是servlet规范中的一部分,任何java web工程都可以使用;而拦截器只能在SpringMVC框架的工程内使用。
- 过滤器可以通过在url-pattern属性中配置
/*
实现拦截所有访问请求;而拦截器只会拦截访问控制器方法的请求,不会对网页资源(html、jsp等)进行拦截。 - 过滤器应用范围更广,拦截器只应用在SpringMVC项目。
2.2 自定义拦截器使用
2.2.1 编写控制器
@Controller
public class HIDemoController {
//构造函数
public HIDemo1Controller(){
System.out.println("1.实例UserController");
}
@RequestMapping("/interceptor")
public ModelAndView testInterceptor(){ //存入数据并跳转页面
System.out.println("4.执行控制器的testInterceptor方法");
ModelAndView mv = new ModelAndView();
mv.addObject("username", "JoJo");
mv.setViewName("success");
return mv;
}
}
2.2.2 编写拦截器类实现HandlerInterceptor接口
- 除了在springMVC.xml配置,也可以在自定义异常处理器类上使用@Component注解创建对象
public class HandlerInterceptor1 implements HandlerInterceptor {
//构造函数
public HandlerInterceptor1(){
System.out.println("2.实例拦截器1号");
}
/**
* 编写请求拦截方法,包含业务逻辑控制校验代码
* 返回值为true:放行,进入拦截器链的下一个拦截器,如果是最后一个,则执行控制器的方法
* 返回值为false:不放行,请求不被处理
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("3.拦截器1号的preHandle方法已执行");
return true;
}
/**
* 编写响应拦截方法,在请求处理完返回响应前调用
*/
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("5.拦截器1号的postHandle方法已执行");
}
/**
* 编辑资源清理方法,在preHandle返回true就会被调用
*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("6.拦截器1号的afterCompletion方法已执行");
}
}
2.2.3 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: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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--1.开启注解扫描-->
<context:component-scan base-package="com.azure"></context:component-scan>
<!--2.开启视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--3.开启mvc注解-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--4.放行资源
<mvc:resources mapping="/pages/**" location="/pages/"></mvc:resources>
<mvc:resources mapping="/js/**" location="/pages/"></mvc:resources>-->
<!--5.配置异常处理器
<bean class="com.azure._01exception.CustomerExceptionResolver"></bean>-->
<!--使用SpringMVC自定义异常处理器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" /><!-- 用于指定对拦截的 url -->
<!-- <mvc:exclude-mapping path=""/>用于指定排除的 url-->
<bean class="com.azure._02Interceptor.HandlerInterceptor1"></bean>
</mvc:interceptor>
</mvc:interceptors>
</beans>
- 注意,如果拦截器使用@Component注解,那么在springMVC.xml中就不用
<bean...HandlerInterceptor1"></bean>
,而是使用<ref bean="handlerInterceptor1"/>
2.3 多拦截器使用
2.3.1 新增一个拦截器2
@Component
public class HandlerInterceptor2 implements HandlerInterceptor {
//构造函数
public HandlerInterceptor2(){
System.out.println("实例拦截器2号");
}
/**
* 编写请求拦截方法,包含业务逻辑控制校验代码
* 返回值为true:放行,进入拦截器链的下一个拦截器,如果是最后一个,则执行控制器的方法
* 返回值为false:不放行,请求不被处理
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器2号的preHandle方法已执行");
return true;
}
/**
* 编写响应拦截方法,在请求处理完返回响应前调用
*/
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("拦截器2号的postHandle方法已执行");
}
/**
* 编辑资源清理方法,在preHandle返回true就会被调用
*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("拦截器2号的afterCompletion方法已执行");
}
}
2.3.2 springMVC.xml配置拦截器2
<!--使用SpringMVC自定义异常处理器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" /><!-- 用于指定对拦截的 url -->
<!-- <mvc:exclude-mapping path=""/>用于指定排除的 url-->
<bean class="com.azure._02Interceptor.HandlerInterceptor1"></bean>
</mvc:interceptor>
<!--配置第二个拦截器-->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<ref bean="handlerInterceptor2"></ref>
</mvc:interceptor>
</mvc:interceptors>
2.3.3 运行结果
2.3.3.1 服务器启动
2.3.3.2 请求访问
3. SSM整合(重点*3)
3.1 整合原则
-
xml和注解组合使用
-
配置方式的选择:
- Spring:自己编写的类使用注解,jar包的类用xml,事务用xml;
- SpringMVC:控制器配置用注解,使用xml有:扫描包、视图解析器开启、注解支持开启、静态资源不过滤等;
- mybatis:SqlMapConfig.xml整合到spring配置文件中,接口映射使用注解配置
-
Spring整合Mybatis关键点:把Mybatis的SqlSessionFactory对象的创建交给Spring管理。
3.2 整合步骤
- 构建单独Spring环境
- 构建单独SpringMVC环境
- Spring与SpringMVC整合
- 构建单独Mybatis环境
- Spring整合Mybatis
- ssm 整合,页面,测试
- 为确保整合成功,每步都会单独测试检查是否有误
3.3 构建Spring环境
3.3.1 创建项目,添加依赖
<?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>com.azure</groupId>
<artifactId>day57projects_SSM</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<!--spring核心支持包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!--aspectj支持包-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
<!--springmvc支持包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!--spring事务支持包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!--spring Jdbc支持-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!--spring整合mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!--spring的junit支持包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency>
<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!--mybatis支持包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--servlet\jsp支持包-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
</dependency>
<!--jstl支持包-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--日志包-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</project>
3.3.2 spring配置文件
- 创建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:context="http://www.springframework.org/schema/context"
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">
<!--1.开启service层注解扫描,避免与其他层的注解扫描重合-->
<context:component-scan base-package="com.azure.service"></context:component-scan>
</beans>
3.3.3 创建实体类
public class Account {
private int accountId;
private int uid;
private double money;
...
}
3.3.4 service层
3.3.4.1 service层接口
public interface IAccountService {
/*实现查询功能*/
List<Account> findAll();
}
3.3.4.2 service接口实现类
@Service
public class AccountServiceImpl implements IAccountService {
@Override
public List<Account> findAll() {
System.out.println("测试。。。调用service的findAll查询全部账户");
return null;
}
}
3.3.5 测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml") //指定容器类
public class TestDemo01 {
//注入service
@Autowired
private IAccountService accountService;
@Test
public void find(){
accountService.findAll();
}
}
3.4 构建单独SpringMVC环境
3.4.1 配置web.xml
<?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"
version="2.5">
<!--1.配置前端控制器-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--加载springMVC配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!--2.配置拦截规则-->
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
3.4.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: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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--1.开启controller注解扫描-->
<context:component-scan base-package="com.azure.controller"/>
<!--2.配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--3.开启注解支持-->
<mvc:annotation-driven></mvc:annotation-driven>
</beans>
3.4.3 控制类
@Controller
public class AccountController {
@RequestMapping("/findAll")
public ModelAndView findAll(HttpServletRequest request) {
ModelAndView mv = new ModelAndView();
mv.addObject("name", "JoJo");
mv.setViewName("success");
return mv;
}
}
3.4.4 测试页面
- 增加success.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>success</title>
</head>
<body>
success~~
</body>
</html>
3.5 Spring整合SpringMVC
- 思路:
- 1、SpringMVC负责controller层,需要注入service
- 2、在web.xml中加载applicationContext.xml配置
3.5.1 控制器类注入service
@Controller
@RequestMapping("/account") //设置第一级目录,方便区分findAll方法
public class AccountController {
//注入service
@Autowired
private IAccountService accountService;
@RequestMapping("/findAll")
public ModelAndView findAll(HttpServletRequest request) {
List<Account> list = accountService.findAll();
ModelAndView mv = new ModelAndView();
mv.addObject("list", list);
mv.setViewName("success");
return mv;
}
}
3.5.2 在web.xml配置ServletContext的监听器加载applicationContext.xml
- 服务器启动的时候会创建ServletContext,通过监听ServletContext,在创建ServletContext时加载配置,就能实现服务器启动后加载配置。
<!--0.配置ServletContext监听器,在服务器启动时加载配置文件-->
<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>
3.6 配置单独mybatis环境
3.6.1 配置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>
<!--加载数据库配置文件-->
<properties resource="jdbc.properties"/>
<!--配置数据库连接池-->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--配置映射文件-->
<mappers>
<package name="com.azure.dao"></package>
</mappers>
</configuration>
3.6.2 dao层
public interface IAccountDao {
/**
* 查询功能
*/
@Select("select * from account") //使用注解方式实现查询
List<Account> findAll();
}
3.6.3 测试类
public class TestDemo02 {
@Test
public void findAll() throws IOException {
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(is);
SqlSession session = factory.openSession();
//创建Dao实现类
IAccountDao accountDao = session.getMapper(IAccountDao.class);
List<Account> list = accountDao.findAll();
System.out.println(list);
session.close();
is.close();
}
}
3.7 Spring整合mybatis
思路:
- 将SqlMapConfig.xml整合到applicationContext.xml中,包括
- 加载数据库配置文件
- 配置数据库连接池
- 增加Spring声明式事务;
- 将SqlSessionFactoryBean交由Spring创建,配置SqlSessionFactoryBean
- 开启dao接口扫描
- service注入dao
3.7.1 applicationContext.xml整合SqlMapConfig.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:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
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/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--1.开启service层注解扫描,避免与其他层的注解扫描重合-->
<context:component-scan base-package="com.azure.service"></context:component-scan>
<!--2.加载数据库配置文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--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.Spring整合mybatis的关键:配置SqlSessionFactoryBean-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--5.开启包扫描器,扫描dao接口所在包,对包下所有dao类自动生成代理-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.azure.dao"/>
</bean>
<!--6.Spring声明式事务配置-->
<!--6.1 事务管理器-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--6.2 事务通知规则-->
<tx:advice id="txadvice" transaction-manager="txManager">
<!--配置查询的事务,事务可以有也可以没有,只读-->
<tx:attributes>
<tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
<!--配置增删改的事务,事务必须有,读写-->
<tx:method name="*" propagation="REQUIRED" read-only="false"/>
</tx:attributes>
</tx:advice>
<!--6.3 AOP切面设置-->
<aop:config>
<!--设置切面表达式-->
<aop:pointcut id="pt" expression="execution(* com.azure.service.*.*(..))"></aop:pointcut>
</aop:config>
</beans>
3.7.2 service注入dao
@Service
public class AccountServiceImpl implements IAccountService {
//注入Dao
@Autowired
private IAccountDao accountDao;
@Override
public List<Account> findAll() {
return accountDao.findAll();
}
}
3.7.3 测试
分两部分:
- 测试service在整合后是否有误;
- 从controller开始走完整的流程,看最终页面是否正常返回数据
3.7.3.1 service测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml") //指定容器类
public class TestDemo03 {
//注入service
@Autowired
private IAccountService accountService;
@Test
public void find(){
List<Account> accounts = accountService.findAll();
System.out.println(accounts);
}
}
3.7.3.2 启动服务器测试
- 配置返回的页面,将获取的结果打印
success.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>success</title>
</head>
<body>
<h3>查询所有账户</h3>
<h3>success~~</h3>
<table border="1px" cellpadding="3px" cellspacing="0" style="color: gold">
<tbody>
<tr>
<th>序号</th>
<th>账号编号</th>
<th>用户编号</th>
<th>账户余额</th>
</tr>
<%--遍历结果获取每个元素并打印--%>
<%--varStatus相当于遍历的i--%>
<c:forEach var="account" items="${list}" varStatus="num">
<tr>
<td>${num.count}</td>
<td>${account.accountId}</td>
<td>${account.uid}</td>
<td>${account.money}</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>