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>