SpringMVC(二)ModelAttribute和SessionAttribute

SpringMVC(二)ModelAttribute和SessionAttribute

ModelAttribute

1.1.1  使用说明作用:该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。出现在参数上,获取指定的数据给参数赋值。属性:value:用于获取数据的 key。key 可以是 POJO 的属性名称,也可以是 map 结构的 key。应用场景:当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。例如:我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数据是肯定没有此字段的内容,一旦更新会把该字段内容置为 null,此时就可以使用此注解解决问题。

ModelAttributeHander:

@Controller
@RequestMapping("/modelAttribute")
public class ModelAttributeHander {

   // 测试被modelattribute修饰的方法
   // 出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可
   //以修饰有具体返回值的方法。
   //出现在参数上,获取指定的数据给参数赋值
   @ModelAttribute
   public void showModel(User user) {
       System.out.println("执行modelattribute" + user.getUsername());
   }

   //@RequestMapping("/testModelAttribute")
   public String TestModelAttribute(User user) {
       System.out.println("执行控制器的方法" + user.getUsername());
       return "ok";
   }

   // 基于Map的应用场景示例1:
   // 修饰方法带返回值
   // 查询数据库信息
   @ModelAttribute
   public User showModel(String username) {
       // 模拟去数据库查询
       User user = findUserByName(username);
       System.out.println("执行了 showModel 方法 " + user);
       return user;
   }

   // 模拟修改方法
   @RequestMapping("/updateUser")
   public String update(User user) {
       System.out.println("控制器中处理请求的方法:修改用户:" + user);
       return "ok";
   }

   // 模拟去数据库查询
   public User findUserByName(String username) {
       User user = new User();
       user.setUsername(username);
       user.setAge(23);
       user.setPassword("111");
       return user;
   }

   // 基于Map的应用场景示例2
   // 修饰方法不带返回值
   // 查询数据库中用户信息
   @ModelAttribute
   public void showModel(String username, Map<String, User> map) {
       User user = findUserByName(username);
       System.out.println("执行了 showModel 方法 " + user);
       map.put("user", user);
   }

   // 模拟修改用户方法
   @RequestMapping("/updateUser2")
   public String testModelAttribute(@ModelAttribute("user") User user) {
       System.out.println("控制器中处理请求的方法:修改用户:" + user);
       return "ok";
   }
}
<!-- ModelAttribute 注解的基本使用 -->
<a href="modelAttribute/testModelAttribute?username=张三">testModelAttribute</a>
<hr/>
<!-- 基于Map的应用场景示例 1 :修饰方法带返回值
    修改用户信息 要求用户的密码不能修改 -->
<form action="modelAttribute/updateUser" method="post">
   用户名称:<input type="text" name="username"><br/>
   用户年龄:<input type="text" name="age"><br/>
   <input type="submit" value=" 保存 ">
</form>
<hr/>
<!-- 基于Map的应用场景示例 2 :修饰方法不带返回值
    修改用户信息 要求用户的密码不能修改 -->
<form action="modelAttribute/updateUser2" method="post">
   用户名称:<input type="text" name="username"><br/>
   用户年龄:<input type="text" name="age"><br/>
   <input type="submit" value=" 保存 ">
</form>

SessionAttributes

作用:用于多次执行控制器方法间的参数共享。属性:value:用于指定存入的属性名称type:用于指定存入的数据类型。

@Controller
@RequestMapping("/sessionAttribute")
@SessionAttributes(value = {"username","password"},types = {Integer.class})
public class SessionAttributeHander {
   // SessionAttributes
   // 作用:
   // 用于多次执行控制器方法间的参数共享。
   // 属性:
   // value:用于指定存入的属性名称
   // type:用于指定存入的数据类型。

   /**
    * 把数据存入 SessionAttribute
    * Model 是 spring 提供的一个接口,该接口有一个实现类 ExtendedModelMap
    * 该类继承了 ModelMap,而 ModelMap 就是 LinkedHashMap 子类
    */
   @RequestMapping("/put")
   public String put(Model model) {
       model.addAttribute("username", "陈琦");
       model.addAttribute("password", "111");
       model.addAttribute("age", 23);
       // 跳转之前将数据保存到 username、password 和 age 中,
       // 因为注解@SessionAttributes 中有这几个参数
       return "ok";
   }

   // 获取
   @RequestMapping("/get")
   public String get(ModelMap modelMap) {
       System.out.println(modelMap.get("username"));
       System.out.println(modelMap.get("password"));
       System.out.println(modelMap.get("age"));
       return "ok";
   }

   // 清除
   @RequestMapping("/rem")
   public String rem(SessionStatus sessionStatus) {
       sessionStatus.setComplete();
       return "ok";
   }
}
<hr/>
<a href="sessionAttribute/put">put SessionAttribute</a>
<a href="sessionAttribute/get">get SessionAttribute</a>
<a href="sessionAttribute/rem">rem SessionAttribute</a>
<hr/>


发表评论