Spring学习之旅(八)--SpringMVC请求参数

现在我们已经完成了一个无参的接口了,但是应用中有很多需要携带参数的场景,我们来看看 ** SpringMVC** 对它的支持。

参数绑定

SpringMVC 提供了一种绑定机制,通过这个机制可以从请求中提取数据,然后将数据转换为预定义的数据格式,最后映射到一个模型类,从而创建一个对象。该实现机制只需请求参数名称与 Java 类的属性相匹配即可。

SpringMVC 允许以多种方式将客户端的数据传送到** Controller**方法中:

  • 查询参数
  • 表单参数
  • 路径变量

查询参数和表单参数

1.新建 RequestParameterController 类

@Controller
public class RequestParameterController {
    @RequestMapping("/requestParameterPage")
    public String index(){
        return "index";
    }
    @RequestMapping("/toInt")
    public String toInt(int count){
        System.out.println("基本数据类型:"+count);
        return "index";
    }
    @RequestMapping("/toInteger")
    public String toInteger(Integer integer){
        System.out.println("包装数据类型:"+integer);
        return "index";
    }
    @RequestMapping("/toObject")
    public String toObject(User item){
        System.out.println("自定义数据类型:name:"+item.getUserName()+";age:"+item.getAge());
        return "index";
    }
    @RequestMapping("/toInt2")
    public String toInt2(@RequestParam(value = "id")int count){
        System.out.println("参数名词不一致基本数据类型:"+count);
        return "index";
    }
    @RequestMapping("/toArray")
    public String toArray(String[] id){
        System.out.println("数组对象:"+ Arrays.asList(id));
        return "index";
    }
    @RequestMapping("/toDefault")
    public String toDefault(@RequestParam(value = "userAge" ,defaultValue = "0",required=false) Integer age){
        System.out.println("age:"+ age);
        return "index";
    }
}

2.新建 index 页面

<html>
	<head></head>
	<body>
	    <a href="/test/toInt?count=1">基本数据</a><br>
	    <a href="/test/toInteger?integer=2">包装数据类型</a><br>
	    <a href="/test/toObject?userName=marklogzhu&&age=18">自定义数据类型</a><br>
	    <a href="/test/toInt2?id=1">参数名词不一致基本数据</a><br>
	    <a href="/test/toArray?id=1&id=2&id=3">数组对象</a><br>
		<a href="/test/toDefault?userAge=25">参数名与方法名不一致,通过@RequestParam注解</a><br>
	</body>
</html>

3.依次点击,查看控制台输出

数组对象:[1, 2, 3]
基本数据类型:1
包装数据类型:2
自定义数据类型:name:marklogzhu;age:18
参数不一致基本数据类型:1
数组对象:[1, 2, 3]
age:25

路径变量

像上面参数传送方式都需要客户端指定参数名称

/toObject?name=marklogzhu&age=18

但是我们也可以通过请求路径来实现参数传递:

@RequestMapping(value = "/toPath/{index}")
@ResponseBody
public void toPath(@PathVariable("index") String index) {
    System.out.println(index);
}
/toPath/999

如果请求参数少并且一定会有值的话,这种方式也是相当简便的。


参数校验

在客户端调用接口的时候,后端通常需要检查一下客户端传递的参数有效性,一般情况下会有一大堆的 IF 代码存在,例如:

@RequestMapping("/toObject")
@ResponseBody
public String toUser(User user) {
    if (user == null) {
        return "参数有误";
    }
    if (user.getAge() <= 0) {
        return "用户年龄有误";
    }
    if (StringUtils.isEmpty(user.getName())) {
        return "用户姓名有误";
    }
    return "成功";
}

我们之前提到过 Spring 最根本的使命就是 简化Java开发,自然 SpringMVC 也为我们提供了参数校验的支持以避免这种代码的出现。详情请看 参数校验工具-BeanValidator

posted @ 2019-08-23 15:47  MarkLogZhu  阅读(168)  评论(0)    收藏  举报