7、注解篇@ModelAttribute

@ModelAttribute 綁定值

在controller執(zhí)行之前先執(zhí)行的方式,可以使用@RequestParam注解獲取傳入的值劝枣,當(dāng)定義該注解后該類的所以請(qǐng)求都會(huì)先執(zhí)行

/**
     * 1. 有 @ModelAttribute 標(biāo)記的方法, 會(huì)在每個(gè)目標(biāo)方法執(zhí)行之前被 SpringMVC 調(diào)用! 
     * 2. @ModelAttribute 注解也可以來修飾目標(biāo)方法 POJO 類型的入?yún)? 其 value 屬性值有如下的作用:
     * 1). SpringMVC 會(huì)使用 value 屬性值在 implicitModel 中查找對(duì)應(yīng)的對(duì)象, 若存在則會(huì)直接傳入到目標(biāo)方法的入?yún)⒅?
     * 2). SpringMVC 會(huì)一 value 為 key, POJO 類型的對(duì)象為 value, 存入到 request 中. 
     */
    @ModelAttribute
    public void getUser(@RequestParam(value="id",required=false) Integer id, 
            Map<String, Object> map){
        System.out.println("modelAttribute method");
        if(id != null){
            //模擬從數(shù)據(jù)庫中獲取對(duì)象
            User user = new User(1, "Tom", "123456", "tom@atguigu.com", 12);
            System.out.println("從數(shù)據(jù)庫中獲取一個(gè)對(duì)象: " + user);
            
            map.put("user", user);
        }
    }
    
    /**
     * 運(yùn)行流程:
     * 1. 執(zhí)行 @ModelAttribute 注解修飾的方法: 從數(shù)據(jù)庫中取出對(duì)象, 把對(duì)象放入到了 Map 中. 鍵為: user
     * 2. SpringMVC 從 Map 中取出 User 對(duì)象, 并把表單的請(qǐng)求參數(shù)賦給該 User 對(duì)象的對(duì)應(yīng)屬性.
     * 3. SpringMVC 把上述對(duì)象傳入目標(biāo)方法的參數(shù). 
     * 
     * 注意: 在 @ModelAttribute 修飾的方法中, 放入到 Map 時(shí)的鍵需要和目標(biāo)方法入?yún)㈩愋偷牡谝粋€(gè)字母小寫的字符串一致!
     * 
     * SpringMVC 確定目標(biāo)方法 POJO 類型入?yún)⒌倪^程
     * 1. 確定一個(gè) key:
     * 1). 若目標(biāo)方法的 POJO 類型的參數(shù)木有使用 @ModelAttribute 作為修飾, 則 key 為 POJO 類名第一個(gè)字母的小寫
     * 2). 若使用了  @ModelAttribute 來修飾, 則 key 為 @ModelAttribute 注解的 value 屬性值. 
     * 2. 在 implicitModel 中查找 key 對(duì)應(yīng)的對(duì)象, 若存在, 則作為入?yún)魅?     * 1). 若在 @ModelAttribute 標(biāo)記的方法中在 Map 中保存過, 且 key 和 1 確定的 key 一致, 則會(huì)獲取到. 
     * 3. 若 implicitModel 中不存在 key 對(duì)應(yīng)的對(duì)象, 則檢查當(dāng)前的 Handler 是否使用 @SessionAttributes 注解修飾, 
     * 若使用了該注解, 且 @SessionAttributes 注解的 value 屬性值中包含了 key, 則會(huì)從 HttpSession 中來獲取 key 所
     * 對(duì)應(yīng)的 value 值, 若存在則直接傳入到目標(biāo)方法的入?yún)⒅? 若不存在則將拋出異常. 
     * 4. 若 Handler 沒有標(biāo)識(shí) @SessionAttributes 注解或 @SessionAttributes 注解的 value 值中不包含 key, 則
     * 會(huì)通過反射來創(chuàng)建 POJO 類型的參數(shù), 傳入為目標(biāo)方法的參數(shù)
     * 5. SpringMVC 會(huì)把 key 和 POJO 類型的對(duì)象保存到 implicitModel 中, 進(jìn)而會(huì)保存到 request 中. 
     * 
     * 源代碼分析的流程
     * 1. 調(diào)用 @ModelAttribute 注解修飾的方法. 實(shí)際上把 @ModelAttribute 方法中 Map 中的數(shù)據(jù)放在了 implicitModel 中.
     * 2. 解析請(qǐng)求處理器的目標(biāo)參數(shù), 實(shí)際上該目標(biāo)參數(shù)來自于 WebDataBinder 對(duì)象的 target 屬性
     * 1). 創(chuàng)建 WebDataBinder 對(duì)象:
     * ①. 確定 objectName 屬性: 若傳入的 attrName 屬性值為 "", 則 objectName 為類名第一個(gè)字母小寫. 
     * *注意: attrName. 若目標(biāo)方法的 POJO 屬性使用了 @ModelAttribute 來修飾, 則 attrName 值即為 @ModelAttribute 
     * 的 value 屬性值 
     * 
     * ②. 確定 target 屬性:
     *  > 在 implicitModel 中查找 attrName 對(duì)應(yīng)的屬性值. 若存在, ok
     *  > *若不存在: 則驗(yàn)證當(dāng)前 Handler 是否使用了 @SessionAttributes 進(jìn)行修飾, 若使用了, 則嘗試從 Session 中
     * 獲取 attrName 所對(duì)應(yīng)的屬性值. 若 session 中沒有對(duì)應(yīng)的屬性值, 則拋出了異常. 
     *  > 若 Handler 沒有使用 @SessionAttributes 進(jìn)行修飾, 或 @SessionAttributes 中沒有使用 value 值指定的 key
     * 和 attrName 相匹配, 則通過反射創(chuàng)建了 POJO 對(duì)象
     * 
     * 2). SpringMVC 把表單的請(qǐng)求參數(shù)賦給了 WebDataBinder 的 target 對(duì)應(yīng)的屬性. 
     * 3). *SpringMVC 會(huì)把 WebDataBinder 的 attrName 和 target 給到 implicitModel. 
     * 近而傳到 request 域?qū)ο笾? 
     * 4). 把 WebDataBinder 的 target 作為參數(shù)傳遞給目標(biāo)方法的入?yún)? 
     */
    @RequestMapping("/testModelAttribute")
    public String testModelAttribute(User user){
        System.out.println("修改: " + user);
        return SUCCESS;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市织鲸,隨后出現(xiàn)的幾起案子舔腾,更是在濱河造成了極大的恐慌,老刑警劉巖搂擦,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稳诚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡瀑踢,警方通過查閱死者的電腦和手機(jī)扳还,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來橱夭,“玉大人氨距,你說我怎么就攤上這事〖樱” “怎么了俏让?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)茬暇。 經(jīng)常有香客問我首昔,道長(zhǎng),這世上最難降的妖魔是什么而钞? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任沙廉,我火速辦了婚禮,結(jié)果婚禮上臼节,老公的妹妹穿的比我還像新娘撬陵。我一直安慰自己,他們只是感情好网缝,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布巨税。 她就那樣靜靜地躺著,像睡著了一般粉臊。 火紅的嫁衣襯著肌膚如雪草添。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天扼仲,我揣著相機(jī)與錄音远寸,去河邊找鬼抄淑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛驰后,可吹牛的內(nèi)容都是我干的肆资。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼灶芝,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼郑原!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起夜涕,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤犯犁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后女器,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酸役,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年驾胆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了簇捍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡俏拱,死狀恐怖暑塑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锅必,我是刑警寧澤事格,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站搞隐,受9級(jí)特大地震影響驹愚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜劣纲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一逢捺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧癞季,春花似錦劫瞳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至废睦,卻和暖如春伺绽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工奈应, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留澜掩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓杖挣,卻偏偏與公主長(zhǎng)得像输硝,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子程梦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容