@ModelAttribute可以用于修饰controller里的方法和参数,将被修饰的对象的值绑定到指定名称的属性里。
当修饰方法时,方法返回的值会在该controller里每个访问处理前绑定一次。
修饰参数时,如果想重定向或者转发到另一个方法后,还能在另一个方法中取得model里的参数值,可以使用两种方法(假设方法A里跳到方法B,要取得方法A里的参数):

1.将方法A里的参数放在RedirectAttributes里,使用重定向进到B方法,在方法B里获取参数。

2.使用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值为:

最新文章

  1. Lintcode 372. O(1)时间复杂度删除链表节点
  2. JPA(Hibernate) @OneToMany 两种例子
  3. 第二章 时间控件(DateTime Picker)
  4. Openwrt 无法上40MHZ带宽
  5. U盘安装CentOS7的最终解决方案
  6. 【转】./a.out 2&gt;&amp;1 &gt; outfile
  7. el 表达式遍历Map
  8. [bzoj2286][Sdoi 2011]消耗战
  9. cn microsoft hyper-v server 2016 安装笔记
  10. JavaJ2EE相关知识整理
  11. django之路由层
  12. “Nested exception: 前言中不允许有内容&quot;错误处理
  13. [PHP]误读支付宝接口可能引发的乌龙
  14. luogu 1064 金明的预算方案
  15. 企业级iptables防火墙实战
  16. ELK(上)
  17. 【php 之获得当前日期以及比较日期大小】
  18. 2017秋软工 - 本周PSP
  19. CSS格式化 CSS代码压缩工具
  20. Expression Blend实例中文教程(7) - 动画基础快速入门Animation

热门文章

  1. TinyURL
  2. 谈谈WPF中的CollectionView与CollectionViewSource
  3. python语言的优缺点
  4. 动态创建OATipBean
  5. 同一sql表,在页面展示多级菜单
  6. windows下mysql多实例安装
  7. halcon之屌炸天的变形匹配(1)
  8. Linux:关于设置PS1提示符输入长命令格式出现的问题及解决
  9. ADS1.2使用
  10. URL 生成带文字二维码