本文將分為兩部分講解:
1前台發送數據的格式
2spring后台接收數據的格式
一:前台發送數據的格式
目前作者知道的有三種:
multipart/form-data類型主要是上傳文件時用到;
application/x-www-form-urlencoded類型主要是普通表單如input,checkbox;
application/json類型主要是傳遞json數據用到,層次比較深的數據;
form的enctype屬性為編碼方式,常用有兩種:application/x-www-form-urlencoded和multipart/form- data,默認為application/x-www-form-urlencoded。
其中json,在js請求中使用較多,form表單數據可以直接json序列化 var queryArray = $(formElement).serializeArray();
也可以在k-v中的v中添加實際值,當然這個違背了form表單多個k-v的初衷,但是也可以實現
二spring后台接收數據的格式
handler method 參數綁定常用的注解,我們根據他們處理的Request的不同內容部分分為四類:(主要講解常用類型)
A、處理requet uri 部分(這里指uri template中variable,不含queryString部分)的注解: @PathVariable;
B、處理request header部分的注解: @RequestHeader, @CookieValue;
C、處理request body部分的注解:@RequestParam, @RequestBody;
D、處理attribute類型是注解: @SessionAttributes, @ModelAttribute;
1當使用@RequestMapping URI template 樣式映射時, 即 someUrl/{paramId}, 這時的paramId可通過 @Pathvariable注解綁定它傳過來的值到方法的參數上。
@Controller
@RequestMapping("/con/{var1}")
public class ConTestController {
@RequestMapping("/test/{var2}")
public void test(@PathVariable String var1, @PathVariable String var2) {
}
}
2@RequestHeader、@CookieValue
@RequestHeader 注解,可以把Request請求header部分的值綁定到方法的參數上。
Host localhost:8080
Accept text/html,application/xhtml+xml,application/xml;q=0.9
Accept-Language fr,en-gb;q=0.6,en;q=0.2
Accept-Encoding gzip,deflate
Accept-Charset ISO-8859-1,utf-8;q=0.6,*;q=0.2
Keep-Alive 300
@RequestMapping("/test.do")
public void test(@RequestHeader("Accept-Encoding") String encoding,
@RequestHeader("Keep-Alive") int keepAlive) {
}
3、@RequestParam, @RequestBody
@RequestParam
A) 通過Request.getParameter() 獲取的String可直接轉換為簡單類型的情況( String--> 簡單類型的轉換操作由 ConversionService配置的轉換器來完成);
因為使用request.getParameter()方式獲取參數,所以可以處理get 方式中queryString的值,也可以處理post方式 中 body data的值;
B)用來處理Content-Type: 為 application/x-www-form-urlencoded編碼的內容,提交方式GET、POST;
C) 該注解有兩個屬性: value、required; value用來指定要傳入值的id名稱,required用來指示參數是否必須綁定;
示例代碼:
@Controller
@RequestMapping("/users")
@SessionAttributes("user")
public class UserController{
@RequestMapping(method = RequestMethod.GET)
public String getUser(@RequestParam("userid") int userid, ModelMap model) {
model.addAttribute("userid", userid);
return "userPage";
}
@RequestBody
該注解常用來處理Content-Type: 不是application/x-www-form-urlencoded編碼的內容,例如application/json, application/xml等;
它是通過使用HandlerAdapter 配置的HttpMessageConverters來解析post data body,然后綁定到相應的bean上的。
因為配置有FormHttpMessageConverter,所以也可以用來處理 application/x-www-form-urlencoded的內容,處理完的結果放在一個MultiValueMap<String, String>里,這種情況在某些特殊需求下使用,詳情查看FormHttpMessageConverter api;
示例代碼:
@RequestMapping(value = "/test", method = RequestMethod.PUT)
public void test(@RequestBody String requestbody, Writer writer) throws IOException {
writer.write(requestbody);
}
4、@SessionAttributes, @ModelAttribute
@SessionAttributes:
該注解用來綁定HttpSession中的attribute對象的值,便於在方法中的參數里使用。
該注解有value、types兩個屬性,可以通過名字和類型指定要使用的attribute 對象;
示例代碼:
@Controller
@RequestMapping("/test.do")
@SessionAttributes("user")
public class TestController{
}
@ModelAttribute
該注解有兩個用法,一個是用於方法上,一個是用於參數上;
用於方法上時: 通常用來在處理@RequestMapping之前,為請求綁定需要從后台查詢的model;
用於參數上時: 用來通過名稱對應,把相應名稱的值綁定到注解的參數bean上;要綁定的值來源於:
A) @SessionAttributes 啟用的attribute 對象上;
B) @ModelAttribute 用於方法上時指定的model對象;
C) 上述兩種情況都沒有時,new一個需要綁定的bean對象,然后把request中按名稱對應的方式把值綁定到bean中。
用到方法上@ModelAttribute的示例代碼:
@ModelAttribute
public User addUser (@RequestParam String id) {
return userManager.findUser (id);
}
這種方式實際的效果就是在調用@RequestMapping的方法之前,為request對象的model里put(“user”, User );
用在參數上的@ModelAttribute示例代碼:
@RequestMapping(value="/test", method = RequestMethod.POST)
public String getUser(@ModelAttribute User user) {
}
首先查詢 @SessionAttributes有無綁定的User對象,若沒有則查詢@ModelAttribute方法層面上是否綁定了User 對象,若沒有則將URI template中的值按對應的名稱綁定到User 對象的各屬性上。
---------------------
作者:MemoryMaple
來源:CSDN
原文:https://blog.csdn.net/u011073057/article/details/78809663
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!