1. 程式人生 > >Java框架-SpringMVC統一異常處理、ssm框架整合

Java框架-SpringMVC統一異常處理、ssm框架整合

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 攔截器與過濾器的異同

相同點:

  1. 都可以對請求進行攔截:過濾器攔截所有請求、攔截器只攔截控制器請求;
  2. 請求處理前可以做一些前期操作,在請求處理完畢後,也可以做後續的操作。

區別:

  1. 過濾器是servlet規範中的一部分,任何java web工程都可以使用;而攔截器只能在SpringMVC框架的工程內使用。
  2. 過濾器可以通過在url-pattern屬性中配置/*實現攔截所有訪問請求;而攔截器只會攔截訪問控制器方法的請求,不會對網頁資源(html、jsp等)進行攔截。
  3. 過濾器應用範圍更廣,攔截器只應用在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和註解組合使用

  • 配置方式的選擇:

    1. Spring:自己編寫的類使用註解,jar包的類用xml,事務用xml;
    2. SpringMVC:控制器配置用註解,使用xml有:掃描包、檢視解析器開啟、註解支援開啟、靜態資源不過濾等;
    3. mybatis:SqlMapConfig.xml整合到spring配置檔案中,介面對映使用註解配置
  • Spring整合Mybatis關鍵點:把Mybatis的SqlSessionFactory物件的建立交給Spring管理。

3.2 整合步驟

  1. 構建單獨Spring環境
  2. 構建單獨SpringMVC環境
  3. Spring與SpringMVC整合
  4. 構建單獨Mybatis環境
  5. Spring整合Mybatis
  6. 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>
        
            
           

相關推薦

Java框架-SpringMVC統一異常處理ssm框架整合

1. SpringMVC中異常處理 1.1 各層處理異常原則即實現方法 1.1.1 各層處理異常原則 dao:不處理,拋異常; service:不處理,拋異常; controller/servlet:必須處理,否則錯誤資訊將直接在瀏覽器顯示給使用者看。 1.1.2 異

SpringMVC框架08—統一異常處理

value 視圖解析 業務 完全 style lte 實現類 png div 前言 在Spring MVC 應用的開發中,不管是對底層數據庫操作,還是業務層或控制層操作,都會不可避免地遇到各種可預知的、不可預知的異常需要處理。如果每個過程都單獨處理異常,那麽系統的代碼耦合

SpringMVC 統一異常處理

Java1 描述在J2EE項目的開發中,不管是對底層的數據庫操作過程,還是業務層的處理過程,還是控制層的處理過程,都不可避免會遇到各種可預知的、不可預知的異常需要處理。每個過程都單獨處理異常,系統的代碼耦合度高,工作量大且不好統一,維護的工作量也很大。那麽,能不能將所有類型的異常處理從各處理過程解耦出來,這樣

springMVC統一異常處理

import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.we

springMVC 統一異常處理的一種方式

後端發生異常的時候,如果不處理,返回前段的會是printStackTrace()打出來的結果,會洩露我們伺服器程式碼資訊,可能會被利用攻擊,所以需要一個統一的異常處理機制。 解決方案 @ExceptionHandler 和@ControllerAdvice 註解

SpringMVC統一異常處理(返回異常資料而不是跳轉到某個頁面的方法)

關於SpringMVC統一異常處理的問題,網搜一大把。網上搜的關於如何進行統一異常處理不外乎如下三種方式: Spring MVC處理異常有3種方式: (1) 使用Spring MVC提供的簡單異常處理器SimpleMappingExceptionResol

java基礎 第十二章(異常處理工具類集合)

重寫 trac com int 出現異常 sta 順序存儲 空指針異常 處理 一、異常處理 1.兩種異常: (1)程序員自身問題(運行時異常) (2)外界問題(可控異常) 2.兩種異常的詳細說明 (1)運行時異常

java 工作流項目源碼 SSM 框架 Activiti-master springmvc SSM

腳本 exce ssp freemaker org bottom 公眾 min sql語句 博文來源:http://www.fhadmin.org/webnewsdetail1.html工作流模塊---------------------------------------

Java中的異常處理泛型!圖文講解

  1.異常: 非正常的情況,改變程式的執行流程 堆疊提示順序 Throwable Error 錯誤用程式碼處理不了 Exception異常 用程式碼可以處理執行時異常:RuntimeExcept

JAVA關鍵字 四(包相關訪問控制異常處理變數引用保留字)

本篇關鍵字:import    package    private    protected   public    try    catch&nb

基於spring框架java開發中的異常處理

在springmvc框架的中異常處理的方式有兩種: 1,在控制器中使用@ExceptionHandler(xxxException.class)註解修飾一個方法,該註解能夠處理通一個控制器類中的丟擲的xxxExcepiton異常。 使用控制器通知註解@ControllerAdvice

20.Java語言IO流IO流異常處理以及Properties

IO流 I :Input(輸入)資料從外部流入程式(硬碟到記憶體) O:Output(輸出)資料從程式流出外部(記憶體到硬碟) 流:類似於水流—有方向,線性 作用: 可以讀寫檔案的內容 體系: A).位元組流:按“位元組”讀寫檔案。可以操作任何型別檔案    

Java學習筆記--異常處理File類IO流介紹

異常處理 格式: try { 可能出現問題的程式碼; }catch(異常類名 變數名) {//catch語句可以有多個,子類異常放前面,父類異常放後面 針對問題的處理; }finally { 釋放資源; } jdk7新特性 t

SpringBoot表單驗證AOP處理請求和統一異常處理

表單驗證 假如表單引數很多,用@RequestParam方式就不合適了,引數中可直接使用@Valid Girl gir /** * 新增一個女生 * @return */ @PostMapping(value = "/a

SpringMVC的學習(六)——SpringMVC中的統一異常處理

我們知道,系統中異常包括:編譯時異常和執行時異常RuntimeException,前者通過捕獲異常從而獲取異常資訊,後者主要通過規範程式碼開發、測試通過手段減少執行時異常的發生。在開發中,不管是dao層、service層還是controller層,都有可能丟擲異常,在spri

java web 之路:springmvc全域性異常處理

通常出現異常的處理方法:dao拋給server、server拋給controller、controller拋給前端控制,前端控制器呼叫全域性異常處理器。 全域性異常處理器處理思路: 解析出異常型別        如果是已知的異常,直接取出異常資訊,在錯誤頁頁面展示  

Java筆記(三)內部類異常處理型別限定

今天我們先說一下內部類 內部類,就是類大的內部定義一個不與外部類同名的新類。在外部類內部使用內部類方式與普通類一樣。若要在其他位置使用,類名前要冠以外部類的名字,包括用new建立內部類的時候,用Person.new.Student()來建立。 大家都知道,在Java中是沒有指標的,那麼指

Java語言如何進行異常處理,關鍵字:throwsthrowtrycatchfinally分別代表什麼意義?在try塊中可以丟擲異常嗎?

try塊表示程式正常的業務執行程式碼。如果程式在執行try塊的程式碼時出現了“非預期”情況,JVM將會生成一個異常物件,這個異常物件將會被後面相應的catch塊捕獲。 catch塊表示一個異常捕獲塊。

SSM專案統一異常處理方案

java開發說明 專案中的異常處理是專案開發中的重要部分,合理的異常處理方案,對於提高專案開發效率,影響較大。 SSM專案中採用如下方案進行異常處理: 1 對於DAO層丟擲的sql異常,已經由myBatis包裝成了執行時異常,不需要再進行包裝 2 對於S

Java語言如何進行異常處理,關鍵字:throwsthrowtrycatchfinally分別如何使用?

需要學習資料的+微信公眾號 學習資源後臺找我 本人比較忙 我看到了會在後臺幫你,謝謝關注啦 Java通過面向物件的方法進行異常處理,把各種不同的異常進行分類,並提供了良好的介面。 在Jav