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

 

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