@ModelAttribute可以用于修饰controller里的方法和参数,将被修饰的对象的值绑定到指定名称的属性里。
- 当修饰方法时,方法返回的值会在该controller里每个访问处理前绑定一次。
- 修饰参数时,如果想重定向或者转发到另一个方法后,还能在另一个方法中取得model里的参数值,可以使用两种方法(假设方法A里跳到方法B,要取得方法A里的参数):
- 将方法A里的参数放在RedirectAttributes里,使用重定向进到B方法,在方法B里获取参数。
- 使用forward转发到B,使用HttpServletRequest.getAttribute()方法获取参数。
测试代码:
@Controller
@RequestMapping("/")
public class ModelTest {
@Value("wj")
private String userName;
@ModelAttribute("sayHello")
public String runBeforeEachHandlerCalled() {
System.out.println("runBeforeEachHandlerCalled方法执行");
String sayHello = "Hello " + userName;
return sayHello;
}
@RequestMapping(value = "/home",method = RequestMethod.GET)
public String toHomePage() {
return "index";
}
@RequestMapping(value = "/handler1")
public String redirectMethod(@ModelAttribute("key2")String key2, RedirectAttributes attrbs) {
System.out.println("handler1里");
key2 = "key2value";
attrbs.addAttribute("redirectAttr1","redirectAttr1value");
attrbs.addFlashAttribute("redirectAttr2","redirectAttr2value");
// return "forward:/handler2";
// return new RedirectView("handler2");
return "redirect:handler2";
}
@RequestMapping(value = "/handler2")
public String redirectDestination(ModelMap map, String redirectAttr1,
@ModelAttribute("redirectAttr2")String redirectAttr2,
HttpServletRequest request, RedirectAttributes attrbs) {
System.out.println("handler2里");
System.out.println("ModelMap.key2值为:" + map.get("key2"));
System.out.println("redirect.request.key2:" + request.getAttribute("key2"));
System.out.println("redirect.request.redirectAttr1:" + request.getAttribute("redirectAttr1"));
System.out.println("redirectAttr1值为:" + redirectAttr1);
System.out.println("redirectAttr2值为:" + redirectAttr2);
map.put("key3","key3value");
attrbs.addAttribute("key4","key4value");
return "forward:handler3";
}
@RequestMapping(value = "/handler3")
public String forwardDestination(ModelMap map,@ModelAttribute("redirectAttr1") String redirectAttr1,
@ModelAttribute("redirectAttr2")String redirectAttr2,@ModelAttribute("key4")String key4,
HttpServletRequest request) {
System.out.println("handler3里");
System.out.println("ModelMap.key3值为:" + map.get("key3"));
System.out.println("forward.request.key3:" + request.getAttribute("key3"));
System.out.println("forward.request.redirectAttr1:" + request.getAttribute("redirectAttr1"));
System.out.println("redirectAttr1值为:" + redirectAttr1);
System.out.println("redirectAttr2值为:" + redirectAttr2);
System.out.println("key4值为:" + key4);
return "index";
}
}
index.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<body>
<h2>${sayHello}</h2>
</body>
</html>
输出结果:
runBeforeEachHandlerCalled方法执行
handler1里
runBeforeEachHandlerCalled方法执行
handler2里
ModelMap.key2值为:null
redirect.request.key2:null
redirect.request.redirectAttr1:null
redirectAttr1值为:redirectAttr1value
redirectAttr2值为:redirectAttr2value
runBeforeEachHandlerCalled方法执行
handler3里
ModelMap.key3值为:null
forward.request.key3:key3value
forward.request.redirectAttr1:null
redirectAttr1值为:redirectAttr1value
redirectAttr2值为:redirectAttr2value
key4值为: