SpringBoot中控制器的参数传递以及参数验证
Spring MVC中的处理器映射
控制器中使⽤注解@RequestMapping处理映射的过程:在Spring MVC项⽬中,项⽬启动阶段会将注解@RequestMapping所配置的内容保存到处理映射器(HandlerMapping)中,然年等待请求的发送,通过拦截请求信息与HandlerMapping进⾏匹配,到对应的处理器(包含控制器的逻辑),并将处理器以及保存到HandlerExecutionChain对象中,放回给DispatcherServlet,这样DispatcherServlet就可以运⾏它们了。可以看出HandlerMapping的主要任务就是请求定位到具体的处理器上。
下⾯为@RequestMapping注解的源码:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String name() default "";
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};
}
可以看出,在该注解中可以设置如下的属性值:
path和value的属性:设置URL映射的路径
method:限定响应的HTTP请求类型,如GET,POST,HEAD,OPTIONS,PUT,TRACE等,默认情况下可以接受所有请求
params:当存在对应的HTTP参数时才进⾏响应
headers:限定请求头中存在对应的参数时进⾏响应
consumes:限定HTTP请求体提交类型,如application/json,text/html
produces:限定返回的内容类型,仅当HTTP请求头中的类型包含Accept类型才返回
其中value属性是必须的配置项,⽽为了简化method的配置,在Spring4.3之后新增了如下注解分别对应不同的请求类型:
GetMapping
PostMapping
PatchMapping
PutMapping
DeleteMapping
其中PatchMapping,PutMapping和DeleteMapping常⽤在REST风格的项⽬设计中。
获取控制器参数
Spring MVC中处理器是控制器的包装,其在运⾏过程中会调⽤控制器中的⽅法,并在此之前对HTTP的参数和上下⽂信息进⾏解析,将它们转化为控制器所需的参数。下⾯对控制器如何获取请求的参数进⾏⽰例说明。
⽆注解下的参数传递
由于Spring中已经提供了⼤量的参数转化规则,所以在很多情况下并不需要对参数的获取进⾏设置。在默认情况下,参数运⾏为空,唯⼀要求为参数名称与Controller中⽅法的参数名保持⼀致:
@Controller
@RequestMapping("/param")
public class ParamController {
/**
* 默认参数传递
*/
@RequestMapping("/no/annotation")
@ResponseBody
public Map<String, Object> noAnnotation(Integer intVal, Long longVal, String str) {
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("inVal", intVal);
paramsMap.put("longVal", longVal);
paramsMap.put("str", str);
return paramsMap;
}
}
进⾏如下请求时:
localhost:8080/param/no/annotation?intVal=10&longVal=200
返回结果为
使⽤@RequestParam获取参数
当前端URL中的参数名与Controller⽅法中的参数名不⼀致时,可以使⽤@RequestParam注解来指定URL参数与⽅法参数之间的映射关系:
/**
* 参数对应关系设置
*/
@RequestMapping("/annotation")
@ResponseBody
public Map<String, Object> requestParam(@RequestParam(value = "int_val", required = false) Integer intVal,
@RequestParam(value = "long_val", required = false) Long longVal,
@RequestParam(value = "str_val", required = false) String str) {
Map<String, Object> params = new HashMap<>();
params.put("intVal", intVal);
params.put("longVal", longVal);
params.put("str", str);
return params;
}
在使⽤@RequestParam注解时,默认参数值不能为空,否则会出现异常信息。可以使⽤required属性指明参数是否运⾏为空即可。使⽤如下的URL进⾏请求:
localhost:8080/param/annotation?int_val=10&long_val=20&str_val=yitian
返回结果为:
传递数组
Spring MVC中允许以数组的⽅式进⾏参数的传递。数组类型的参数以逗号(,)分隔:
/**
* 数组参数传递
*/
@RequestMapping("/requestArray")
@ResponseBody
public Map<String, Object> requestArray(int[] intArr, Long[] longArr, String[] strArr) {
Map<String, Object> params = new HashMap<>();
params.put("intArr", intArr);
params.put("longArr", longArr);
params.put("strArr", strArr);
return params;
}
请求URL为:
localhost:8080/param/requestArray?intArr=10,11,12&longArr=20,30,40&strArr=yitian1,yitian2 返回结果为:
JSON数据的传递
在使⽤JSON格式进⾏数据传递时,简单建⽴⼀个⽤户注册的页⾯register.jsp:
<%@ taglib prefix="c" uri="java.sun/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Register</title>
<script type="text/javascript">
$(document).ready(function() {
$("#submit").click(function () {
var userName = $("#userName").val();
var note = $("#note").val();
var sex = $("#sex").val();
if (userName == '' || sex == '' || note == '') {
alert("表单参数需填满!");
return;
}
var params = {
userName: userName,
sex: sex,
note: note
};
$.post({
url: "./createUser",
contentType: "application/json",
data: JSON.stringify(params),
success: function (result) {
if (result == null || result.userName == null) {
alert("注册失败!");
return;
}
alert("注册成功!");
}
});
});spring ioc注解
});
</script>
</head>
<body>
<form id="insertForm" method="post">
<table>
<tr>
<td>⽤户名:</td>
<td><input id="userName" name="userName"></td>
</tr>
<tr>
<td>性别:</td>
<td><input id="sex" name="sex"></td>
</tr>
<tr>
<td>备注:</td>
<td><input id="note" name="note"></td>
</tr>
<tr>
<td></td>
<td align="right" ><input id="submit" type="button" value="SUBMIT"></td> </tr>
</table>
</form>
<div><a href="localhost:8080/web/index">返回⾸页</a></div>
</body>
</html>
controller类中代码如下:
/**
* 注册⽤户
*/
@RequestMapping(value = "/createUser", method = RequestMethod.POST)
@ResponseBody
public User createUser(@RequestBody User user) {
System.out.println(user);
userService.addUser(user);
return user;
}
提交表单后,请求后的返回值如下:
使⽤URL传递参数
在REST风格的请求中,常将参数在URL中以/param的⽅式进⾏传递,这时就需要使⽤@PathVariable注解从URL中获取相应的参数值:
/**
* URL路径参数传递
*/
@RequestMapping("/{id}")
@ResponseBody
public Long get(@PathVariable("id") Long id) {
return id;
}
相应的请求URL为:
localhost:8080/param/1
返回值即为:
获取格式化的参数
当使⽤⽇期或⾦额作为参数进⾏传递时,需要对⽇期和数字类型进⾏转换以格式化参数值。⽇期的参数处理注解为@DateTimeFormat,数字的为@NumberFormat。简单的使⽤下⾯的页⾯进⾏测试:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论