当前位置:   article > 正文

SpringMVC数据接收(全面/详细注释)

SpringMVC数据接收(全面/详细注释)

 SpringMVC涉及组件:

  1. DispatcherServlet :  SpringMVC提供,我们需要使用web.xml配置使其生效,它是整个流程处理的核心,所有请求都经过它的处理和分发![ CEO ]
  2. HandlerMapping :  SpringMVC提供,我们需要进行IoC配置使其加入IoC容器方可生效,它内部缓存handler(controller方法)和handler访问路径数据,被DispatcherServlet调用,用于查找路径对应的handler![秘书]
  3. HandlerAdapter : SpringMVC提供,我们需要进行IoC配置使其加入IoC容器方可生效,它可以处理请求参数和处理响应数据数据,每次DispatcherServlet都是通过handlerAdapter间接调用handler,他是handler和DispatcherServlet之间的适配器![经理]
  4. Handler : handler又称处理器,他是Controller类内部的方法简称,是由我们自己定义,用来接收参数,向后调用业务,最终返回响应结果![打工人]
  5. ViewResovler : SpringMVC提供,我们需要进行IoC配置使其加入IoC容器方可生效!视图解析器主要作用简化模版视图页面查找的,但是需要注意,前后端分离项目,后端只返回JSON数据,不返回页面,那就不需要视图解析器!所以,视图解析器,相对其他的组件不是必须的![财务]

1.快速体验使用MVC接收数据

  1. 在Maven项目中新建模块并转换成Web项目

  2. 导入依赖

    1. <properties>
    2. <spring.version>6.0.6</spring.version>
    3. <servlet.api>9.1.0</servlet.api>
    4. <maven.compiler.source>17</maven.compiler.source>
    5. <maven.compiler.target>17</maven.compiler.target>
    6. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    7. </properties>
    8. <dependencies>
    9. <!-- springioc相关依赖 -->
    10. <dependency>
    11. <groupId>org.springframework</groupId>
    12. <artifactId>spring-context</artifactId>
    13. <version>${spring.version}</version>
    14. </dependency>
    15. <!-- web相关依赖 -->
    16. <!-- 在 pom.xml 中引入 Jakarta EE Web API 的依赖 -->
    17. <!--
    18. 在 Spring Web MVC 6 中,Servlet API 迁移到了 Jakarta EE API,
    19. 因此在配置 DispatcherServlet 时需要使用Jakarta EE 提供的相应类库和命名空间。
    20. -->
    21. <dependency>
    22. <groupId>jakarta.platform</groupId>
    23. <artifactId>jakarta.jakartaee-web-api</artifactId>
    24. <version>${servlet.api}</version>
    25. <scope>provided</scope>
    26. </dependency>
    27. <!-- springwebmvc相关依赖 -->
    28. <dependency>
    29. <groupId>org.springframework</groupId>
    30. <artifactId>spring-webmvc</artifactId>
    31. <version>${spring.version}</version>
    32. </dependency>
    33. </dependencies>
  3. 创建Controller类

    1. @Controller
    2. @RequestMapping("param")
    3. public class ParamController {
    4. //后端直接接收
    5. // /param/data?name=root&age=18
    6. // 形参列表,填写对应名称的参数即可! 请求参数名 = 形参参数名即可!
    7. // 1. 名称相同 2.可以不传递 不报错
    8. @RequestMapping("data")
    9. @ResponseBody
    10. public String data(String name,int age){
    11. System.out.println("接收到:name = " + name + ", age = " + age);
    12. return "成功给前端返回:name = " + name + ", age = " + age;
    13. }
    14. }
  4. Spring MVC核心组件配置类

    1. @Configuration
    2. @ComponentScan("com.example")
    3. public class MvcConfig {
    4. //@Bean方式配置handlerMapper和handlerAdapter
    5. @Bean
    6. public RequestMappingHandlerMapping handlerMapping(){
    7. return new RequestMappingHandlerMapping();
    8. }
    9. @Bean
    10. public RequestMappingHandlerAdapter handlerAdapter(){
    11. return new RequestMappingHandlerAdapter();
    12. }
    13. }
  5. SpringMVC环境搭建

    1. /**
    2. * description: 可以被web项目加载,会初始化ioc容器,会设置dispatcherServlet的地址
    3. * @author UserName
    4. */
    5. public class SpringMvcInit extends AbstractAnnotationConfigDispatcherServletInitializer {
    6. // service mapper层的ioc容器的配置
    7. @Override
    8. protected Class<?>[] getRootConfigClasses() {
    9. return new Class[0];
    10. }
    11. // 设置我们项目对应的配置 springmvc controller
    12. @Override
    13. protected Class<?>[] getServletConfigClasses() {
    14. return new Class[]{MvcConfig.class};
    15. }
    16. // 配置springmvc内部自带servlet 的访问地址 !
    17. @Override
    18. protected String[] getServletMappings() {
    19. return new String[]{ "/"};
    20. }
    21. }
  6. 运行测试      ​​​​​

2.SpringMVC数据接收

@ResponseBody注解

用来标识方法或者方法返回值,表示方法的返回值是要直接返回给客户端的数据,而不是由视图解析器来解析并渲染生成响应体(viewResolver没用)。

    1.访问路径设置

        1.1 在@RequestMapping注解指定精确地址匹配。
  1. @Controller
  2. public class HelloController {
  3. @RequestMapping("springmvc/hello") //对外访问的地址 到handlerMapping注册的注解
  4. @ResponseBody //直接返回字符串给前端,不要找视图解析器!!!
  5. public String hello(){
  6. System.out.println("HelloController.hello");
  7. //返回给前端
  8. return "hello springmvc!!";
  9. }
  10. }
        1.2 通过使用通配符,匹配多个类似的地址。
  1. @Controller
  2. public class HelloController {
  3. @RequestMapping("springmvc/*")
  4. @ResponseBody //直接返回字符串给前端,不要找视图解析器!!!
  5. public String handleAllBooks() {
  6. // 匹配所有以 /books/ 开头的路径
  7. System.out.println("匹配到一层springmvc/*");
  8. return "一层springmvc/*";
  9. }
  10. @RequestMapping("springmvc/**")
  11. @ResponseBody //直接返回字符串给前端,不要找视图解析器!!!
  12. public String handleBookDetails() {
  13. // 匹配所有以 /books/ 开头的路径及其子路径
  14. System.out.println("匹配到多层springmvc/**");
  15. return "多层springmvc/**";
  16. }
  17. }

                运行访问:

  1. ###
  2. GET http://localhost:8080/springmvc/aaa
  3. ###
  4. GET http://localhost:8080/springmvc/aaa/bb
  5. //输出:
  6. springmvc/*
  7. springmvc/**
        1.3 标记类+标记handler方法
  1. @Controller
  2. @RequestMapping("springmvc")
  3. public class HelloController {
  4. @RequestMapping("hello")//底层是字符串拼接,但mvc会自动加“/”号
  5. @ResponseBody //直接返回字符串给前端,不要找视图解析器!!!
  6. public String hello() {
  7. System.out.println("hello mvc");
  8. return "hello mvc";
  9. }
  10. }

                运行访问:

  1. ###
  2. GET http://localhost:8080/springmvc/aaa/bb
  3. //输出:
  4. hello mvc
        1.4 附带请求方式限制

默认情况下:@RequestMapping("/logout") 任何请求方式都可以访问!

@RequestMapping(value="/login",method=RequestMethod.GET)
等于->
@GetMapping(value="/login")

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping

可以特定指定,但违背请求方式,会出现405异常!!!:

  1. @Controller
  2. public class UserController {
  3. /**
  4. * method = RequestMethod.POST 可以指定单个或者多个请求方式!
  5. * 注意:违背请求方式会出现405异常!
  6. */
  7. @RequestMapping(value = {"/user/login"} , method = RequestMethod.POST)
  8. @ResponseBody
  9. public String login(){
  10. System.out.println("UserController.login");
  11. return "login success!!";
  12. }
  13. // @PostMapping(value = {"/user/login"})
  14. // @ResponseBody
  15. // public String login1(){
  16. // System.out.println("UserController.login");
  17. // return "login success!!";
  18. // }
  19. @RequestMapping(value = {"/user/register"},method = {RequestMethod.POST, RequestMethod.GET})
  20. @ResponseBody
  21. public String register(){
  22. System.out.println("UserController.register");
  23. return "register success!!";
  24. }
  25. }

 2.param参数接收

  1. @Controller
  2. @RequestMapping("param")
  3. public class ParamController {
  4. //后端直接接收
  5. // /param/data?name=root&age=18
  6. // 形参列表,填写对应名称的参数即可! 请求参数名 = 形参参数名即可!
  7. // 1. 名称相同 2.可以不传递 不报错
  8. @RequestMapping("data")
  9. @ResponseBody
  10. public String data(String name,int age){
  11. System.out.println("name = " + name + ", age = " + age);
  12. return "成功给后台返回:name = " + name + ", age = " + age;
  13. }
  14. //注解指定
  15. //指定任意的请求参数名 要求必须传递 要求不必须传递 给与一个默认值
  16. // /param/data1?account=root&page=1
  17. // account必须传递 page可以不必须传递,如果不传递默认值就是1
  18. /**
  19. * @RequestParam -> 形参列表 指定请求参数名 或者是否必须传递 或者 非必须传递设置默认值
  20. * 用法: @RequestParam(value="指定请求参数名,如果形参名和请求参数名一致,可以省略!",
  21. * required = false 前端是否必须传递此参数,默认是必须 , 不传400异常!,
  22. * defaultValue = "1" 当非必须传递 false ,可以设置默认值)
  23. */
  24. @GetMapping("data1")
  25. @ResponseBody
  26. public String data1(@RequestParam(value = "account") String username,
  27. @RequestParam(required = false,defaultValue = "1") int page){
  28. System.out.println("username = " + username + ", page = " + page);
  29. return "username = " + username + ", page = " + page;
  30. }
  31. //特殊值
  32. // 一名多值 key=1&key=2 直接使用集合接值即可
  33. //param/data2?hbs=吃&hbs=玩&hbs=学习
  34. //不加注解@RequestParam 将 hbs对应的一个字符串直接赋值给集合! 类型异常!
  35. //加了注解,经理就会将集合 add加入对应的字符串
  36. @GetMapping("data2")
  37. @ResponseBody
  38. public String data2(@RequestParam List<String> hbs){
  39. System.out.println("hbs = " + hbs);
  40. return "ok";
  41. }
  42. //使用实体对象接值 用户注册(用户的信息) -》 对应的实体类 -》 插入到数据库 表
  43. //param/data3?name=二狗子&age=18 准备一个对应属性和get|set方法的实体类即可! -> 形参列表声明对象参数即可!
  44. @RequestMapping("data3")
  45. @ResponseBody
  46. public String data3(User user){
  47. System.out.println("user = " + user);
  48. return user.toString();
  49. }
  50. }

测试data3:

3. 动态路径参数接收

动态路径设计: /user/{动态部分}/{动态部分}

  1. @Controller
  2. @RequestMapping("path")
  3. @ResponseBody
  4. public class PathController {
  5. // path/账号/密码
  6. //动态路径设计 {key} = * {key} 在形参列表获取传入的参数
  7. //接受路径参数 String account,String password -> 接受param格式参数
  8. // 必须使用 @PathVariable
  9. @RequestMapping("{account}/{password}")
  10. public String login(@PathVariable(value = "account") String username, @PathVariable String password){
  11. System.out.println("username = " + username + ", password = " + password);
  12. return "username = " + username + ", password = " + password;
  13. }
  14. }

运行测试:

4. JSON参数接收

前端传递 JSON 数据时,Spring MVC 框架可以使用 @RequestBody 注解来将 JSON 数据转换为 Java 对象。@RequestBody 注解表示当前方法参数的值应该从请求体中获取,并且需要指定 value 属性来指示请求体应该映射到哪个参数上

实体类:
  1. public class Person {
  2. private String name;
  3. private int age;
  4. private String gender;
  5. // getter 和 setter 略
  6. }
使用 @RequestBody 注解
  1. @RequestMapping(value = "json")
  2. @Controller
  3. @ResponseBody
  4. public class JsonController {
  5. @PostMapping("data")
  6. public String data(@RequestBody Person person) {
  7. System.out.println("person = " + person);
  8. return person.toString();
  9. }
  10. }
pom.xml 加入jackson依赖
  1. <dependency>
  2. <groupId>com.fasterxml.jackson.core</groupId>
  3. <artifactId>jackson-databind</artifactId>
  4. <version>2.15.0</version>
  5. </dependency>
使用@EnableWebMvc配置
  1. /*TODO: 导入handlerMapping和handlerAdapter的三种方式
  2. 1.自动导入handlerMapping和handlerAdapter [推荐]
  3. 2.可以不添加,springmvc会检查是否配置handlerMapping和handlerAdapter,没有配置默认加载
  4. 3.使用@Bean方式配置handlerMapper和handlerAdapter
  5. */
  6. @EnableWebMvc//handlerAdapter配置了json转化器
  7. @Configuration
  8. @ComponentScan("com.example")
  9. public class MvcConfig {
  10. //@Bean
  11. //public RequestMappingHandlerMapping handlerMapping(){
  12. // return new RequestMappingHandlerMapping();
  13. //}
  14. //@Bean
  15. //public RequestMappingHandlerAdapter handlerAdapter(){
  16. // return new RequestMappingHandlerAdapter();
  17. //}
  18. }
运行测试:

或者前端使用Axios:

  1. axios.post('/json/datas', {
  2. name: "Lucy",
  3. age: 18,
  4. gender: "man"
  5. })

 5.Cookie参数接收

    1. 定义向响应中添加Cookie数据的方法。创建了一个名为 "cookieName",值为 "root" 的Cookie,并通过 response.addCookie(cookie) 将其添加到响应中,成功后返回“ok”。
    2.使用 @CookieValue 注解来接收名为 "cookieName" 的Cookie的值。
  1. @Controller
  2. @RequestMapping("cookie")
  3. @ResponseBody
  4. public class CookieController {
  5. @GetMapping("save")
  6. public String save(HttpServletResponse response){
  7. Cookie cookie = new Cookie("cookieName","这是一个cookieName");
  8. response.addCookie(cookie);
  9. return "ok";
  10. }
  11. @RequestMapping("data")
  12. public String data(@CookieValue(value = "cookieName") String value){
  13. System.out.println("value = " + value);
  14. return value;
  15. }
  16. }
运行测试:

                

6.  请求头数据接收

  1. @Controller
  2. @RequestMapping("header")
  3. @ResponseBody
  4. public class HeaderController {
  5. @GetMapping("data")
  6. public String data(@RequestHeader("Host") String host){
  7. System.out.println("host = " + host);
  8. return "host = " + host;
  9. }
  10. }

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号