SpringMVC 使用@RequestMapping
注解为Controller(控制器)指定可以处理哪些URL请求。所以,它本质上相当于web.xml
的url-pattern
。
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String name() default "";
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};
}
@Target({ElementType.METHOD, ElementType.TYPE})
注解表明:@RequestMapping
可以在方法和类的声明中使用。 @Retention(RetentionPolicy.RUNTIME)
注解表明:RequestMapping
注解将会由虚拟机保留,以便它可以在运行时通过反射读取。@Documented
注解表明:@RequestMapping
注解应该被 javadoc工具记录,也就是说该类注解类型信息也会被包括在生成的文档中。@Mapping
注解表明:@RequestMapping
注解是一个web映射注解。RequestMapping
注解中除了name()
方法返回字符串,其他都返回数组,也就是说它们可以接收多个参数。
String name() default "";
为这个映射指定一个名字,在项目中,我们一般都不使用。
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
value和path属性是等价的,可以互换,如果在RequestMapping
注解中仅有这一个属性(@RequestMapping(value = "/spring")
),则可以省略value=
,而只写@RequestMapping("/spring")
。
1、将 @RequestMapping 注解在 test 方法上,而 HelloController 类上不添加 @RequestMapping 注解,这时的请求 URL 是相对于 Web 根目录。
@Controller
public class HelloController {
@RequestMapping("/test")
public String test() {
return "hello";
}
}
使用 CURL 访问:
curl http://localhost:8080/SpringMVCDemo/test
SpringMVCDemo
是我们的项目名称。
2、将 @RequestMapping
注解在 HelloController
类上,这时类的注解是相对于 Web 根目录,而方法上的是相对于类上的路径。
@Controller
@RequestMapping("/spring")
public class HelloController {
@RequestMapping("/test")
public String test() {
return "hello";
}
}
这时,访问应该是这样的:curl http://localhost:8080/SpringMVCDemo/spring/test
RequestMethod[] method() default {};
表示接收何种类型的请求。
org.springframework.web.bind.annotation.RequestMethod
枚举类定义了浏览器请求的方式。
public enum RequestMethod {
GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
}
如果 @RequestMapping
没有method属性,则接收任意类型的URL请求。
@Controller
public class HelloController {
@RequestMapping(value = "/test")
public String test(HttpServletRequest request) {
System.out.println(request.getMethod());
return "hello";
}
}
public class HelloController {
@RequestMapping(value = "/test", method = RequestMethod.POST)
public String test(HttpServletRequest request) {
System.out.println(request.getMethod());
return "hello";
}
}
如上,则只可以接收POST类型的请求。当我们使用GET方式访问时,则报错。
String[] params() default {};
表示接收何种请求参数的请求。
- param1:表示请求必须包含名为 param1 的请求参数
- !param1:表示请求不能包含名为 param1 的请求参数
- param1!=value1:表示请求包含名为 param1 的请求参数,但是其值不能为 value1;或者,请求不包含名为 param1 的请求参数
- {“param1=value1”, “param2”}:表示请求必须包含名为 param1 和 param2 的两个请求参数,且 param1 请求参数的值必须为 value1
@Controller
public class HelloController {
@RequestMapping(value = "/test", method = RequestMethod.GET, params = {"name!=lgh", "age=24"})
public String test() {
System.out.println("Hello World");
return "hello";
}
}
使用 http://localhost:8080/SpringMVCDemo/test?age=24&name=lghtest
或者http://localhost:8080/SpringMVCDemo/test?age=24
才可以访问。
String[] headers() default {};
表示接收何种请求头的请求。
使用和param
参数类似。
String[] consumes() default {};
表示接收何种内容类型(Content-Type)的请求,例如application/json
, text/html
。
@Controller
public class HelloController {
@RequestMapping(value = "/test", method = RequestMethod.GET, consumes = "text/html")
public String test() {
System.out.println("Hello World");
return "hello";
}
}
curl -H “Content-Type: text/html” http://localhost:8080/SpringMVCDemo/test
又比如:
@RequestMapping(value = "/ceshi", method = RequestMethod.GET, consumes = "application/json")
@ResponseBody
public String test(@RequestBody String str) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
Person person = objectMapper.readValue(str, Person.class);
System.out.println(person);
return str;
}
String[] produces() default {};
表示接收request请求头中的(Accept)字段中包含该指定类型的请求。同时也暗示返回类型为该指定类型。
@Controller
public class HelloController {
@RequestMapping(value = "/test", method = RequestMethod.GET, produces = "application/json")
public String test() {
System.out.println("Hello World");
return "hello";
}
}
以上只是演示,真正使用过程应该如下:
@RequestMapping(value = "/produces", method = RequestMethod.GET, produces = "application/json; charset=UTF-8")
@ResponseBody
public Person testProduces() {
Person person = new Person();
person.setName("lgh");
person.setAge(25);
Address address = new Address();
address.setProvince("山东");
address.setCity("聊城");
person.setAddress(address);
return person;
}
Http报头Accept与Content-Type的区别:
1.Accept属于请求头, Content-Type属于实体头。
Http报头分为通用报头,请求报头,响应报头和实体报头。
请求方的http报头结构:通用报头|请求报头|实体报头
响应方的http报头结构:通用报头|响应报头|实体报头
2.Accept代表发送端(客户端)希望接受的数据类型。
比如:Accept: text/xml
代表客户端希望接受的数据类型是xml类型
Content-Type代表发送端(客户端|服务器)发送的实体数据的数据类型。
比如:Content-Type: text/html
代表发送端发送的数据格式是html。
二者合起来,
Accept: text/xml
Content-Type: text/html
即代表希望接受的数据类型是xml格式,本次请求发送的数据的数据格式是html。