springMVC---处理模型数据方法 *
生活随笔
收集整理的這篇文章主要介紹了
springMVC---处理模型数据方法 *
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
承接一二章
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Hello World</title> <a href="springMVC/ModelAndView">ModelAndView</a><br> <br><a href="springMVC/Map">map</a><br> <br><!-- 模型修改操作1, 原始數(shù)據(jù)為 1 tom 1234562, 密碼不能別修改3,表單回顯,模擬操作直接在表單填寫對(duì)應(yīng)的屬性值--> <form action="springMVC/testModelAttribute" method="get"><input type="hidden" name="id" value="1"/><br>name<input type="text" name="username" value="tom"/> <br><!-- pw<input type="text" name="password" value="123456"/> --><input type="submit" value="submit" /> </form> <br> <br> <form action="springMVC1/testModelAttribute" method="get"><input type="hidden" name="id" value="1"/><br>name<input type="text" name="username" value="tom"/> <br><!-- pw<input type="text" name="password" value="123456"/> --><input type="submit" value="submit" /> </form> </body> </html>test.java
package com.hdxy.domian;import java.util.Arrays; import java.util.Date; import java.util.Map;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView;import com.hdxy.pojo.User;@RequestMapping("springMVC") @Controller public class Test {/*處理模型數(shù)據(jù)方法:* @1 ModelAndView(可以包含視圖和模型信息)* 處理方法返回值類型為ModelAndView時(shí):方法體即可通過該對(duì)象添加模型數(shù)據(jù)* @2Map 及 Model* 入?yún)?#xff1a;org.springframework.ui.Model,org.springframework.ui.ModelMap* 或者java.ui.Map時(shí)處理方法返回時(shí),Map中的數(shù)據(jù)會(huì)自動(dòng)添加到模型中。* @3 SessionAttributes:* 將模型中的某個(gè)屬性暫存在HttpSession中以便多個(gè)請(qǐng)求之間可以共享這個(gè)參數(shù)* @4 ModelAttribute: * 方法入?yún)?biāo)注該注解后,入?yún)⒌膶?duì)象就會(huì)放入到數(shù)據(jù)模型中* SpringMVC確定目標(biāo)方法POJO類型入?yún)⒌倪^程:* 1.確定一個(gè)Key* 1)。若目標(biāo)方法的POJO類型的參數(shù)沒有使用@ModeleAttriBute 作為修飾 則key額為POJO類名第一個(gè)字母小寫* 2)。若使用了@MOdelAttribute來修飾,則key為@ModeleAttriBute注解的value屬性值* 2.在implicitModel中查找key對(duì)應(yīng)的對(duì)象,若存在,則作為入?yún)魅? 1)。若在@ModelAttribute標(biāo)記的方法中在Map中保存過,且key和1確定的key一至,則獲取到* 3.若implicitModel中不存在key對(duì)應(yīng)的對(duì)象,則檢查當(dāng)前handler是佛使用sessionAttrbute注解修飾* 若使用了該注解,則@sessionAttributes注解的value屬性值中包含了key,則會(huì)從Httpsession中來獲取key* 所對(duì)應(yīng)額value值,若存在則直接傳入目標(biāo)參數(shù)方法中,若不存在則拋出異常* 4.若handler沒有標(biāo)識(shí)@sessionAttributes注解或@sessionAttributes注解的value值中不包含key,則* 會(huì)通過反射來創(chuàng)建pojo類型的參數(shù),傳入目標(biāo)方法的參數(shù)* 5.SpringMVC會(huì)把key和value保存到implicitModel中,進(jìn)而會(huì)保存到request中* * */final public String SUCCESS="loginSuccess";@RequestMapping(value="/ModelAndView")public ModelAndView TestModelAndView(){String viewName= SUCCESS;ModelAndView modelv=new ModelAndView(viewName);modelv.addObject("time",new Date());return modelv;}@RequestMapping("/Map")public String TestMap(Map<String,Object> map){/*System.out.println(map.getClass().getName());//測(cè)試ModelMap*/map.put("names", Arrays.asList("tom","jerry","2"));return SUCCESS;}@RequestMapping("/testModelAttribute")public String testModelAttribute(User user){//此方法從新new了一個(gè)User類 去賦修改后的值 得到的密碼為空。(無法滿足不修改密碼的需求)//(test2.java)而ModelAttribute是從數(shù)據(jù)庫獲取User類(把修改的屬性賦值,無修改的顯示原先值) 然后賦值System.out.println("修改"+user);return SUCCESS;} }test2.java
package com.hdxy.domian;import java.util.Map; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam;import com.hdxy.pojo.User;@RequestMapping("/springMVC1") @Controller public class Test2 {final public String SUCCESS="loginSuccess";@ModelAttributepublic void getUser(@RequestParam(value="id",required=false)Integer id,Map<String,Object> map){if(id !=null){//模擬從數(shù)據(jù)庫中獲取對(duì)象User user=new User();user.setId(1);user.setUsername("tom");user.setPassword("123456");System.out.println("從數(shù)據(jù)庫中獲取user"+user);/*map.put("adc", user);*/map.put("user", user);}} /*** 運(yùn)行流程* 1.執(zhí)行:@ModelAttribute注解修飾的方法:從數(shù)據(jù)庫中取出對(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è)字母小寫的字符串一致* * Parma("abc")User user* */@RequestMapping("/testModelAttribute")public String testModelAttribute(User user){System.out.println("測(cè)試SpringMVC1");System.out.println("修改"+user);return SUCCESS;}/***源碼分析:*1.調(diào)用@ModelAttribute注解修飾的方法,實(shí)際上把ModelAttribute方法中的Map中的數(shù)據(jù)放在implicitModel中*2.解析請(qǐng)求處理器的目標(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)前handel石佛使用了@sessionAttributes進(jìn)行修飾,若使用了,則嘗試從session中獲取attrName所對(duì)應(yīng)的屬性值* 若session沒有則拋出異常* >若handle沒有使用@sessionAttributes 進(jìn)行修飾,或@sessionAttributtes中沒有使用value 值指定的key和attrName 相匹配,則通過反射創(chuàng)建POJO類* 2), SpringMVC把表單的請(qǐng)求賦給了webdataBinder的target對(duì)應(yīng)的屬性* 3),springMVC會(huì)把webDataBinder的target和attrname給implicitModel* 4),把webDataBinder的target作為參數(shù)傳遞給目標(biāo)方法的入?yún)?*/ }?
轉(zhuǎn)載于:https://www.cnblogs.com/lnthz/p/8168834.html
總結(jié)
以上是生活随笔為你收集整理的springMVC---处理模型数据方法 *的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AI看脸、测肤,左可美妆新零售,右能智慧
- 下一篇: mybatis+dubbo+ sprin