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 攔截器與過濾器的異同
相同點:
- 都可以對請求進行攔截:過濾器攔截所有請求、攔截器只攔截控制器請求;
- 請求處理前可以做一些前期操作,在請求處理完畢後,也可以做後續的操作。
區別:
- 過濾器是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>
相關推薦
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語言如何進行異常處理,關鍵字:throws、throw、try、catch、finally分別代表什麼意義?在try塊中可以丟擲異常嗎?
try塊表示程式正常的業務執行程式碼。如果程式在執行try塊的程式碼時出現了“非預期”情況,JVM將會生成一個異常物件,這個異常物件將會被後面相應的catch塊捕獲。
catch塊表示一個異常捕獲塊。
SSM專案統一異常處理方案
java開發說明
專案中的異常處理是專案開發中的重要部分,合理的異常處理方案,對於提高專案開發效率,影響較大。
SSM專案中採用如下方案進行異常處理:
1 對於DAO層丟擲的sql異常,已經由myBatis包裝成了執行時異常,不需要再進行包裝
2 對於S
Java語言如何進行異常處理,關鍵字:throws、throw、try、catch、finally分別如何使用?
需要學習資料的+微信公眾號 學習資源後臺找我
本人比較忙 我看到了會在後臺幫你,謝謝關注啦
Java通過面向物件的方法進行異常處理,把各種不同的異常進行分類,並提供了良好的介面。
在Jav