您好,登錄后才能下訂單哦!
前面幾篇文章分別說了spring mvc如何傳參數(shù)到后臺,如何返回參數(shù)到前臺。今天來說一下,spring mvc的ModelAttribute注解,這個注解有什么作用,什么場景下使用?
1、應用場景:數(shù)據(jù)更新。例如有一個實體User,其中有id、userName、age、email、createTime等屬性,createTime定義了用戶的創(chuàng)建時間,一般都是后臺自動獲取并賦值。除了id和createTime之外的User的其他屬性,都是可以編輯修改的,如下圖所示。
而此時我們的后臺,一般會使用對象進行接收參數(shù),如下所示:
@RequestMapping("/testModelAttribute") public String testModelAttribute(User user){ System.out.println(user); return "success"; }
測試代碼,設定user的默認值,可以看到后臺的輸出
User{userName='lxy', password='null', email='test@126.com', age=20, createTime=null, address=null}
,user對象只有userName、age、emai有值,其它的都是null:
<form action="/testModelAttribute/testModelAttribute" method="post"> userName:<input type="text" name="userName" value="lxy"/> <br/> age:<input type="text" name="age" value="20"/> <br/> email:<input type="text" name="email" value="test@126.com"/> <br/> <input type="submit" value="submit" /> </form>
如果我們這個時候更新數(shù)據(jù)庫的話,就需要先查詢一下數(shù)據(jù)庫,讀出來之前user對象的值,然后把前臺傳遞過來的參數(shù)設置到user上,否則就會導致部分數(shù)據(jù)丟失。
另一種解決方案是在編輯之前,先把數(shù)據(jù)查詢出來,然后在頁面上使用隱藏域,把其它的值放在隱藏域中,然后使用在提交form表單的時候,把隱藏域的數(shù)據(jù)一并提交到后臺。
2、配合使用ModelAttribute注解,這里根據(jù)參數(shù)userName,模擬從數(shù)據(jù)庫中讀取數(shù)據(jù)
@ModelAttribute public void getUserById(@RequestParam(value = "userName", required = false) String userName, Map<String, Object> map) { System.out.println("任何時候我都會被調用"); if(userName != null) { //模擬讀取數(shù)據(jù)庫中的數(shù)據(jù) User user = new User(); user.setUserName("lxy"); user.setAge(18); user.setPassword("123456"); user.setEmail("lxy@126.com"); user.setCreateTime(new Date()); map.put("user", user); } }
此時,再次運行項目,可以看到后臺的輸出為:email和age是前臺傳遞過來的參數(shù),而password和createTime都是從數(shù)據(jù)庫中讀取出來的數(shù)據(jù),這就可以直接根據(jù)user實體,更新數(shù)據(jù)庫了。
User{userName='lxy', password='123456', email='test@126.com', age=20, createTime=Mon Mar 20 18:03:31 CST 2017, address=null}
3、注意,訪問controller中的任意的方法,都會調用被ModelAttribute注解的方法。所以說這個注解要慎用,在適用在注解之前,需要認真考慮是否真的合適。
@RequestMapping("/testRun") public String testRun(){ System.out.println("我就看看會不會調用ModelAttribute注解修飾的方法"); return "success"; }
訪問上面的方法,可以看到下面的輸出,被ModelAttribute注解修飾的方法,會先于目標方法執(zhí)行:
任何時候我都會被調用 我就看看會不會調用ModelAttribute注解修飾的方法
4、在目標方法的參數(shù)上使用ModelAttribute注解
上面我們看到在被ModelAttribute注解修飾的方法上,如果要想被取到值,在方法中必須要這樣設置,
User user = new User(); user.setUserName("lxy"); user.setAge(18); user.setPassword("123456"); user.setEmail("lxy@126.com"); user.setCreateTime(new Date()); //如果設置的key為temp,則目標方法上必須要有相應的注解聲明,才能起到效果 map.put("temp", user);
@RequestMapping("/testModelAttribute2") public String testModelAttribute2(@ModelAttribute("temp")User user){ //這里的temp與被ModelAttribute注解修飾的方法的存放的key一致 System.out.println(user); return "success"; }
項目源代碼:
https://git.oschina.net/acesdream/spring-mvc
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。