Introduction:
In the previous period of time the project used a restful mode to develop the program, but when using post, put mode to submit data, the server side can not accept the submitted data (server-side parameter binding without any annotations), to see the submission method is Application/json, And the server side of the data through Request.getreader () does exist in the browser submitted data. In order to find out the reason, the parameter binding (@RequestParam, @RequestBody, @RequestHeader, @PathVariable) was studied, and also looked at the relevant contents of Httpmessageconverter, summarized here.
Brief introduction:
@RequestMapping
Requestmapping is an annotation that handles request address mappings and can be used on classes or methods. On a class, the method that represents all response requests in a class is the parent path of the address.
The requestmapping annotation has six properties, and we'll describe her in three categories below.
1, value, method;
Value: Specifies the actual address of the request, the specified address can be the URI Template mode (which will be explained later);
Method: Specifies the type of method requested, GET, POST, PUT, delete, and so on;
2, Consumes,produces;
Consumes: Specifies the type of submission to process the request (Content-type), such as Application/json, text/html;
Produces: Specifies the type of content returned, only if the specified type is included in the (Accept) type in the request header;
3, Params,headers;
Params: Specifies that some parameter values must be included in the request before the method is processed.
Headers: Specifies that certain header values must be included in the request in order for the method to process requests.
Example: 1, value/method example
Default Requestmapping ("...") that is value;
@Controller @requestmapping ("/appointments") public class Appointmentscontroller {private AppointmentBook AppointmentBook; @Autowired public Appointmentscontroller (AppointmentBook appointmentbook) {This.appointmentbook = Appointmentbo Ok } @RequestMapping (method = requestmethod.get) public map<string, appointment> GET () {return appointmen Tbook.getappointmentsfortoday (); } @RequestMapping (value= "/{day}", method = requestmethod.get) public map<string, appointment> Getforday (@PathV Ariable @DateTimeFormat (Iso=iso. Date day, model model) {return appointmentbook.getappointmentsforday (day); } @RequestMapping (value= "/new", method = requestmethod.get) public appointmentform Getnewform () {return new Appointmentform (); } @RequestMapping (method = requestmethod.post) public String Add (@Valid appointmentform appointment, Bindingresult R Esult) {if (Result.haserrors ()) {return "AppointmEnts/new "; } appointmentbook.addappointment (appointment); return "Redirect:/appointments"; }}
The URI value of value is the following three categories:
A) can be specified as a normal specific value;
B) can be specified as a class of values containing a variable (URI Template Patterns with Path Variables);
C) can be specified as a class of values with regular expressions (URI Template Patterns with Regular Expressions);
Example B)
@RequestMapping (value= "/owners/{ownerid}", method=requestmethod.get) public String findowner (@PathVariable string ownerID, model model) { owner owner = ownerservice.findowner (ownerid); Model.addattribute ("owner", owner); return "Displayowner"; }
Example C)
@RequestMapping ("/spring-web/{symbolicname:[a-z-]+}-{version:\d\.\d\.\d}.{ Extension:\. [A-Z]} ") public void handle (@PathVariable string version, @PathVariable string extension) { //... }}
2 consumes, produces example
Examples of Cousumes:
@Controller @requestmapping (value = "/pets", method = Requestmethod.post, consumes= "Application/json") public void Addpet (@RequestBody Pet Pet, model model) { //implementation omitted}
The Content-type method only processes requests with the request "Application/json" type.
Examples of produces:
@Controller @requestmapping (value = "/pets/{petid}", method = Requestmethod.get, produces= "Application/json") @ Responsebodypublic Pet Getpet (@PathVariable String Petid, model model) { //implementation omitted}
The Application/json method only handles requests in the request that accept headers contain "a", and implies that the returned content type is Application/json;
3 Params, headers example
Examples of params:
@Controller @requestmapping ("/owners/{ownerid}") public class Relativepathuritemplatecontroller { @ Requestmapping (value = "/pets/{petid}", method = Requestmethod.get, params= "Myparam=myvalue") public void Findpet ( @PathVariable string ownerid, @PathVariable string petid, model model) { //implementation omitted }}
A request with a value of "myvalue" named "Myparam" is included in the processing request only;
Examples of headers:
@Controller @requestmapping ("/owners/{ownerid}") public class Relativepathuritemplatecontroller {@RequestMapping ( Value = "/pets", method = Requestmethod.get, headers= "referer=http://www.ifeng.com/") public void Findpet (@ Pathvariable string ownerid, @PathVariable string petid, model model) { //implementation omitted }}
The header that processes request only contains a request that specifies a "Refer" request header and a corresponding value of " http://www.ifeng.com/
";
The above only describes which requests are processed by the method specified by Requestmapping, and the following article explains how to handle the data (data binding) and the data returned by request submission.
Resources:
1. Spring Web Doc:
Spring-3.1.0/docs/spring-framework-reference/html/mvc.html
Address mapping @RequestMapping usage explained (GO)