springmvc 注解总结 - SpringMVC中文官网
1.1、@RequestMapping 标注位置
RequestMapping是一个用来处理请求地址映射的注解,将请求映射到对应的控制器方法中,可用于类或方法上。 用在类上:表示类中的所有响应请求的方法都是以该地址作为父路径。 用在方法上:表明哪个具体的方法来接受处理某次请求。
如下所示:
@Controller @RequestMapping(value="/book") public class BookController { @RequestMapping(value="/title") public String getTitle(){ return "title"; } @RequestMapping(value="/content") public String getContent(){ return "content"; } }由于BookController类加了value="/book"的@RequestMapping的注解,所以相关路径都要加上"/book",即请求的url分别为: (1) http://localhost:8080/book/title (2) http://localhost:8080/book/content
注意:
@RequestMapping的value值前后是否有"/"没有影响,即value="book" 、"/book"、"/book/"是一样的。对于类上的@RequestMapping,如果不需要这个路径去拼接,下边三种写法都可以 不写@RequestMapping@RequestMapping()@RequestMapping("")1.2、RequestMapping的属性value:
属性value指定请求的实际url,分为以下几种情况:
(1)普通的具体值。
如前面的value="/book",
(2)含某变量的一类值、
如下所示:
@RequestMapping(value="/get/{bookId}") public String getBookById(@PathVariable String bookId,Model model){ model.addAttribute("bookId", bookId); return "book"; }路径中的bookId可以当变量,@PathVariable注解即提取路径中的变量值。
(3)ant风格
@RequestMapping(value="/get/id?"):可匹配"/get/id1"或"/get/ida",但不匹配"/get/id"或"/get/idaa";@RequestMapping(value="/get/id*"):可匹配"/get/idabc"或"/get/id",但不匹配"/get/idabc/abc";@RequestMapping(value="/get/id/*"):可匹配"/get/id/abc",但不匹配"/get/idabc";@RequestMapping(value="/get/id/**/{id}"):可匹配"/get/id/abc/abc/123"或"/get/id/123"。即:Ant风格和URI模板变量风格可混用。(4)含正则表达式的一类值
@RequestMapping(value="/get/{idPre:\\d+}-{idNum:\\d+}"):可以匹配"/get/123-1",但不能匹配"/get/abc-1",这样可以设计更加严格的规则。可以通过@PathVariable 注解提取路径中的变量(idPre,idNum)
(5)或关系
@RequestMapping(value={"/get","/fetch"}):即 /get或/fetch 都会映射到该方法上。
1.3、RequestMapping的method属性:
method:指定请求的method类型,包括 GET、POST、PUT、DELETE 等;
@RequestMapping(value="/get/{bookid}",method={RequestMethod.GET,RequestMethod.POST})
1.4、RequestMapping的params属性:
params:指定request中必须包含某些参数值时,才让该方法处理。
@RequestMapping(params="action=del"),请求参数包含"action=del",如:"http://localhost:8080/book?action=del"
@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 } }仅处理请求中包含了名为"myParam",值为"myValue"的请求。
1.5、RequestMapping的headers属性:
headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。
例如:@RequestMapping(value="/header/id", headers = "Accept=application/json") 上述注解表示请求的URL必须为 "/header/id 且请求头中必须有"Accept =application/json"参数即可匹配。
@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 } }上述代码仅处理请求的header中包含了指定"Refer"请求头和对应值为"http://www.ifeng.com/"的请求。
1.6、RequestMapping的consumes属性:
consumes:指定请求的内容类型(Content-Type)的请求。例如 application/json,text/html 等。 仅处理包含指定的内容类型(Content-Type)的请求。
@Controller @RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json") public void addPet(@RequestBody Pet pet, Model model) { // implementation omitted }上述方法仅处理request请求中Content-Type为"application/json"类型的请求。
1.7、RequestMapping的produces属性:
produces: 指定返回的内容类型。仅当request请求头中的(Accept)类型中包含该指定类型才返回。
@Controller @RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, produces="application/json") @ResponseBody public Pet getPet(@PathVariable String petId, Model model) { // implementation omitted }上述方法仅处理request请求中Accept头中包含了"application/json"的请求,同时暗示了返回的内容类型为 application/json。
1.8 RequestMapping的name属性:
此属性基本用不到,想了解见:
你知道@RequestMapping的name属性有什么用吗?【享学Spring MVC】 - YourBatman - 博客园
说明
@RequestParam用于将请求参数区数据映射到功能处理方法的参数上。
注意事项
1.参数是List时,必须要用@RequestParam,否则会报错:No primary or default constructor found for interface java.util.List 示例:@RequestParam(value = "content") List<String> content
2.feign:最好加@RequestParam,否则有时候服务会报错,起不来。
示例
public String requestparam1(@RequestParam(value="user_name" String username)请求中包含username参数(如/requestparam1?user_name=zhang),则username自动设为zhang。
@RequestParam有以下三个参数
value:请求的参数名字。请求参数名和形参名不同时,要用该项来指定请求参数名。相同时可以不使用。required:参数是否是必需的。默认是true(必需有);若为true而没有改参数则报400,BadRequestdefaultValue:参数默认值。请求中没有相应名字的参数时,形参的值就为该默认值。设置该参数时,自动将required设为false。请求参数是否是必须的
public String requestparam4(@RequestParam(value="username",required=false) String username)上边表示请求中可以没有名字为username的参数,如果没有默认为null,此处需要注意如下几点:原子类型:必须有值,否则抛出异常,如果允许空值请使用包装类代替。Boolean包装类型:默认Boolean.FALSE,其他引用类型默认为null。
@PathVariable绑定URI模板变量值
@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上。每个占位符/{}/{}中的值,必须和@PathVariable的value的值相同
@RequestMapping(value="/users/{userId}/topics/{topicId}") public String test( @PathVariable(value="userId") int userId, @PathVariable(value="topicId") int topicId)如请求的URL为"控制器URL/users/123/topics/456",则自动将URL中模板变量{userId}和{topicId}绑定到通过@PathVariable注解的value同名参数上,即入参后userId=123、topicId=456。
简介
@RequestBody 将HTTP请求正文转换为适合的HttpMessageConverter对象。@ResponseBody 将内容或对象作为 HTTP 响应正文返回,并调用适合HttpMessageConverter的Adapter转换对象,写入输出流。
@RequestBody作用
(1)该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上; (2)再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。
@RequestBody使用时机
(1)GET、POST方式提时,根据request header Content-Type的值来判断:
application/x-www-form-urlencoded:不能处理(即使用@RequestBody不能处理这种格式的数据); multipart/form-data:可选(@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理); 其他格式,必须(其他格式包括application/json, application/xml等,必须使用@RequestBody来处理);
(2)PUT方式提交时,根据request header Content-Type的值来判断:
application/x-www-form-urlencoded,必须使用@RequestBody来处理; multipart/form-data:不能处理(即使用@RequestBody不能处理这种格式的数据); 其他格式:必须使用@RequestBody来处理;
说明:request的body部分的数据编码格式由header部分的Content-Type指定;
@CookieValue注解用于将请求的cookie数据映射到功能处理方法的参数上。有value,name,required,defaultValue四个属性
@RequestMapping(value="/testCookieValue") public String testCookieValue(@CookieValue(value="JSESSIONID") String cookieValue){ System.out.println("执行了..."); System.out.println(cookieValue); return "success"; }简介
@Responsebody表示该方法的返回结果直接写入HTTP response body中。一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@Responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如前端异步获取json数据,后端加上@Responsebody后,会直接返回json数据。
@ResponseBody原理:
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
@ResponseBody使用时机:
返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;