適用場景,封裝綁定數據的時候,當咱們想給形參取其餘名字的時候能夠用這個註解,可是也能夠不寫java
jsp 中的代碼: <!-- requestParams 註解的使用 --> <a href="springmvc/useRequestParam?name=test">requestParam 註解</a> 控制器中的代碼: /** * requestParams 註解的使用 * @param username * @return **/ @RequestMapping("/useRequestParam") public String useRequestParam(@RequestParam("name")Stringusername,@RequestParam(value="age",required=false)Integer age){ System.out.println(username+","+age); return "success"; }
這裏要特別說明一下,用map接收的時候,必需要添加該註解程序員
@RequestMapping("/request") public String testRequestParamo(@RequestParam Map<String,Object> map) { System.out.println("test is doing...."); System.out.println(map); return "success"; }
做用:用於獲取請求體內容。直接使用獲得是 key=value&key=value...結構的數據,get 請求方式不適用。ajax
屬性:required:是否必須有請求體。默認值是:true。當取值爲 true 時,get 請求方式會報錯。若是取值爲 false,get 請求獲得是 null。spring
post 請求 jsp 代碼: <!-- request body 註解 --> <form action="springmvc/useRequestBody" method="post"> 用戶名稱:<input type="text" name="username" ><br/> 用戶密碼:<input type="password" name="password" ><br/> 用戶年齡:<input type="text" name="age" ><br/> <input type="submit" value=" 保存 "> </form> get 請求 jsp 代碼: <a href="springmvc/useRequestBody?body=test">requestBody 註解 get 請求</a>
控制器代碼數據庫
/** * RequestBody 註解 * @param user * @return */ @RequestMapping("/useRequestBody") public String useRequestBody(@RequestBody(required=false) String body){ System.out.println(body); return "success"; }
主要是用於響應ajax請求,返回的解析數據有如下的兩種模式json
*fastJosn(推薦)
*jackJosncookie
@ResponseBody,也能夠返回普通字符串,若是返回對象就報錯,若是想要返回對象必須配置JSON轉化器,get任何數據均可以,getJSON接收的JSON對象session
配置了轉化器以後:也能夠返回普通字符串,能夠返回json字符串,設置能夠將任何的數據轉化爲Json對象返回,好比java對象,map等等mvc
返回json數據格式:app
配置步驟以下:
導入依賴
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency>
<!--配置spring開啓註解mvc的支持 *配置json格式轉化器 --> <mvc:annotation-driven> <mvc:message-converters> <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>application/json;charset=UTF-8</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
controller層方法
/** * 返回json字符串 * @return */ @RequestMapping("/Data2") @ResponseBody public JSONObject getDate(){ System.out.println("請求到後臺"); JSONObject jsonpObject= JSON.parseObject("{'name':'張三','age':'15','address':'重慶'}"); return jsonpObject; }
AJax請求頁面response.jsp
$.getJSON("/user/Data2",function (data) { console.log(data); })
返回java對象數據格式:
實體類代碼
private String name; private int age; private String password; @JSONField(format = "yyyy-MM-dd") private Date date;
controller層代碼
/** * 返回java對象 * @param student * @return */ @RequestMapping("/testAjax") @ResponseBody public Student testAjax( Student student) { System.out.println("testAjax is working"); student.setName("tom"); student.setPassword("123456"); student.setDate(new Date()); System.out.println(student); return student; }
$.getJSON("/user/testAjax",function (data) { console.log(data); })
訪問http://localhost:8080/response.jsp獲得console
Json轉換日期類型會變成毫秒數,使用jsonfile,在實體類的日期屬性上
解決方案:推薦配置方案一
解決方案1、@JSONfile(formart="yyyy-MM-dd")
pivate Data brithday;
解決方案2、配置當心轉化器,只能轉化爲年月日時分秒
<property name="features">
<list>
<!-- 默認就是年月日時分秒格式 -->
<value>WriteDateUseDateFormat</value>
</list>
</property>
做用:
用於綁定 url 中的佔位符。例如:請求 url 中 /delete/{id},這個{id}就是 url 佔位符。
url 支持佔位符是 spring3.0 以後加入的。是 springmvc 支持 rest 風格 URL 的一個重要標誌。
屬性:
value:用於指定 url 中佔位符名稱。
required:是否必須提供佔位符
jsp 代碼: <!-- PathVariable 註解 --> <a href="springmvc/usePathVariable/100">pathVariable 註解</a>
控制器代碼: /** * PathVariable 註解 * @param user * @return */ @RequestMapping("/usePathVariable/{id}") public String usePathVariable(@PathVariable("id") Integer id){ System.out.println(id); return "success"; }
做用:
用於獲取請求消息頭。
屬性:
value:提供消息頭名稱
required:是否必須有此消息頭
注:
在實際開發中通常不怎麼用
jsp 中代碼: <!-- RequestHeader 註解 --> <a href="springmvc/useRequestHeader">獲取請求消息頭</a> 控制器中代 碼: /** * RequestHeader 註解 * @param user * @return */ @RequestMapping("/useRequestHeader") public String useRequestHeader(@RequestHeader(value="Accept-Language", required=false)String requestHeader){ System.out.println(requestHeader); return "success"; } 運行結果:
做用:
用於把指定 cookie 名稱的值傳入控制器方法參數。
屬性:
value:指定 cookie 的名稱。
required:是否必須有此 cookie
jsp 中的代碼: <!-- CookieValue 註解 --> <a href="springmvc/useCookieValue">綁定 cookie 的值</a> 控制器中的代碼: /** * Cookie 註解註解 * @param user * @return */ @RequestMapping("/useCookieValue") public String useCookieValue(@CookieValue(value="JSESSIONID",required=false)String cookieValue){ System.out.println(cookieValue); return "success"; } 運行結果:
做用:
該註解是 SpringMVC4.3 版本之後新加入的。它能夠用於修飾方法和參數。出如今方法上,表示當前方法會在控制器的方法執行以前,先執行。它能夠修飾沒有返回值的方法,也可
以修飾有具體返回值的方法,出如今參數上,獲取指定的數據給參數賦值。
屬性:
value:用於獲取數據的 key。key 能夠是 POJO 的屬性名稱,也能夠是 map 結構的 key。
應用場景:
當表單提交數據不是完整的實體類數據時,保證沒有提交數據的字段使用數據庫對象原來的數據。
例如:
咱們在編輯一個用戶時,用戶有一個建立信息字段,該字段的值是不容許被修改的。在提交表單數,據是確定沒有此字段的內容,一旦更新會把該字段內容置爲 null,此時就能夠使用此註解解決問題。
<a href="springmvc/testModelAttribute?username=test">測試 modelattribute</a>
控制器代碼: /** * 被 ModelAttribute 修飾的方法 * @param user */ @ModelAttribute public void showModel(User user) { System.out.println("執行了 showModel 方法"+user.getUsername()); } /** * 接收請求的方法 * @param user * @return */ @RequestMapping("/testModelAttribute") public String testModelAttribute(User user) { System.out.println("執行了控制器的方法"+user.getUsername()); return "success"; }
需求: 修改用戶信息,要求用戶的密碼不能修改 jsp 的代碼: <!-- 修改用戶信息 --> <form action="springmvc/updateUser" method="post"> 用戶名稱:<input type="text" name="username" ><br/> 用戶年齡:<input type="text" name="age" ><br/> <input type="submit" value=" 保存 "> </form>
控制的代碼: /** * 查詢數據庫中用戶信息 * @param user */ @ModelAttribute public User showModel(String username) { //模擬去數據庫查詢 User abc = findUserByName(username); System.out.println("執行了 showModel 方法"+abc); return abc; } /** * 模擬修改用戶方法 * @param user * @return */ @RequestMapping("/updateUser") public String testModelAttribute(User user) { System.out.println("控制器中處理請求的方法:修改用戶:"+user); return "success"; } /** * 模擬去數據庫查詢 * @param username * @return */ private User findUserByName(String username) { User user = new User(); user.setUsername(username); user.setAge(19); user.setPassword("123456"); return user; }
jsp 中的代碼: <!-- 修改用戶信息 --> <form action="springmvc/updateUser" method="post"> 用戶名稱:<input type="text" name="username" ><br/> 用戶年齡:<input type="text" name="age" ><br/> <input type="submit" value=" 保存 "> </form>
控制器中的代碼: /** * 查詢數據庫中用戶信息 * @param user */ @ModelAttribute public void showModel(String username,Map<String,User> map) { //模擬去數據庫查詢 User user = findUserByName(username); System.out.println("執行了 showModel 方法"+user); map.put("abc",user); } /** * 模擬修改用戶方法 * @param user * @return */ @RequestMapping("/updateUser") public String testModelAttribute(@ModelAttribute("abc")User user) { System.out.println("控制器中處理請求的方法:修改用戶:"+user); return "success"; } /** * 模擬去數據庫查詢 * @param username * @return */ private User findUserByName(String username) { User user = new User(); user.setUsername(username); user.setAge(19); user.setPassword("123456"); return user; }
做用:
用於屢次執行控制器方法間的參數共享。
屬性:
value:用於指定存入的屬性名稱
type:用於指定存入的數據類型。
jsp 中的代碼 : <!-- SessionAttribute 註解的使用 --> <a href="springmvc/testPut">存入 SessionAttribute</a> <hr/> <a href="springmvc/testGet">取出 SessionAttribute</a> <hr/> <a href="springmvc/testClean">清除 SessionAttribute</a>
控制器中的代碼 : /** * SessionAttribute 註解的使用 * @author 黑馬程序員 * @Company http://www.ithiema.com * @Version 1.0 */ @Controller("sessionAttributeController") @RequestMapping("/springmvc") @SessionAttributes(value ={"username","password"},types={Integer.class}) public class SessionAttributeController { /** * 把數據存入 SessionAttribute * @param model * @return * Model 是 spring 提供的一個接口,該接口有一個實現類 ExtendedModelMap * 該類繼承了 ModelMap,而 ModelMap 就是 LinkedHashMap 子類 */ @RequestMapping("/testPut") public String testPut(Model model){ model.addAttribute("username", "泰斯特"); model.addAttribute("password","123456"); model.addAttribute("age", 31); //跳轉以前將數據保存到 username、password 和 age 中,由於註解@SessionAttribute 中有這幾個參數 return "success"; } @RequestMapping("/testGet") public String testGet(ModelMap model){ System.out.println(model.get("username")+";"+model.get("password")+";"+model.get("age")); return "success"; } @RequestMapping("/testClean") public String complete(SessionStatus sessionStatus){ sessionStatus.setComplete(); return "success"; } }