现在我们已经完成了一个无参的接口了,但是应用中有很多需要携带参数的场景,我们来看看 ** 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

Spring学习之旅(八)--SpringMVC请求参数的更多相关文章

  1. Spring学习之旅(六)--SpringMVC集成

    对大多数 Java 开发来说,基于 web 的应用程序是我们主要的关注点. Spring 也提供了对于 web 的支持,基于 MVC 模式的 Spring MVC 能够帮助我们灵活和松耦合的完成 we ...

  2. Spring学习之旅(九)--SpringMVC高级技术

    文件上传 在 Web 应用中,允许用户上传文件是很常见的需求.文件上传通常是采用 multipart 格式,而 DispatcherServlet 并没有任何解析 multipart 请求数据的功能, ...

  3. Spring学习之旅(七)--SpringMVC视图

    在之前的实例中我们只是在 Controller 中返回了 home 字符类型的值,而没有直接生成可以在浏览器中直接渲染的 HTML,这是因为 SpringMVC 将请求处理的逻辑和视图渲染的实现进行了 ...

  4. Spring学习之旅(十)--MockMvc

    在之前的 Spring学习之旅(八)--SpringMVC请求参数 我们是通过在控制台输出来验证参数是否正确,但是这样做实在是太耗时间了,我们今天来学习下 MockMvc,它可以让我们不需要启动项目就 ...

  5. Spring学习之旅(八)Spring 基于AspectJ注解配置的AOP编程工作原理初探

    由小编的上篇博文可以一窥基于AspectJ注解配置的AOP编程实现. 本文一下未贴出的相关代码示例请关注小编的上篇博文<Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AO ...

  6. SpringMVC请求参数接收总结

    前提 在日常使用SpringMVC进行开发的时候,有可能遇到前端各种类型的请求参数,这里做一次相对全面的总结.SpringMVC中处理控制器参数的接口是HandlerMethodArgumentRes ...

  7. SpringMVC请求参数接收总结(一)

    前提 在日常使用SpringMVC进行开发的时候,有可能遇到前端各种类型的请求参数,这里做一次相对全面的总结.SpringMVC中处理控制器参数的接口是HandlerMethodArgumentRes ...

  8. SpringMVC请求参数总结

    前提 在日常使用SpringMVC进行开发的时候,有可能遇到前端各种类型的请求参数,这里做一次相对全面的总结.SpringMVC中处理控制器参数的接口是HandlerMethodArgumentRes ...

  9. 2.5万字长文简单总结SpringMVC请求参数接收

    这是公众号<Throwable文摘>发布的第22篇原创文章,暂时收录于专辑<架构与实战>.暂定下一篇发布的长文是<图文分析JUC同步器框架>,下一篇发布的短文是&l ...

随机推荐

  1. c语言进阶4-有返回值函数

    一.         从函数返回 从函数返回就是返回语句的第一个主要用途.在程序中,有两种方法可以终止函数的执行,并返回到调用函数的位置.第一种方法是在函数体中,从第一句一直执行到最后一句,当所有语句 ...

  2. oracle分隔字符串列转行

    1. DEMO: SELECT REGEXP_SUBSTR('1,2', '[^,]+', 1, LEVEL)          FROM DUAL        CONNECT BY REGEXP_ ...

  3. golang从context源码领悟接口的设计

    注:写帖子时go的版本是1.12.7 go语言中实现一个interface不用像其他语言一样需要显示的声明实现接口.go语言只要实现了某interface的方法就可以做类型转换.go语言没有继承的概念 ...

  4. java一个类 继承HttpServlet 和实现Servlet区别

    java一个类 继承HttpServlet 和实现Servlet区别 servlet 是一个接口,如果实现这个接口,那么就必须实现接口里面定义的所有方法 而HttpServlet实现了servlet接 ...

  5. 入门训练-4. Fibonacci数列

    问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n ...

  6. string的学习

    原:https://blog.csdn.net/qq_37941471/article/details/82107077 一. string的构造函数的形式: string str:生成空字符串 st ...

  7. Python实现淘宝秒杀聚划算自动提醒源码

    快来加入群[python爬虫交流群](群号570070796),发现精彩内容. 本实例能够监控聚划算的抢购按钮,在聚划算整点聚的时间到达时发出提醒(音频文件自己定义位置)并自动弹开页面(URL自己定义 ...

  8. 面试必谈的哈希,.Net 程序员温故而知新

    引言: 作为资深老鸟,有事没事,出去面试:找准差距.定位价值. 面试必谈哈希, Q1:什么是哈希? Q2:哈希为什么快? Q3:你是怎么理解哈希算法利用空间换取时间的? Q4:你是怎么解决哈希冲突的? ...

  9. python 简单的实现文件内容去重

    文件去重 这里主要用的是set()函数,特别地,set中的元素是无序的,并且重复元素在set中自动被过滤. 测试文本为 data.txt 具体代码如下: // 文件去重 #!/usr/bin/env ...

  10. MOCTF-Crypt-writeup

    MOctf Crypt Writeup记录 都不难,就随便记录记录下. MOCTF平台地址:http://www.moctf.com 0x01 数据库密码 hint:20岁的小刚,自幼热爱信息安全,一 ...