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 2019-11-27 11:51  会飞的金鱼  阅读(144)  评论(0)    收藏  举报