![dcc126de6bdfcbf27062a935fbe6bf5a.png](https://img-blog.csdnimg.cn/img_convert/dcc126de6bdfcbf27062a935fbe6bf5a.png)
一、请求信息的传入
- Spring MVC通过分析控制器处理方法的参数签名,将HTTP请求信息(参数、请求头、Cookie值)绑定到处理方法的相应入参中。
- 必要时可以对方法及方法入参标注相应的注解(@PathVariable、@RequestParam、@RequestHeader等)。
二、@RequestParam注解
在控制器的处理方法入参处使用 @RequestParam可以把请求参数传递给请求方法。
2.1、@RequestParam注解源码分析
@RequestParam注解源码:
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default ValueConstants.DEFAULT_NONE;
}
@RequestParam注解可以接受的参数:
- value —— 参数名。
- required —— 是否必须。默认为 true, 表示请求参数中必须包含对应的参数,若不存在,将抛出异常。
- defaultValue —— 默认值,当没有传递参数时使用该值。
2.2、@RequestParam注解的示例
控制器的处理方法:
@RequestMapping(value="/testRequestParam")
public String testRequestParam(
@RequestParam(value="username") String username,
@RequestParam(value="age", required=false, defaultValue="0") int age){
System.out.println("testRequestParam - username="+username+",age="+age);
return "success";
}
客户端请求该URL接口时,必须要携带一个username参数,而age参数不是必须的,它也包含默认值0。
三、@RequestHeader注解
在控制器的处理方法入参处使用@RequestHeader可以把请求头信息传递给请求方法。
3.1、@RequestHeader注解的源码分析
@RequestHeader注解源码:
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestHeader {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default ValueConstants.DEFAULT_NONE;
}
@RequestHeader注解能接受的参数和@RequestParam注解相同。
3.2、@RequestHeader注解的示例
控制器的处理方法:
@RequestMapping(value="/testRequestHeader")
public String testRequestHeader(@RequestHeader("User-Agent") String userAgent){
System.out.println("testRequestHeader - User-Agent:"+userAgent);
return "success";
}
客户端请求这个URL接口时,testRequestHeader方法能够获取客户端的用户代理信息。
四、@CookieValue注解
在控制器的处理方法入参处使用@CookieValue注解可以把Cookie信息传递给请求方法。
4.1、@CookieValue注解的源码分析
@CookieValue注解的源码:
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CookieValue {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default ValueConstants.DEFAULT_NONE;
}
@CookieValue注解能接受的参数和@RequestHeader注解、@RequestParam注解相同。
4.2、@CookieValue注解的示例
控制器的处理方法:
@RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue("JSESSIONID") String sessionId) {
System.out.println("testCookieValue: sessionId: " + sessionId);
return "success";
}
客户端请求这个URL接口时,testCookieValue方法能够获取客户端携带的JSESSIONID这个Cookie的信息,如果客户端没有携带,则请求会失败。
五、使用POJO作为参数
Spring MVC会按请求参数名和POJO属性名进行自动匹配,自动为该对象填充属性值。并且支持级联属性。
5.1、使用POJO作为参数的示例
1)新建一个POJO
public class Student {
private String name;
private int age;
public Student() {}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
// 这里省略getter、setter、toString方法
}
2)新建一个控制器的处理方法
@RequestMapping("/testPOJO")
public String testPojo(Student student) {
System.out.println("testPojo: " + student);
return "success";
}
3)测试
携带参数name和age请求该URL接口,Spring MVC就会自动将这两个参数注入到testPojo方法的参数Student对象中。
5.2、级联属性的示例
1)新建一个Teacher类,并将上面的Student类进行修改
Teacher.java:
public class Teacher {
private String name;
private int age;
public Teacher() {}
public Teacher(String name, int age) {
this.name = name;
this.age = age;
}
// 这里省略getter、setter、toString方法
}
Student.java:
public class Student {
private String name;
private int age;
private Teacher teacher;
public Student() {}
public Student(String name, int age, Teacher teacher) {
this.name = name;
this.age = age;
this.teacher = teacher;
}
// 这里省略getter、setter、toString方法
}
2)控制器的处理方法
@RequestMapping("/testPOJO")
public String testPojo(Student student) {
System.out.println("testPojo: " + student);
return "success";
}
3)测试
携带参数name、age、teacher.name、teacher.age请求该URL接口,Spring MVC就会自动将这四个参数分别注入到testPojo方法的参数Student对象以及Student对象包含的Teacher对象中。