16 SpringMVC 的请求参数的绑定与常用注解
1.SpringMVC 绑定请求参数
(1)支持的数据类型
基本类型参数:
包括基本类型和 String 类型
POJO 类型参数:
包括实体类,以及关联的实体类
数组和集合类型参数:
包括 List 结构和 Map 结构的集合(包括数组)
(2)使用要求
SpringMVC 绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求。
<1>如果是基本类型或者 String 类型:
要求我们的参数名称必须和控制器中方法的形参名称保持一致。(严格区分大小写)
<2>如果是 POJO 类型,或者它的关联对象:
要求form表单中参数名称和实体类javabean的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型。
SpringMVC 会将请求参数名和 POJO 属性名进行自动匹配, 自动为该对象填充属性值。
<3>如果是集合类型,有两种方式:
第一种:
要求集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。
给 List 集合中的元素赋值,使用下标。
给 Map 集合中的元素赋值,使用键值对。
第二种:
接收的请求参数是 json 格式数据。需要借助一个注解实现。
2.绑定请求参数代码测试
注意:以下代码的运行环境是day18_spring_test01_quickstart这个web工程
(1)请求参数为基本的数据类型
ParamsController.java这个控制器类
package lucky.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /** * 请求参数绑定 */ @Controller @RequestMapping(path = "/params") public class ParamsController { /** * 请求参数绑定入门 * @return */ @RequestMapping(path = "/testParam") public String testParam(String username,String password){ System.out.println("testParam方法执行了"); System.out.println("用户名:"+username+",密码:"+password); return "success"; } }
jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>params_bind</title> </head> <body> <%--请求参数的绑定--%> <a href="/day18_spring_test01_quickstart/params/testParam?username=lucky&password=plj666">请求参数绑定</a> </body> </html>
控制台输出:
(2)将请求参数封装到javabean中
Account.java
package lucky.domain; import java.io.Serializable; public class Account implements Serializable { private String username; private String password; private Double money; private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Double getMoney() { return money; } public void setMoney(Double money) { this.money = money; } @Override public String toString() { return "Account{" + "username='" + username + '\'' + ", password='" + password + '\'' + ", money=" + money + ", user=" + user + '}'; } }
User.java
package lucky.domain; import java.io.Serializable; public class User implements Serializable { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
ParamsController.java
package lucky.controller; import lucky.domain.Account; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /** * 请求参数绑定 */ @Controller @RequestMapping(path = "/params") public class ParamsController {/** * 把请求参数封装绑定到javabean的类中 * @return */ @RequestMapping(path = "/testParamAccount") public String testParamAccount(Account account){ System.out.println("testParamAccount方法执行了"); System.out.println(account); return "success"; } }
jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>params_bind</title> </head> <body> <%--请求参数的绑定--%> <%--name 属性用于对提交到服务器后的表单数据进行标识,或者在客户端通过 JavaScript 引用表单数据。--%> <%--只有设置了 name 属性的表单元素才能在提交表单时传递它们的值。--%> <%--注意:name属性值必须与javabean的成员变量名称一模一样,否则无法识别--%> <form action="/day18_spring_test01_quickstart/params/testParamAccount" method="post"> 姓名:<input type="text" name="username"><br> 密码:<input type="text" name="password"><br> 金额:<input type="text" name="money"><br> 用户名:<input type="text" name="user.name"><br> 年龄:<input type="text" name="user.age"><br> <input type="submit" value="提交"> </form> </body> </html>
控制台输出:
3.常用注解
(1)@RequestParam
<1>作用:把请求中指定名称的参数给控制器中的形参赋值。
<2>属性:
value:请求参数中的名称。
required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错。
<3>使用案例
AnnotationController.java
package lucky.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; /** * 常用的注解 * @RequestParam(value= "name") 把(annotation.jsp)请求中指定名称的参数(name)给控制器中的形参(username)赋值。 */ @Controller @RequestMapping(path = "/annotation") public class AnnotationController { @RequestMapping(path = "/testRequestParam") public String testRequestParam(@RequestParam(value= "name") String username){ System.out.println("执行了testRequestParam"); System.out.println(username); return "success"; } }
jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>annotation</title> </head> <body> <%--常用的注解--%> <a href="/day18_spring_test01_quickstart/annotation/testRequestParam?name=lucky">RequestParam</a> </body> </html>
(2)@PathVaribale
<1>作用:
用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。
url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 restful 风格 URL 的一个重要标志。
<2>属性:
value:用于指定 url 中占位符名称。
required:是否必须提供占位符。
<3>REST 风格的URL
REST(英文:Representational State Transfer,简称 REST)描述了一个架构样式的网络系统, 比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一。在目前主流的三种 Web 服务交互方案中,REST 相比于 SOAP(Simple Object Access protocol,简单对象访问协议)以及 XML-RPC 更加简单明了,无论是对 URL 的处理还是对 Payload 的编码,REST 都倾向于用更加简单轻量的方法设计和实现。值得注意的是 REST 并没有一个明确的标准,而更像是一种设计的风格。
它本身并没有什么实用性,其核心价值在于如何设计出符合 REST 风格的网络接口。
restful 的优点
它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
restful 的特性:
资源(Resources):网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的存在。可以用一个 URI(统一资源定位符)指向它,每种资源对应一个特定的 URI 。要获取这个资源,访问它的 URI 就可以,因此 URI 即为每一个资源的独一无二的识别符。
表现层(Representation):把资源具体呈现出来的形式,叫做它的表现层 (Representation)。比如,文本可以用 txt 格式表现,也可以用 HTML 格式、XML 格式、JSON 格式表现,甚至可以采用二进制格式。
状态转化(State Transfer):每 发出一个请求,就代表了客户端和服务器的一次交互过程。HTTP 协议,是一个无状态协议,即所有的状态都保存在服务器端。因此,如果客户端想要操作服务器, 必须通过某种手段,让服务器端发生“状态转化”(State Transfer)。而这种转化是建立在表现层之上的,所以就是 “ 表现层状态转化” 。具体说, 就是 HTTP 协议里面,四个表示操作方式的动词:GET 、POST 、PUT 、DELETE 。它们分别对应四种基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。
restful 的示例:
/account/1 HTTP GET : 得到 id = 1 的 account
/account/1 HTTP DELETE: 删除 id = 1 的 account
/account/1 HTTP PUT: 更新 id = 1 的 account
<4>使用案例
AnnotationController.java
package lucky.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; /** * 常用的注解 * @RequestParam(value= "name") 把(annotation.jsp)请求中指定名称的参数(name)给控制器中的形参(username)赋值。 */ @Controller @RequestMapping(path = "/annotation") public class AnnotationController { /** * PathVariable注解使用案例 * @param id * @return */ @RequestMapping(path = "/testPathVariable/{id}") public String testPathVariable(@PathVariable(value = "id") String id){ System.out.println("执行了testPathVariable"); System.out.println(id); return "success"; } }
jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>annotation</title> </head> <body> <%--常用的注解--%> <a href="/day18_spring_test01_quickstart/annotation/testPathVariable/10">PathVariable</a> </body> </html>
(3)@RequestBody
作用:@RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容(json数据)转换为java对象并绑定到Controller方法的参数上。
相关代码:
/** * 模拟异步请求 * springmvc会自动的将json数据转为javabean对象 */ @RequestMapping(path = "/testAjax") public @ResponseBody User testAjax(@RequestBody User user) throws Exception{ System.out.println("testAjax方法执行了"); System.out.println(user); //模拟查询数据库操作 user.setUsername("linda"); user.setAge(31); return user; }
注意:一般情况下,推荐使用@RequestParam注解来接受Http请求参数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)