SpringMVC 参数的接收和处理

一.请求参数的接收

1.1servlet中如何接收参数?
request.getParameter(name), request.getParameterValues(name). 方法的特点:
a)参数要求是表单域的name属性;
b)getParameter方法用于获取单个值, 返回类型是String;
c)getParameterValues方法用于获取一组数据, 返回结果是String[];
d)冗余代码较多, 使用麻烦, 类型需要自己转换
1.2.使用SpringMVC进行参数接收
  1. 简化参数接收形式(不需要调用任何方法, 需要什么参数, 就在控制器方法中提供什么参 数)
  2. 参数类型不需要自己转换了. 日期时间得注意, 需要使用@DateTimeFormat注解声明日期转换时遵循的格式, 否则抛出400异常.
  3. 还可以自动将参数封装为对象.
1.3.代码实现
<form action="/demo" method="post">
  用户名: <input type="text" name="username"><br>
  年龄: <input type="text" name="age"><br>
  婚否: <input type="radio" name="married" value="true" />已婚
  <input type="radio" name="married" value="false" />未婚<br>
  爱好: <input type="checkbox" name="hob" value="java"> java
  <input type="checkbox" name="hob" value="php"> php
  <input type="checkbox" name="hob" value="python"> python<br>
  生日: <input type="text" name="birthday" placeholder="yyyy-MM-dd"><br>
  住址: <input type="text" name="address.city"><br>
  收货地址: <input type="text" name="addrs[0].city"><br>
  <input type="text" name="addrs[1].city"><br>
  <input type="submit" value="提交">
</form>
@Controller
public class DemoController {
    @RequestMapping("/demo")
    public String demo2(User user) {
        System.out.println("user = " + user);
        return "index.jsp";
    }

    @RequestMapping("/demo1")
    public String demo1(String username, int age, String[] hob,
               @DateTimeFormat(pattern = "yyyy-MM-dd") Date birthday) {
        System.out.println("username = " + username);
        System.out.println("age = " + age);
        System.out.println("hob = " + Arrays.toString(hob));
        System.out.println("birthday = " + birthday);
        return "index.jsp";
    }
}

二.请求参数的进阶处理

  • 解决参数名称不匹配的问题, 解决基本类型参数接收问题; Restful风格参数的传递.

2.1@RequestParam注解的使用

用于对请求参数进行处理, 该注解有三个属性:
  1. value | name: 表示前台传参的名称, 如果前台传递的参数名和方法使用的参数名一致, 可以省略不写.
  2. required: 布尔值, 表示参数是否必须. 默认为true, 表示该参数必须传递.
  3. defaultValue: 默认值. 当某个参数前台没有传递或传递的是空字符串, 此时, 默认值就会生效.
<%--参数名称不匹配和基本类型问题--%>
<a href="demo?page=2&size=5">同名传参</a><br>
<a href="demo?param_1=1&param_2=10">不同名传参</a><br>
<a href="demo">没有参数传递</a><br>
<a href="demo?param_1=">空串传参</a>
@RequestMapping("/demo")
public String demo(
        @RequestParam(value = "param_1", defaultValue = "1") int page,
        @RequestParam(name = "param_2", defaultValue = "10") int size) {
    System.out.println("page = " + page);
    System.out.println("size = " + size);
    return "index.jsp";
}
2.2Restful风格参数传递

传统形式参数传递: http://xxx/xxx?name1=value1&name2=value2…
Restful风格传参: http://xxx/xxx/value1/value2/…
从访问路径中获取参数, 需要使用注解: @PathVariable

<%--Restful风格传参--%>
<a href="demo2/zhangsan/123">Restful</a>
@RequestMapping("/demo2/{username}/{pswd}")
public String demo2(
        @PathVariable String username,
        @PathVariable("pswd") String password) {
    System.out.println("username = " + username);
    System.out.println("password = " + password);
    return "/index.jsp";
}

三.@RequestMapping详解

该注解用于为后端控制器方法映射访问路径, 同时, 还可以对访问路径进行限制(窄化). 该注解可以用在方法上, 表示给方法映射访问路径; 还可以用在控制器类上, 表示对当前控制器下所有的方法添加访问前缀路径. 常用属性介绍:

  1. value | path: 字符串数组, 代表映射到该控制器方法的所有访问路径;
    当配置为: @RequestMapping("/demo1"), 能匹配的路径有:
  • http://localhost:8080/demo1
  • http://localhost:8080/demo1.xxx
  • http://localhost:8080/demo1/
  1. method: RequestMethod数组, 表示当前控制器方法允许处理的请求方式. 默认允许所有请求方式. spring4.3后提供了两个简化注解: @GetMapping和@PostMapping
/**
 * 当前方法用于处理get请求
 *
 * @return
 */
// @RequestMapping(method = RequestMethod.GET)
@GetMapping
public String demo3() {
    System.out.println("DemoController.demo3: GET");
    return "/index.jsp";
}

/**
 * 当前方法用于处理post请求
 *
 * @return
 */
// @RequestMapping(method = RequestMethod.POST)
@PostMapping
public String demo2() {
    System.out.println("DemoController.demo2: POST");
    return "/index.jsp";
}
  1. params: 字符串数组, 表示对请求携带的参数进行限制. 要求请求中必须携带指定的参数, 否则抛出异常. token
/**
 * 要求必须传递username和password参数
 * 而且username的值必须是admin
 * 
 * @param username
 * @param password
 * @return
 */
@PostMapping(path = "/demo2", params = {"username=admin", "password"})
public String demo4(String username, String password) {
    System.out.println("DemoController.demo4");
    return "/index.jsp";
}
  1. produces: 字符串数组, 用于设置响应头信息. 需要配合另外一个注解一起使用, 叫@ResponseBody
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章