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"的值。

相關文章
相關標籤/搜索