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