日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

springmvc的ModelAttribute注解

發布時間:2025/3/17 c/c++ 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springmvc的ModelAttribute注解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

先看一個沒有使用@ModelAttribute的Controller方法.

?

[java]?view plaincopy
  • @RequestMapping("/save")??
  • public?String?save(User?user)?{??
  • ????user.setUsername("U?love?me");??
  • ????userService.save(user);??
  • ????return?"result";??
  • }??
  • 其中User包含id和username兩個私有屬性,含有公共setter和getter方法.
    執行此方法時會將key為"user"(注意:這里即使參數名稱是user1,key一樣還是"user"),value為user的對象加入到model.在jsp頁面可以通過${user.id}和${user.name}得到值的,即上面方法和下面方法是相當的.

    [java]?view plaincopy
  • @RequestMapping("/save")??
  • public?String?save(Model?model,int?id,String?username)?{??
  • ????User?user=new?User();??
  • ????//這里是通過反射從request里面拿值再set到user??
  • ????user.setId(id);??
  • ????user.setUsername(username);??
  • ????model.addAttribute("user",user);??
  • ??????
  • ????user.setUsername("U?love?me");??
  • ????userService.save(user);??
  • ????return?"result";??
  • }??
  • 一.下面再來看看@ModelAttribute的基本用法.
    1.在方法上使用@ModelAttribute

    [java]?view plaincopy
  • @ModelAttribute("user1")??
  • public?User?addUser(User?user)?{??
  • ????return?new?User(520,"I?love?U");??
  • }??
  • 假設此方法是寫在UserController內,那么執行UserController內帶有@RequestMapping的方法之前,都會先執行此addUser方法.并且執行addUser過程中會添加兩個對象到model,先將key為"user"的對象(由addUser方法的User user引起的),再添加key為"user1"的對象(由注解@ModelAttribute("user1")引起的).

    ?

    2.在方法參數上使用@ModelAttribute.

    ?

    [java]?view plaincopy
  • @RequestMapping("/save")??
  • public?String?save(@ModelAttribute?User?user)?{??
  • ????user.setUsername("U?love?me");??
  • ????userService.save(user);??
  • ????return?"result";??
  • }??
  • 此方法會先從model去獲取key為"user"的對象,如果獲取不到會通過反射實例化一個User對象,再從request里面拿值set到這個對象,然后把這個User對象添加到model(其中key為"user").
    使用了@ModelAttribute可修改這個key,不一定是"user",此情況下,用與不用@ModelAttribute沒有區別.


    3.再來看看在方法和方法參數上結合使用@ModelAttribute,即上面兩步的兩個方法都添加UserController,如下:

    [java]?view plaincopy
  • @ModelAttribute("user1")??
  • public?User?addUser(User?user)?{??
  • ????return?new?User(520,"I?love?U");??
  • }??
  • @RequestMapping("/save")??
  • public?String?save(@ModelAttribute?User?user)?{??
  • ????user.setUsername("U?love?me");??
  • ????userService.save(user);??
  • ????return?"result";??
  • }??
  • 假設要執行保存用戶操作,根據一分析可知,先執行完會產生兩個User類型的對象(一個key是"user",另一個key是"user1")添加到model,再執行save方法,此時會先從model去找key為"user"的對象,能找到再從request取值set到這個User對象.最后返回到jsp頁面,model里也只有兩個User類型對象.
    再來個小小假設,將上面@ModelAttribute("user1")的user1改為user,其它不變.雖然執行了addUser方法,那么執行到save方法內,user對象的字段值還是來源于請求,最后返回到jsp頁面,model里也只有一個User類型對象.


    4.另類:

    [java]?view plaincopy
  • @ModelAttribute??
  • @RequestMapping("/save")??
  • public?String?save(@ModelAttribute?User?user)?{??
  • ????user.setUsername("U?love?me");??
  • ????userService.save(user);??
  • ????return?"result";??
  • }??
  • 此種情況,會添加一個key為"user"的User對象到model,還會添加一個key為"string",value為"result"的對象到model,而視圖名稱則變為了"save"而不是"result".相信一般開發者都不會這樣用.

    ?

    二.下面再看看結合@SessionAttributes的用法.

    1.先看看這段代碼

    ?

    [java]?view plaincopy
  • @Controller??
  • @RequestMapping("user")??
  • @SessionAttributes("test")??
  • public?class?UserController?{??
  • ????@RequestMapping(value?=?"test1")??
  • ????public?String?test1(Map<String,?Object>?model,?SessionStatus?sessionStatus)?{??
  • ????????model.put("test","something");??
  • ????????//sessionStatus.setComplete();??
  • ????????return?"user/list";??
  • ????}??
  • ??
  • ????@RequestMapping(value?=?"test2")??
  • ????public?String?test2(Map<String,?>??model)?{??
  • ????????Object?test?=?model.get("test");??
  • ????????System.out.println(test);??
  • ????????return?"user/list";??
  • ????}??
  • }??
  • 在類級別上使用@SessionAttributes("test"),它的作用是在controller共享 model 屬性,直到調用org.springframework.web.bind.support.SessionStatus#setComplete會清除此session值.否則長期保留(session過期,這個值也不再保留).因此先調用/user/test1,再調用/user/test2.在test2方法能得到test1方法put進去的值.當移除上面的注解,因為屬性為test的session也被清除了,所以test2方法會得到是null.

    ?

    2.再看結合@ModelAttribute的用法.

    ?

    [java]?view plaincopy
  • @Controller??
  • @RequestMapping("user")??
  • @SessionAttributes("test")??
  • public?class?UserController?{??
  • ????@RequestMapping(value?=?"test1")??
  • ????public?String?test1(HttpServletRequest?request)?{??
  • ????????User?user?=?new?User("xiejx618");??
  • ????????request.getSession().setAttribute("test",user);??
  • ????????return?"user/list";??
  • ????}??
  • ????@RequestMapping(value?=?"test2")??
  • ????public?String?test2(@ModelAttribute("test")?User?user,SessionStatus?sessionStatus)?{??
  • ????????System.out.println(user.getUsername());??
  • ????????sessionStatus.setComplete();??
  • ????????return?"user/list";??
  • ????}??
  • }??
  • 一樣先調用/user/test1,再調用/user/test2.在test2方法能得到test1方法set進去的值.使用了@SessionAttributes,如果在controller的方法參數上有@ModelAttribute,那么此方法會確保屬性test的session會存在,否則會拋org.springframework.web.HttpSessionRequiredException異常,即上面代碼先不調/user/test1,直接調/user/test2就會拋此異常

    ?

    ?

    我個人很少這樣用,用原始的寫法就清晰很多了,但要看明白別人寫的代碼。

    轉載于:https://www.cnblogs.com/chinajava/p/5691450.html

    總結

    以上是生活随笔為你收集整理的springmvc的ModelAttribute注解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。