SpringMVC 请求数据传入

请求处理方法签名

  • Spring MVC 对控制器处理方法签名的限制是很宽松的,几乎可以按喜欢的任何方式对方法进行签名。
  • 必要时可以对方法及方法入参标注相应的注解( @PathVariable 、@RequestParam、@RequestHeader 等)、
  • Spring MVC 框架会将 HTTP 请求的信息绑定到相应的方法入参中,并根据方法的返回值类型做出相应的后续处理。

@RequestParam注解

  • 在处理方法入参处使用 @RequestParam 可以把请求参数传递给请求方法
  • value:参数名
  • required:是否必须。默认为 true, 表示请求参数中必须包含对应的参数,若不存在,将抛出异常
  • defaultValue: 默认值,当没有传递参数时使用该值

实验代码

  1. 增加控制方法
    1
    2
    3
    4
    5
       @RequestMapping("testRequestParam")
    public String testRequestParam(@RequestParam(value="username")String username, @RequestParam(value="age")Integer age) {
    System.out.println("testRequestParam---username:"+username+",age:"+age);
    return "success";
    }
  2. 页面链接代码
    1
    <a href="testRequestParam?username=atguigu&age=10">testRequestParam</a>

@RequestHeader注解

  • 使用 @RequestHeader 绑定请求报头的属性值
  • 请求头包含了若干个属性,服务器可据此获知客户端的信息,通过 @RequestHeader 即可将请求头中的属性值绑定到处理方法的入参中
  • 也有三个参数value、defaultValue、required

实验代码

  1. 控制器代码
    1
    2
    3
    4
    5
    @RequestMapping("testRequestHeader")
    public String testRequestHeader(@RequestHeader(value="User-Agent")String aa) {
    System.out.println("testRequestHeader---UserAgent" + aa);
    return "success";
    }
  2. 页面链接
    1
    <a href="testRequestHeader">testRequestHeader</a>

@CookieValue注解

  • 使用 @CookieValue 绑定请求中的 Cookie 值
  • @CookieValue 可让处理方法入参绑定某个 Cookie 值
  1. 控制器代理
    1
    2
    3
    4
    5
       @RequestMapping("testCookieMethod")
    private String testCookieMethod(@CookieValue(value="JSESSIONID")String sessionID) {
    System.out.println("Cookie:JSESSIONID="+sessionID);
    return "success";
    }
  2. 页面链接
    1
    <a href="testCookieMethod">testCookieMethod</a>

使用POJO作为参数

  • 使用 POJO 对象绑定请求参数值
  • Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配,自动为该对象填充属性值。支持级联属性。如:dept.deptId、dept.address.tel 等
  1. 控制器方法

    1
    2
    3
    4
    5
    @RequestMapping("testPOJO")
    public String testPOJO(Person person) {
    System.out.println(person);
    return "success";
    }
  2. 表单页面代码

    1
    2
    3
    4
    5
    6
    7
    8
    <form action=" testPOJO" method="POST">
    username: <input type="text" name="name"/><br>
    password: <input type="password" name="pwd"/><br>
    email: <input type="text" name="email"/><br>
    gender: <input type="text" name="gender"/><br>

    <input type="submit" value="Submit"/>
    </form>
  3. 增加实体类

    1
    2
    3
    4
    5
    6
    7
    8
    public class Person {
    private String name;
    private String pwd;
    private String gender;
    private String email;

    //getter/setter
    }

使用POJO出现乱码如何解决?

  • 如果中文有乱码,需要配置字符编码过滤器,且配置其他过滤器之前,
    如(HiddenHttpMethodFilter),否则不起作用。(思考method=”get”请求的乱码问题怎么解决的)
    1
    2
    3
    4
    5
    6
    7
    8
    请求乱码:
    GET请求: 改server.xml,在8080端口处URIEncoding=”UTF-8”
    POST请求: 在第一次请求参数之前设置
    Request.setCharacterEncoding(“UTF-8”)
    自定义Filter, SpringMVC
    封装有org.springframework.web.filter.CharacterEncodingFilter
    响应乱码:
    Response.setContentType(“text/html;charset=utf-8”)

过滤器配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

使用Servlet原生API作为参数

  • MVC 的 Handler 方法可以接受哪些 ServletAPI 类型的参数
    1) HttpServletRequest
    2) HttpServletResponse
    3) HttpSession
    4) java.security.Principal
    5) Locale
    6) InputStream
    7) OutputStream
    8) Reader
    9) Writer

  • 源码参考:AnnotationMethodHandlerAdapter L866

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
          @Override
    protected Object resolveStandardArgument(Class<?> parameterType, NativeWebRequest webRequest) throws Exception {
    HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
    HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);

    if (ServletRequest.class.isAssignableFrom(parameterType) ||
    MultipartRequest.class.isAssignableFrom(parameterType)) {
    Object nativeRequest = webRequest.getNativeRequest(parameterType);
    if (nativeRequest == null) {
    throw new IllegalStateException(
    "Current request is not of type [" + parameterType.getName() + "]: " + request);
    }
    return nativeRequest;
    }
    else if (ServletResponse.class.isAssignableFrom(parameterType)) {
    this.responseArgumentUsed = true;
    Object nativeResponse = webRequest.getNativeResponse(parameterType);
    if (nativeResponse == null) {
    throw new IllegalStateException(
    "Current response is not of type [" + parameterType.getName() + "]: " + response);
    }
    return nativeResponse;
    }
    else if (HttpSession.class.isAssignableFrom(parameterType)) {
    return request.getSession();
    }
    else if (Principal.class.isAssignableFrom(parameterType)) {
    return request.getUserPrincipal();
    }
    else if (Locale.class.equals(parameterType)) {
    return RequestContextUtils.getLocale(request);
    }
    else if (InputStream.class.isAssignableFrom(parameterType)) {
    return request.getInputStream();
    }
    else if (Reader.class.isAssignableFrom(parameterType)) {
    return request.getReader();
    }
    else if (OutputStream.class.isAssignableFrom(parameterType)) {
    this.responseArgumentUsed = true;
    return response.getOutputStream();
    }
    else if (Writer.class.isAssignableFrom(parameterType)) {
    this.responseArgumentUsed = true;
    return response.getWriter();
    }
    return super.resolveStandardArgument(parameterType, webRequest);
    }

实验代码

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×