SpringBoot學習5.14-SpringMVC-控制器類的通知

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工程。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章