SpringMVC

1.什么是SpringMVC

1、SpringMVC是一个Web框架

2、SpringMVC是基于Servlet API构建的

但是要深层次的理解SpringMVC,我们就需要搞清楚什么是MVC

1.1 MVC的定义

MVC是Model View Controller 的缩写,它是软件工程的一种软件架构模式,他把软件系统分为模型、视图和控制器三个基本部分。

  • **Model(模型):**使应用程序中用于处理应用程序数据逻辑部分,通常模型对象负责在数据库中存取数据
  • **View(视图):**是应用程序中处理数据的显示的部分,通常视图时依据模型数据创建的。
  • **Controller(控制器):**是应用程序中处理用户交互的部分,通常控制器负责从事途中读取数据,控制用户输入,并向模型发送数据。

1.2 MVC执行流程

1、用户请求首相发到Controller

2、Controller将请求转发给Model

3、Model处理业务并将数据结果给Controller

4、Controller会将数据给View引擎

5、View转换数据生成最终的页面给用户

2. 如何学习Spring MVC

学习Spring MVC我们只需要掌握一下三个功能:

  1. **连接的功能:**将用户和Java程序连接,也就是范文一个地址就能够调用我们的Spring程序
  2. **获取参数的功能:**用户访问的时候会带一些参数,在程序中要想办法获取到参数
  3. **输出数据的功能:**执行业务逻辑之后,要把程序执行的结果返回给用户

2.1 创建Spring MVC项目

Spring MVC 可以基于 Spring Boot 创建,也就是创建⼀个 Spring Boot 项⽬,勾选上 Spring Web 模块即可,如下图所示:

创建一个UserController类,实现用户到Spring程序的互联互通

java 复制代码
@RestController
@RequestMapping("/user")//路由器规则注册
public class UserController {
    @RequestMapping("/hi")
    public String sayHi(){
        return "<h1>sayHi</h1>";
    }
}

2.2 @RequestMapping基础使用

@RequestMapping即可以修饰类,亦可以修饰方法,当修饰了·方法时访问地址就是注解中的参数:类+方法

2.2.1@RequestMapping是post还是get请求?

我们可以使用Postman测试一下:

测试可知既可以接受Post也可以接受get方法

2.1.2 指定GET/POST方法类型

我们可以显示指定@RequestMapping来接受POST的情况

java 复制代码
@RestController
@RequestMapping("/user")//路由器规则注册
public class UserController {
    @RequestMapping(value = "/hi",method = RequestMethod.POST)
    public String sayHi(){
        return "<h1>sayHi</h1>";
    }
}

此时我们使用postman发送一个get请求就接受不到了

GET请求的三种写法:

java 复制代码
// 写法1
@RequestMapping("/index")
// 写法2
@RequestMapping(value = "/index",method = RequestMethod.GET)
// 写法3
@GetMapping("/index")

POST的两种写法:

java 复制代码
// 写法1
@RequestMapping(value = "/index",method = RequestMethod.POST)
// 写法2
@PostMapping("/index")

2.2 获取参数

2.2.1 传递单个参数

在Spring MVC中可以直接用方法中的参数来实现传参

java 复制代码
@RestController
@RequestMapping("/user")//路由器规则注册
public class UserController {
    @RequestMapping(value = "/hi",method = RequestMethod.POST)
    public String sayHi(){
        return "<h1>sayHi</h1>";
    }
    @RequestMapping("/test")
    public String test(String name){
        return name;
    }
}

使用Postman 发送请求

2.2.2 传递对象

Spring MVC可以自动实现参数对象赋值

java 复制代码
@Data
public class Person {
    private String name;
    private String password;
    private int id;
}


@RestController
@RequestMapping("/user")//路由器规则注册
public class UserController {
    @RequestMapping(value = "/hi",method = RequestMethod.POST)
    public String sayHi(){
        return "<h1>sayHi</h1>";
    }
    @RequestMapping("/test")
    public String test(String name){
        return name;
    }
    @RequestMapping("/test2")
    public void test2(Person person){
        System.out.println(person.getName());
        System.out.println(person.getPassword());
        System.out.println(person.getId());
    }
}

Postman发送请求

最终执行结果;

2.2.3 后端参数重命名

某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不⼀致,⽐如前端传递了⼀个 name 给后端,⽽后端⼜是有 name111 字段来接收的,这样就会出现参数接收不到的情况,如果出现 这种情况,我们就可以使⽤ @RequestParam 来重命名前后端的参数值

java 复制代码
    @RequestMapping("/test3")
    public String test3(@RequestParam("name")String name111){
        return name111;
    }

Postman返回结果:

2.2.4 @RequestBody接受JSON对象

我们在postman中构造一个json数据

java 复制代码
    @RequestMapping("test4")
    public void test4(@RequestBody(required = false) Person person){
        System.out.println(person);
    }

我们可以尝试去掉@RequestBody试试,

@RequestBody 是Spring框架中的一个注解,用于指示一个方法参数应该从请求的body部分中获取数据。通常在处理POST请求时使用,特别是当请求的数据是JSON格式时。

2.2.5 获取URL中参数@PathVariable

后端实现代码:

java 复制代码
    @RequestMapping("/test5/{name}/{password}")
    public void test5(@PathVariable String name,@PathVariable String password){
        System.out.println(name);
        System.out.println(password);
    }

Postman发送请求:

运行结果:

注意事项:@PostMapping("test5/lisi/123")不可以省略

2.2.6 上传文件@RequestPart

我们上传一个照片文件为例子:

java 复制代码
    @RequestMapping("/test6")
    public String test6(@RequestPart("myfile")MultipartFile file) throws IOException {
        //生成一个唯一的id|UUID=全球唯一id
        String name = UUID.randomUUID().toString().replace("-","");
        //得到源文件的后缀名
        name+=(file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")));
        String path = "D:\\test\\"+name;
        //保存文件
        file.transferTo(new File(path));
        return path;
    }

Postman发送请求:

2.2.7 获取Cookie/Session/header

获取Session

java 复制代码
private static String _SESSION_KEY = "SESSION_KEY";    
@RequestMapping("/set_sess")
    public String setSess(HttpServletRequest request){
        HttpSession session = request.getSession();
        if(session != null){
            session.setAttribute(_SESSION_KEY,"张三");
            return "session set success";
        }else{
            return "session set fail";
        }
    }
    @RequestMapping("/get_sess")
    public String getSess(@SessionAttribute(required = false,value = "SESSION_KEY")String name){
        return name;
    }

Postman运行结果:

获取Cookie

java 复制代码
    @RequestMapping("/getcookie")
    public String getCookie(@CookieValue(value="java",required = false)String ck){
        return ck;
    }

获取Header

java 复制代码
@RequestMapping("/header")
@ResponseBody
public String header(@RequestHeader("User-Agent") String userAgent) {
   return "userAgent:"+userAgent;
}
相关推荐
BUG指挥官9 小时前
Sa-Token和Spring Security对比
java·后端·spring
geminigoth9 小时前
Spring AI Alibaba 入门开发一(备份)
java·人工智能·spring
xbgRS11 小时前
spring整合mybaits
java·spring·mybatis
ruleslol12 小时前
静态依赖注入 VS 动态依赖查询
spring
墨雨晨曦8814 小时前
Spring AI总结
java·人工智能·spring
用户31268748772016 小时前
Spring Boot 异常处理到底怎么玩的?从 DispatcherServlet 到全局兜底的全链路拆解
spring
不才不才不不才17 小时前
Spring 源码系列(17): HandlerMapping 与 HandlerAdapter 两大体系
java·后端·spring
(轻舟已过万重山)17 小时前
第40章 Spring AI 实战:企业级 AI 应用架构
人工智能·spring·架构
堕落年代1 天前
Ollama CPU 推理大提示词优化实测报告(细致化数据版)
java·后端·spring
cfm_29141 天前
基于OAuth2.0实现微服务SSO单点登录
后端·spring·微服务·架构