SpringMVC接收数据
SpringMVC涉及组件理解:
- DispatcherServlet : SpringMVC提供,我们需要使用web.xml配置使其生效,它是整个流程处理的核心,所有请求都经过它的处理和分发![ CEO ]
- HandlerMapping : SpringMVC提供,我们需要进行IoC配置使其加入IoC容器方可生效,它内部缓存handler(controller方法)和handler访问路径数据,被DispatcherServlet调用,用于查找路径对应的handler![秘书]
- HandlerAdapter : SpringMVC提供,我们需要进行IoC配置使其加入IoC容器方可生效,它可以处理请求参数和处理响应数据数据,每次DispatcherServlet都是通过handlerAdapter间接调用handler,他是handler和DispatcherServlet之间的适配器![经理]
- Handler : handler又称处理器,他是Controller类内部的方法简称,是由我们自己定义,用来接收参数,向后调用业务,最终返回响应结果![打工人]
- ViewResovler : SpringMVC提供,我们需要进行IoC配置使其加入IoC容器方可生效!视图解析器主要作用简化模版视图页面查找的,但是需要注意,前后端分离项目,后端只返回JSON数据,不返回页面,那就不需要视图解析器!所以,视图解析器,相对其他的组件不是必须的![财务]
1 访问路径设置
@RequestMapping注解的作用就是将请求的URL地址和处理请求的方式(handler方法)关联起来,建立映射关系
SpringMVC接收到指定的请求,就回来找到在映射关系中对应的方法来处理这个请求。
@Controller
@RequestMapping("")
public class UserController {
//handler -> handlerMapping 制定访问地址
/**
* @ WebServlet("必须使用/开头“)
* @ RequestMapping(不是必须使用/开头) user/login /user/login
*
* 1. 精准地址 [一个 | 多个] /user/login {"地址1","地址2"}
* 2. 支持模糊 * 任意一层字符串 | ** 任一层任意字符串
* /user/* -> user/a user/aaaa 可以 /user/a/b 不行
* /user/** ->user user/a user/a/a/a/aa/aa/a
* 3. 类上和方法上添加@RequestMapping的区别
* 类上提取通用的访问地址
* 方法上是具体的handler地址
* 访问:类地址 + 方法地址即可
* 4. 请求方式指定
* 客户端 -> http(get | post | Put|delete) ->DispatcherServlet ->handler
* 默认情况:@RequestMapping("Login") 只要地址正确 任何请求方式都可以访问
* 制定请求方式 method = {RequestMethod.GET,RequestMethod.POST}
* 不符合请求方式 会出现405异常
* 5. 注解进阶 只能使用在方法上
* get @GetMapping == @RequestMapping(xxx,method=GET)
* post @PostMapping == @RequestMapping(xxx,method=Post)
* delete @DeleteMapping == @RequestMapping(xxx,method=Delete)
* put @PutMapping == @RequestMapping(xxx,method=Put)
*/
@RequestMapping
@GetMapping //get请求地址
public String index(){
}
//@RequestMapping(value = "login",method = RequestMethod.POST) //作用注册地址 将handler注册到handlerMapping
@PostMapping("login")
public String login(){
return null;
}
@RequestMapping(value = "register",method = {RequestMethod.GET,RequestMethod.POST})
public String register(){
return null;
}
}
2 接收参数(重点!!)
2.1 param和json参数比较
Param: key = value & key = value
JSON {key:value,key:value}
在 HTTP 请求中,我们可以选择不同的参数类型,如 param 类型和 JSON 类型。下面对这两种参数类型进行区别和对比:
-
参数编码:
param 类型的参数会被编码为 ASCII 码。例如,假设
name=john doe
,则会被编码为name=john%20doe
。而 JSON 类型的参数会被编码为 UTF-8。 -
参数顺序:
param 类型的参数没有顺序限制。但是,JSON 类型的参数是有序的。JSON 采用键值对的形式进行传递,其中键值对是有序排列的。
-
数据类型:
param 类型的参数仅支持字符串类型、数值类型和布尔类型等简单数据类型。而 JSON 类型的参数则支持更复杂的数据类型,如数组、对象等。
-
嵌套性:
param 类型的参数不支持嵌套。但是,JSON 类型的参数支持嵌套,可以传递更为复杂的数据结构。
-
可读性:
param 类型的参数格式比 JSON 类型的参数更加简单、易读。但是,JSON 格式在传递嵌套数据结构时更加清晰易懂。
总的来说,param 类型的参数适用于单一的数据传递,而 JSON 类型的参数则更适用于更复杂的数据结构传递。根据具体的业务需求,需要选择合适的参数类型。在实际开发中,常见的做法是:在 GET 请求中采用 param 类型的参数,而在 POST 请求中采用 JSON 类型的参数传递。
注意: @ResponseBody
注解可以用来表示方法或者方法返回值,标识方法的返回值是要放在响应体中直接返回给客户端的数据,而不是有视图解析器来解析并渲染生成响应体。
2.2 param参数接收
2.2.1 直接接收
/**
* 直接接收
* param: /param/data?name=root&age=18
* 形参列表 填写对应名称的参数即可! 请求参数名 = 形参参数名即可
* @return
*/
@RequestMapping("data")
@ResponseBody
public String data(String name,Integer age){
//当前端没传来相应数据时,比如name没传 那么name就是默认值
System.out.println("name = " + name + ", age = " + age);
return "name = " + name + ", age = " + age;
}
2.2.2 注解指定
/**
* 注解指定
* 指定任意的请求参数名 要求必须传递 或者给予一个默认值
* param: /param/data1?account=root&page=1
*
* @ RequestParam -> 形参列表 指定请求参数名 或者是否必须传递 或者非必须传递设置默认值
* 用法: @RequestParam(value="指定请求参数名", 如果形参名和请求参数名一致 可以省略
* required=false/true,前端是否必须传递参数,默认是true 必须传递 不传400异常
* defaultValue="字符串" 当非必须传递时 可以设置默认值)
*
* @ RequestParam(value = "account") String username 默认此时account必须传递 否则会报错
* 当函数变量名与路径变量名不同时,使用value来指定此变量接受的路径变量值
*
* @ RequestParam(required = false,defaultValue = "1") int page
* 由于required=false(默认为true 必须传递) 可以不传递 不传递时为默认值defaultValue1
*/
@GetMapping("data1")
public String data1(@RequestParam(value = "account") String username ,
@RequestParam(required = false,defaultValue = "1") int page){
System.out.println("username = " + username + ", page = " + page);
return "username = " + username + ", page = " + page;
}
2.2.3 特殊值:一名多值
/**
* 特殊值:一名多值 key=1&key=2 直接使用集合接值即可
* param: /param/data?hbs=吃&hbs=喝&hbs=学习
* 不加注解@RequestParam 将hbs对应的一个字符串直接赋值给集合 类型异常
* 加了注解 经理就会将集合 add方法加入对应的字符串
*/
@GetMapping("data2")
@ResponseBody
public String data2(@RequestParam List<String> hbs){
System.out.println("hbs = " + hbs);
return "ok";
}
2.2.4 使用实体对象接值
/**
* 使用实体对象接值
* param: /param/data?name=二狗子&age=18
* 准备一个对应属性和get|set方法的实体类即可! 形参列表声明对象参数即可 注意:类的属性名必须要等于路径变量名
*/
@RequestMapping("data3")
@ResponseBody
public String data3(User user) {
Integer age = user.getAge();
String name = user.getName();
System.out.println("name = " + name + "age = " + age);
return "name = " + name + "age = " + age;
}
2.3 路径参数接收
路径传递参数是一种在 URL 路径中传递参数的方式。在 RESTful 的 Web 应用程序中,经常使用路径传递参数来表示资源的唯一标识符或更复杂的表示方式。而 Spring MVC 框架提供了 @PathVariable
注解来处理路径传递参数。
@PathVariable
注解允许将 URL 中的占位符映射到控制器方法中的参数。
例如,如果我们想将 /user/{id}
路径下的 {id}
映射到控制器方法的一个参数中,则可以使用 @PathVariable
注解来实现。
下面是一个使用 @PathVariable
注解处理路径传递参数的示例:
/**
* param: /path/{account}/{password} 比如/path/root/123456
* 动态路径设计 {key} = * 用{key}可以在形参列表获取传入的参数
* 接收路径参数:使用@PathVariable 代表接受动态路径参数 参数与@Param类似
* 不使用@PathVariable 则为param的直接接收 此时就接收不到动态路径参数了
*/
@RequestMapping("{account}/{password}")
public String login(@PathVariable(value = "account",required = false) String username,@PathVariable String password){
System.out.println("username = " + username + ", password = " + password);
return "username = " + username + ", password = " + password;
}
2.4 JSON参数接收
前端传递 JSON 数据时,Spring MVC 框架可以使用 @RequestBody
注解来将 JSON 数据转换为 Java 对象。@RequestBody
注解表示当前方法参数的值应该从请求体中获取,并且需要指定 value 属性来指示请求体应该映射到哪个参数上。其使用方式和示例代码如下:
/**
* 接收JSON数据
* 使用@RequestBody注解
* Java原生的api 只支持路径参数和param参数 request.getParam("key");param
* 不支持json json是前端的格式
* 解决方法:1导入json处理依赖
* 2 handlerAdapter配置json转化器 在配置类上加入@EnableWebMvc //handlerAdapter配置json转化器
*/
@PostMapping("data")
public String data(@RequestBody Person person){
System.out.println("person = " + person);
return person.toString();
}
JSON依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.0</version>
</dependency>
2.5 接收Cookie数据
/**
* cookie接收
* 使用@CookieValue 参数value=接收的Cookie名
*/
@RequestMapping("data")
public String data(@CookieValue(value = "cookieName") String value){
System.out.println("value = " + value);
return value;
}
2.6 接收请求头
/**
* 接收请求头
* @ RequestHeader
*/
@GetMapping("data")
public String data(@RequestHeader("Host") String host){
System.out.println("host = " + host);
return "host = " + host;
}
3 总结
接收参数
1. 路径设置
@RequestMapping(value = "地址",method="请求方式")
@GetMapping / @PostMapping 方法
2. 接收参数【重点】
param
直接接收 handler(类型 形参名) 形参名=请求参数名s
注解指定 handler(@RequestParam(name="请求参数名",required = true,defaultValue="默认值"))
一名多值 handler(@RequestParam List keys)
实体接收 hadnler(实体 对象) 对象的属性名 = 请求参数名
路径参数
设置动态路径和标识 /{key}/info/{key}
接受路径 handler(@PathVariable(动态路径key) 类型 形参名)
json
数据接收 handler(@RequestBody 实体类 对象)
准备工作:
1. 导入jackson依赖
2. @EnableWebMVC【加入了handlerMapping 加入了handlerAdapter 配置json处理器】
3. cookie接收
handler(@CookieValue("cookie的名字"))
4. 请求头对象接收
handler(@RequestHeader("header的名字"))
5. 原生api获取
handler(httpServletRequest,response,session)
ServletContext -> ioc -> 全局变量 @Autowired