SpringMVC RequestMapping用法详解

SpringMVC 使用@RequestMapping 注解为Controller(控制器)指定可以处理哪些URL请求。所以,它本质上相当于web.xmlurl-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() 方法返回字符串,其他都返回数组,也就是说它们可以接收多个参数。


name

String name() default "";
为这个映射指定一个名字,在项目中,我们一般都不使用。

value & path

    @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


method

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";
    }
}

SpringMVC RequestMapping用法详解_第1张图片

public class HelloController {
    @RequestMapping(value = "/test", method = RequestMethod.POST)
    public String test(HttpServletRequest request) {
        System.out.println(request.getMethod());
        return "hello";
    }
}

如上,则只可以接收POST类型的请求。当我们使用GET方式访问时,则报错。
SpringMVC RequestMapping用法详解_第2张图片


params

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才可以访问。


headers

String[] headers() default {};
表示接收何种请求头的请求。
使用和param 参数类似。


consumes

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;
    }

SpringMVC RequestMapping用法详解_第3张图片

produces

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;
    }

SpringMVC RequestMapping用法详解_第4张图片


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。

你可能感兴趣的:(SpringMVC,SSM学习笔记)