SpringMVC中@ModelAttribute和@SessionAttributes注解的使用

 

1.@ModelAttribute注解的使用

@ModelAttribute注解在两种地方可使用java

从这里咱们能够看到该注解能够用在参数上也能够用在方法体上。session

如今咱们就来说解这两种方式。app

方式一,该注解用在方法体上:

在方法定义上使用 @ModelAttribute 注解:Spring MVC
在调用目标处理方法前,会先逐个调用在方法级上标注了
@ModelAttribute 的方法函数

@ModelAttribute("user1")
    public User getUser() {
        User user = new User();
        user.setId(1L);
        user.setName("jjjj");
        user.setPassword("iiiii");
        return user;

    }

@RequestMapping(value = "hello4", method = {RequestMethod.GET, RequestMethod.POST})
    public String doHello4(Map<String, Object> map) {
      System.out.println(map.get("user1"));
        return "success";
    }

当咱们发出/hello4.do这个请求时,SpringMvc 在执行该请求前会先逐个调用在方法级上标注了
@ModelAttribute 的方法,而后将该模型参数放入doHello4()函数的Map参数中。测试

如上执行结果以下:spa

方式二,该注解用在参数上:

SpringMVC先从模型数据中获取对象,再将请求参数绑定到对象中,再传入形参,而且数据模型中的对象会被覆盖code

@RequestMapping(value = "hello7")
    public ModelAndView doHello6(
            @ModelAttribute("user1")
                    User user, ModelAndView modelAndView) {

  
        System.out.println(user + ":hello7");
        modelAndView.setViewName("redirect:/hello/hello4.do");
        return modelAndView;
    }
@RequestMapping(value = "hello4", method = {RequestMethod.GET, RequestMethod.POST})
    public String doHello4(Map<String, Object> map) {

        System.out.println(map.get("user1"));

        return "success";
    }
 @ModelAttribute("user1")
    public User getUser() {
        User user = new User();
        user.setId(1L);
        user.setName("jjjj");
        user.setPassword("iiiii");
        return user;

    }

测试结果以下:对象

发出的请求信息以下:get

http://localhost:8080/SSMProjectMaven/hello/hello7.do?id=5&name=Lilyio

咱们只传入了id和name参数,可是在测试结果中咱们发现password也有值。

这说明了,SpringMVC会先在数据模型中寻找属性user1,把user1的属性赋值给user中,而后再将请求中的参数绑定到user中,若是请求参数中有的参数已经绑定到了user中,那么请求参数会覆盖掉user中已存在的值,而且user对象会被放入数据模型中覆盖掉原来的user1对象。也就是模型数据中的user1的优先级低于请求参数。

2.@SessionAttributes注解的使用

@SessionAttributes只能使用在类定义上。

若但愿在多个请求之间共用某个模型属性数据,则能够在
控制器类上标注一个 @SessionAttributes, Spring MVC
将在模型中对应的属性暂存到 HttpSession 中。
• @SessionAttributes 除了能够经过属性名指定须要放到会
话中的属性外,还能够经过模型属性的对象类型指定哪些
模型属性须要放到会话中
– @SessionAttributes(types=User.class) 会将隐含模型中全部类型
为 User.class 的属性添加到会话中。
– @SessionAttributes(value={“user1”, “user2”})
– @SessionAttributes(types={User.class, Dept.class})
– @SessionAttributes(value={“user1”, “user2”},
types={Dept.class})
 

@Controller
@RequestMapping("hello")
@SessionAttributes(value = {"user1"})
public class HelloAction {

 @RequestMapping(value = "hello4", method = {RequestMethod.GET, RequestMethod.POST})
    public String doHello4(Map<String, Object> map, HttpSession session) {

        System.out.println(map.get("user1"));
        System.out.println("session:" + session.getAttribute("user1"));

        return "success";
    }
@ModelAttribute("user1")
    public User getUser() {
        User user = new User();
        user.setId(1L);
        user.setName("jjjj");
        user.setPassword("iiiii");
        return user;

    }

}

SpringMVC会把数据模型中的user1对象放入session中,因此咱们在doHello4()中能够在session中取到user1对象。

测试结果以下:

注意一下这种状况:

@Controller
@RequestMapping("hello")
@SessionAttributes(value = {"user1", "msg"})
public class HelloAction {

   @RequestMapping(value = "hello7")
    public ModelAndView doHello6(
            @ModelAttribute("user1")
                    User user, ModelAndView modelAndView) {

        modelAndView.addObject("msg",
                user.getId() + ":" + user.getName() + ":" + user.getPassword() + ":" + user.getCars());
        System.out.println(user + ":hello7");

        modelAndView.setViewName("redirect:/hello/hello4.do");
        return modelAndView;
    }

 @RequestMapping(value = "hello4", method = {RequestMethod.GET, RequestMethod.POST})
    public String doHello4(Map<String, Object> map, HttpSession session) {

        System.out.println(map.get("user1"));
        System.out.println("session:" + session.getAttribute("user1"));
        System.out.println(map.get("msg"));
        System.out.println("session:" + session.getAttribute("msg"));
        return "success";
    }

 @ModelAttribute("user1")
    public User getUser() {
        User user = new User();
        user.setId(1L);
        user.setName("jjjj");
        user.setPassword("mmmmm");
        return user;

    }

}

测试结果以下:

这种状况代表了ModelAndView里的符合@SessionAttributes(value = {"user1", "msg"})这里面定义的value值,那么这个属性也会被放入到Session对象里。而且同时证实若是在一个方法里带有Map参数,SpringMVC不只会把标有@ModelAttribute注解的属性放入Map中,也会把@SessionAttributes(value = {"user1", "msg"})中的属性放入Map中。注意若是经过

session.setAttribute("xxx", "kkkk");

这种方法放入到session中的属性是不会被放入到map中的。

如下这段代码的测试证实了该结论:

@Controller
@RequestMapping("hello")
@SessionAttributes(value = {"user1", "msg"})
public class HelloAction {
   @RequestMapping(value = "hello4", method = {RequestMethod.GET, RequestMethod.POST})
    public String doHello4(Map<String, Object> map, HttpSession session) {

        System.out.println(map.get("user1"));
        System.out.println("session:" + session.getAttribute("user1"));
        System.out.println(map.get("msg"));
        System.out.println("session:" + session.getAttribute("msg"));
        System.out.println("map:" + map.get("xxx"));
        System.out.println("session:" + session.getAttribute("xxx"));
        return "success";
    }

 @RequestMapping(value = "hello7")
    public ModelAndView doHello6(
            @ModelAttribute("user1")
                    User user, ModelAndView modelAndView, HttpSession session) {

        session.setAttribute("xxx", "kkkk");

        modelAndView.addObject("msg",
                user.getId() + ":" + user.getName() + ":" + user.getPassword() + ":" + user.getCars());
        System.out.println(user + ":hello7");
        modelAndView.setViewName("redirect:/hello/hello4.do");
        return modelAndView;
    }
 @ModelAttribute("user1")
    public User getUser() {
        User user = new User();
        user.setId(1L);
        user.setName("jjjj");
        user.setPassword("mmmmm");
        return user;

    }
}

测试结果以下:

咱们能够看到从map里取不出"xxx"的值,而从session里咱们取出了“xxx”的值。

可是当咱们在

@SessionAttributes(value = {"user1", "msg", "xxx"})

这里添加上“xxx”这个值,再执行上述代码能够看到map中取出了"xxx"的值。

相关文章
相关标签/搜索