1.控制器的通知類
通知類的作用是在執行控制器方法前或後,補充一些邏輯來增加控制器的功能。
使用主要涉及到4個註解:
- @ControllerAdvice:作用在通知類上,表明該類是通知類。註解的方法basePackages指定控制器所在的包,annotations指定控制器所擁有的註解,滿足兩個條件任意一個都會被該通知類增加功能。
- @ExceptionHandler:標註在通知類的方法上,控制器方法執行時異常回進入該方法。
- @InitBinder:標註在通知類的方法上,在控制器方法執行前綁定參數轉換器和參數驗證器。
- @ModelAttribute:標註在通知類的方法上,,在控制器方法執行前增加參數。
2.例子
通知類:
package com.zyf.springMVC.mvccontrolleradvice;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.servlet.ModelAndView;
/** 控制器的通知類 */
// 指定掃描的包和指定有哪些註解的類(取符合二者的並集)
//@ControllerAdvice(basePackages = { "com.zyf.springMVC.mvccontrolleradvice" })
//@ControllerAdvice(annotations = { Controller.class })
@ControllerAdvice(basePackages = { "com.zyf.springMVC.mvccontrolleradvice" },annotations = { Controller.class })
public class MvcControllerAdvice {
// mvc異常處理,如果發送異常,進入該方法
@ExceptionHandler(Exception.class)
public String exception(Model model, Exception ecp) {
model.addAttribute("exception_message", ecp.getMessage());
ecp.printStackTrace();
// 一般設置爲共通error頁面
return "mvccontrolleradvice/mca2";
}
// 綁定格式化
@InitBinder
public void initBinder(WebDataBinder binder) {
CustomDateEditor customDateEditor = new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true);
// 註冊日期轉換器
binder.registerCustomEditor(Date.class, customDateEditor);
// 增加一個數據驗證器
// binder.addValidators(? extends Validator);
}
// 數據模型增加參數,在執行控制器方法前執行。三種數據模型用任意一個都可以。
@ModelAttribute
public void addAttribute(/*Model model,ModelAndView mav,*/ModelMap modelMap){
// model.addAttribute("project_name", "springmvc");
// mav.addObject("project_name", "springmvc");
modelMap.put("project_name", "springmvc");
}
}
控制器:
package com.zyf.springMVC.mvccontrolleradvice;
import java.util.Date;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/** 控制器通知測試 */
@Controller
@RequestMapping("/mvccontrolleradvice")
public class MvcAdviceController {
// http://localhost:8080/mvccontrolleradvice/mca1
@RequestMapping("/mca1")
public ModelAndView mca1(int id, ModelAndView mav) {
mav.setViewName("mvccontrolleradvice/mca1");
return mav;
}
// http://localhost:8080/mvccontrolleradvice/mca2?date=2019-10-01
@RequestMapping("/mca2")
public ModelAndView mca2(Date date, ModelAndView mav) {
mav.setViewName("mvccontrolleradvice/mca1");
return mav;
}
}
前臺頁面:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<!-- 加載Query文件-->
<script src="https://code.jquery.com/jquery-3.2.0.js">
</script>
<script type="text/javascript">
$(function() {
var params = {
id:15,
name:'zhangsan',
note:'',
sex:2
};
$("#button").click(function() {
$.post({
url : "/mvcsession/ms2",
// 此處需要告知傳遞參數類型爲JSON,不能缺少
contentType : "application/json",
// 將JSON轉化爲字符串傳遞
data : JSON.stringify(params),
// 成功後的方法
success : function(result) {
if(result != null){
// $("#button").attr(result.note);
// alert(result.note);
console.log(result);
}
}
});
});
});
</script>
</head>
<body>
<span>用戶名:</span><span th:text="${user}"></span><br/>
<span>工程名:</span><span th:text="${project_name}"></span><br/>
<button id="button">按鈕</button>
</body>
</html>
異常時前臺頁面:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>發生異常了!</h3>
<span th:text="${exception_message}"></span><br/>
</body>
</html>
如上:控制器MvcAdviceController的方法,將會被通知類MvcControllerAdvice增強。
3.測試
1.訪問http://localhost:8080/mvccontrolleradvice/mca1,該url不帶參數id,控制器方法接受不到int類型的id,會報錯。
結果:
出現的異常指定的錯誤頁面。
2.訪問http://localhost:8080/mvccontrolleradvice/mca2?date=2019-10-01&name=zhangsan
工程名是通知類增減加的參數。
且日期字符串被成功轉換爲Date類型。
github:https://github.com/zhangyangfei/SpringBootLearn.git中的springMVC工程。