工程代码

github: https://github.com/dengjili/springmvc

@ControllerAdvice

当执行控制器priv.dengjl.controller下面的类时候,下面的方法将被代理,前置aop、或后置aop

// 控制器里的aop,拦截指定包
@ControllerAdvice(basePackages = { "priv.dengjl.controller" })
public class AdviceController {

	@InitBinder
	public void initBinder(WebDataBinder binder) {
		// 运行为空
		binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), false));
	}

	@ExceptionHandler(value = {Exception.class})
	public ModelAndView index() {
		ModelAndView mv = new ModelAndView();
		mv.setViewName("exception");
		return mv;
	}
}

@InitBinder

为priv.dengjl.controller包下的控制器注册日期转换

// 控制器里的aop,拦截指定包
@ControllerAdvice(basePackages = { "priv.dengjl.controller" })
public class AdviceController {

	@InitBinder
	public void initBinder(WebDataBinder binder) {
		// 运行为空
		binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), false));
	}
}

控制器测试

	@RequestMapping("/format")
	public ModelAndView format(Date date, @NumberFormat(pattern = "#,###.00") Double amount) {
		logger.debug("date==> {}", date);
		logger.debug("amount==> {}", amount);

		ModelAndView mv = new ModelAndView();
		mv.setViewName("formatter");
		return mv;
	}

@ExceptionHandler

为priv.dengjl.controller包下的控制器添加异常处理

// 控制器里的aop,拦截指定包
@ControllerAdvice(basePackages = { "priv.dengjl.controller" })
public class AdviceController {

	@ExceptionHandler(value = {Exception.class})
	public ModelAndView index() {
		ModelAndView mv = new ModelAndView();
		mv.setViewName("exception");
		return mv;
	}
}

控制器测试

	@RequestMapping("/getException")
	public ModelAndView getException() throws Exception {
		if (true) {
			throw new Exception("test");
		}
		
		ModelAndView mv = new ModelAndView();
		mv.setViewName("advice");
		return mv;
	}

@ModelAttribute入门

http://localhost:8080/springmvc/advice/getRequestAttribute2

在进入控制器之前,执行ModelAttribute注解下面的方法,并临时存储数据

	// 在进入控制器之前执行
	@ModelAttribute("beanParam")
	public BeanParam testRequest2() {
		// 设置请求属性
		BeanParam param = new BeanParam();
		param.setName("张三22");
		param.setNote("test22");
		return param;
	}
	
	// @ModelAttribute读取
	@RequestMapping("/getRequestAttribute2")
	public ModelAndView getRequestAttribute2(@ModelAttribute("beanParam") BeanParam param) {
		logger.debug("name: {}", param.getName());
		
		ModelAndView mv = new ModelAndView();
		mv.setViewName("advice");
		return mv;
	}

@ModelAttribute与重定向

请求地址:http://localhost:8080/springmvc/advice/testRedirect

	@RequestMapping("/testRedirect")
	public String testRedirect(RedirectAttributes ra) {
		BeanParam param = new BeanParam();
		param.setName("张三");
		param.setNote("test");
		
		// 数据域
		ra.addFlashAttribute("param", param);
		return "redirect:./showPojo";
	}

	// 处理数据模型,如果返回对象,则对象会保持在ModelAttribute
	// 需要使用@ModelAttribute来接收参数
	@RequestMapping("/showPojo")
	public ModelAndView showPojo(@ModelAttribute("param") BeanParam param ) {
		logger.debug("name: {}", param.getName());
		
		ModelAndView mv = new ModelAndView();
		mv.setViewName("advice");
		return mv;
	}
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐