SpringMVC接收数据
param参数接收
当形参名与URL携带参数名相同时,可以直接接收
@Controller @ResponseBody @RequestMapping("param") public class ParamController { @GetMapping("data01") public String data01(String name, int age) { System.out.println("name" + name + " age" + age); return "name:" + name + "\nage" + age; } }
@RequestParam注解
可以使用 @RequestParam
注释将 Servlet 请求参数(即查询参数或表单数据)绑定到控制器中的方法参数。
@RequestParam
使用场景:
基本用法:
-
指定绑定的请求参数名
-
要求请求参数必须传递
-
为请求参数提供默认值
/** * 前端请求: http://localhost:8080/param/data?name=xx&stuAge=18 * * 使用@RequestParam注解标记handler方法的形参 * 指定形参对应的请求参数@RequestParam(请求参数名称) */ @GetMapping(value="/data") @ResponseBody public Object paramForm(@RequestParam("name") String name, @RequestParam("stuAge") int age){ System.out.println("name = " + name + ", age = " + age); return name+age; }
默认情况下,使用此批注的方法参数是必需的,但您可以通过将 @RequestParam
批注的 required
标志设置为 false
!
将参数设置非必须,并且设置默认值
@GetMapping(value="/data") @ResponseBody public Object paramForm(@RequestParam("name") String name, @RequestParam(value = "stuAge",required = false,defaultValue = "18") int age){ System.out.println("name = " + name + ", age = " + age); return name+age; }
一名多值(复选框)
可以通过集合进行接收,但是必须加上@RequestParam
@GetMapping("data02") public Object data02(@RequestParam("hbs") List<String> hobbys) { System.out.println("hobbys" + hobbys); return hobbys; }
也可以通过实体接收
package org.lin.pojo; import lombok.Data; @Data public class User { private String name; private int age; } @PostMapping("data03") public Object data03(User user) { System.out.println("user" + user); return "ok"; }
路径参数接收
路径传递参数是一种在 URL 路径中传递参数的方式。在 RESTful 的 Web 应用程序中,经常使用路径传递参数来表示资源的唯一标识符或更复杂的表示方式。而 Spring MVC 框架提供了 @PathVariable
注解来处理路径传递参数。
@PathVariable
注解允许将 URL 中的占位符映射到控制器方法中的参数。
例如,如果我们想将 /user/{id}
路径下的 {id}
映射到控制器方法的一个参数中,则可以使用 @PathVariable
注解来实现。
下面是一个使用 @PathVariable
注解处理路径传递参数的示例:
/** * 动态路径设计: /user/{动态部分}/{动态部分} 动态部分使用{}包含即可! {}内部动态标识! * 形参列表取值: @PathVariable Long id 如果形参名 = {动态标识} 自动赋值! * @PathVariable("动态标识") Long id 如果形参名 != {动态标识} 可以通过指定动态标识赋值! * * 访问测试: /param/user/1/root -> id = 1 uname = root */ @GetMapping("/user/{id}/{name}") @ResponseBody public String getUser(@PathVariable Long id, @PathVariable("name") String uname) { System.out.println("id = " + id + ", uname = " + uname); return "user_detail"; }
JSON数据接收
定义实体类
package org.lin.pojo; import lombok.Data; @Data public class User { private String name; private int age; private String gender; }
定义控制器
@PostMapping("data04") @ResponseBody public Object data04(@RequestBody User user) { System.out.println("user" + user); // 在这里可以使用 person 对象来操作 JSON 数据中包含的属性 return "success"; }
在上述代码中,@RequestBody
注解将请求体中的 JSON 数据映射到 Person
类型的 person
参数上,并将其作为一个对象来传递给 data04()
方法进行处理。
此时用postman进行测试会出现以下问题
原因:
-
不支持json数据类型处理
-
没有json类型处理的工具(jackson)
添加依赖
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.18.1</version> </dependency>
在配置文件中添加注解
@EnableWebMvc // 配置json转换器
@EnableWebMvc
注解效果等同于在 XML 配置中,可以使用<mvc:annotation-driven>
元素
<mvc:annotation-driven>
对应的解析工作
class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { public static final String HANDLER_MAPPING_BEAN_NAME = RequestMappingHandlerMapping.class.getName(); public static final String HANDLER_ADAPTER_BEAN_NAME = RequestMappingHandlerAdapter.class.getName(); static { ClassLoader classLoader = AnnotationDrivenBeanDefinitionParser.class.getClassLoader(); javaxValidationPresent = ClassUtils.isPresent("jakarta.validation.Validator", classLoader); romePresent = ClassUtils.isPresent("com.rometools.rome.feed.WireFeed", classLoader); jaxb2Present = ClassUtils.isPresent("jakarta.xml.bind.Binder", classLoader); jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader) && ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", classLoader); jackson2XmlPresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", classLoader); jackson2SmilePresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.smile.SmileFactory", classLoader); jackson2CborPresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.cbor.CBORFactory", classLoader); gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", classLoader); } @Override @Nullable public BeanDefinition parse(Element element, ParserContext context) { //handlerMapping加入到ioc容器 readerContext.getRegistry().registerBeanDefinition(HANDLER_MAPPING_BEAN_NAME, handlerMappingDef); //添加jackson转化器 addRequestBodyAdvice(handlerAdapterDef); addResponseBodyAdvice(handlerAdapterDef); //handlerAdapter加入到ioc容器 readerContext.getRegistry().registerBeanDefinition(HANDLER_ADAPTER_BEAN_NAME, handlerAdapterDef); return null; } //具体添加jackson转化对象方法 protected void addRequestBodyAdvice(RootBeanDefinition beanDef) { if (jackson2Present) { beanDef.getPropertyValues().add("requestBodyAdvice", new RootBeanDefinition(JsonViewRequestBodyAdvice.class)); } } protected void addResponseBodyAdvice(RootBeanDefinition beanDef) { if (jackson2Present) { beanDef.getPropertyValues().add("responseBodyAdvice", new RootBeanDefinition(JsonViewResponseBodyAdvice.class)); } }
配置json转换器后测试结果如下
接收cookie与请求头数据
接收cookie
可以使用 @CookieValue
注释将 HTTP Cookie 的值绑定到控制器中的方法参数。
考虑使用以下 cookie 的请求:
JSESSIONID=415A4AC178C59DACE0B2C9CA727CDD84
下面的示例演示如何获取 cookie 值:
@GetMapping("/demo") public void handle(@CookieValue("JSESSIONID") String cookie) { //... }
接收请求头
可以使用 @RequestHeader
批注将请求标头绑定到控制器中的方法参数。
请考虑以下带有标头的请求:
Host localhost:8080 Accept text/html,application/xhtml+xml,application/xml;q=0.9 Accept-Language fr,en-gb;q=0.7,en;q=0.3 Accept-Encoding gzip,deflate Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive 300
下面的示例获取 Accept-Encoding
和 Keep-Alive
标头的值:
@GetMapping("/demo") public void handle( @RequestHeader("Accept-Encoding") String encoding, @RequestHeader("Keep-Alive") long keepAlive) { //... }标签:String,RequestParam,age,无标题,参数,public,name From: https://blog.csdn.net/HDLLXL/article/details/144172326