ModelAttribute
作用:该注解是SpringMVC4.3版本以后新加入的。它可以用于修饰方法和参数。
- 出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。
- 出现在参数上,获取指定的数据给参数赋值。
属性:
- value:用于获取数据的key。key可以是POJO的属性名称,也可以是map结构的key。
应用场景:当表单提交数据不是完整的实体类数据时,报纸没有提交数据的字段使用数据库对象原来的数据。如:在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数据是肯定没有此字段的内容,一旦更新会把字段内容置为null,此时就可以使用此注解解决此问题。
使用示例:
<fieldset> <h1>ModelAttribute注解</h1> <a href="${pageContext.request.contextPath}/user/testModelAttribute?username=tony">test model attribute</a> </fieldset>
@ModelAttribute public void showModel(User user){ System.out.println("执行了showModel的方法:"+user.getUsername()); } @RequestMapping("/testModelAttribute") public String testModelAttribute(User user){ System.out.println("执行了控制器中的方法:"+user.getUsername()); return "success"; }
效果:

使用场景1:ModelAttribute修饰方法带返回值
需求:修改用户信息,要求用户的密码不能修改。
<fieldset> <h1>ModelAttribute注解 修饰带有返回值的方法</h1> <form method="post" action="${pageContext.request.contextPath}/user/ModifyUser"> username:<input type="text" name="username"><br> age:<input type="text" name="age"><br> <input type="submit" value="提交"> </form> </fieldset>
//模拟数据库查询 private User findUser(String username){ User user=new User(); user.setUsername(username); user.setPassword("123456"); user.setAge(20); return user; } @ModelAttribute public User showModel1(String username){ User user = findUser(username); System.out.println(user); return user; } @RequestMapping("/ModifyUser") public String ModifyUser(User user){ System.out.println(user); return "success"; }
效果:

使用场景2:ModelAttribute修饰方法不带返回值
需求:修改用户,要求用户的密码不能修改。
<fieldset> <h1>ModelAttribute注解 修饰不带返回值的方法</h1> <form method="post" action="${pageContext.request.contextPath}/user/ModifyUser"> username:<input type="text" name="username"><br> age:<input type="text" name="age"><br> <input type="submit" value="提交"> </form> </fieldset>
private User findUser(String username){ User user=new User(); user.setUsername(username); user.setPassword("123456"); user.setAge(20); return user; } @ModelAttribute public void showModel1(String username, Map<String,User> userMap){ User user = findUser(username); System.out.println(user); userMap.put("one",user); } @RequestMapping("/ModifyUser") public String ModifyUser(@ModelAttribute("one") User user){ System.out.println(user); return "success"; }
效果:

SessionAttribute
作用:用于多次执行控制器方法间的参数共享。
属性:
- value:用于指定存入的属性名称。
- type:用于指定存入的数据类型。
使用示例:
<fieldset> <h1>SessionAttribute注解</h1> <a href="${pageContext.request.contextPath}/SessionController/testPut">test put</a> <a href="${pageContext.request.contextPath}/SessionController/testGet">test get</a> <a href="${pageContext.request.contextPath}/SessionController/testClean">test clean</a> </fieldset>
@Controller @RequestMapping("/SessionController") @SessionAttributes(value = {"username","password","age"},types = {String.class,String.class,Integer.class}) public class SessionController { @RequestMapping("/testPut") public String testPut(Model model){ model.addAttribute("username","james"); model.addAttribute("password","123.abc"); model.addAttribute("age",12); System.out.println("存取数据"); return "success"; } @RequestMapping("/testGet") public String testGet(Model model){ System.out.println("获取数据:"+model.getAttribute("username")+";"+model.getAttribute("password")+";"+model.getAttribute("age")); return "success"; } @RequestMapping("/testClean") public String testClean(SessionStatus sessionStatus){ sessionStatus.setComplete(); System.out.println("数据清空"); return "success"; } }
效果:

posted on
浙公网安备 33010602011771号