SpringMVC 程序开发

SpringMVC 程序开发


文章目录


什么是SpringMVC?

  1. Spring MVC 是一个 Web 框架。
  2. Spring MVC 是基于 Servlet API 构建的。

然而要真正的理解什么是 Spring MVC ? 我们首先要搞清楚什么是 MVC?

MVC定义

  • 它是一种软件工程架构模式,它把系统分为模型,视图和控制器三个基本部分
  • Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据
  • View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的
  • Controller(控制器)是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据

MVC和Spring MVC的关系

  • MVC是一种思想,而Spring MVC是对MVC思想的具体体现
  • Spring MVC是一个实现MVC模式,并继承了Servlet API的Web框架。既然是Web框架,那么当用户在浏览器中输入url之后,我们的Spring MVC项目就可以感知到用户的请求

为什么要学Spring MVC?

大部分 Java 项目基于 Spring(或 Spring Boot) ,而 Spring 的核心是 Spring MVCSpring Boot 是 Spring 的脚手架,所以市面上绝大部分 Java 项目相当于 Spring MVC 项目,这是学习 Spring MVC 的原因。创建 Spring Boot 项目时勾选的 Spring Web 框架就是 Spring MVC 框架,简言之,学习 Spring MVC 是因为它是 Spring、Spring Boot 项目的基础

  • 简单的来说,我们之所以要学Spring MVC 是因为它是一切项目的基础,我们以后要创建的所有Spring 和 Spring Boot 项目,基本上都是基于Spring MVC的

怎么学习Spring MVC

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

  1. 连接的功能:将用户(浏览器)和 Java 程序连接起来,也就是访问一个地址能够调用到我们的 Spring 程序
  2. 获取参数的功能:用户访问的时候会带一些参数,在程序中要想办法获取到参数
  3. 输出数据的功能:执行了业务逻辑之后,要把程序执行的结果返回给用户
    对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了 Spring MVC

Spring MVC创建和连接

  • Spring MVC 项目创建和 Spring Boot 创建项目相同(Spring MVC 使用 Spring Boot 的方式创建),在创建的时候选择 Spring Web 就相当于创建了 Spring MVC 的项目
  • 在 Spring MVC 中使用 @RequestMapping 来实现 URL 路由映射,也就是浏览器连接程序的作用
  • 接下来要实现的功能是访问地址:http://localhost:8080/hello/Spring,能打印"Hello,Spring"信息
  1. 创建项目

  2. 代码

java 复制代码
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/hello")
public class Hello {
    @RequestMapping("/Spring")
    public String sayHello() {
        System.out.println("Hello, Spring!");
        return "Hello, Spring!";
    }
}

@RequestMapping注解

  • @RequestMapping 是 Spring MVC 中最核心、最基础的一个注解,它用于将 Web 请求(如 HTTP 请求)映射到特定的处理类(Controller)或处理方法上。简单来说,它告诉 Spring,当用户访问一个特定的 URL 时,应该由哪个类或哪个方法来处理这个请求

  • 可使用在类上和方法上,假如修饰的是类 的话,访问地址是类➕方法 。假如修饰的是方法 的话,访问地址就是方法

  1. 类:
java 复制代码
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/hello")
public class Hello {
    @RequestMapping("/Spring")
    public String sayHello() {
        System.out.println("Hello, Spring!");
        return "Hello, Spring!";
    }
}

地址:http://localhost:8080/hello/Spring

  1. 方法:
java 复制代码
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class Hello {
    @RequestMapping("/Spring")
    public String sayHello() {
        System.out.println("Hello, Spring!");
        return "Hello, Spring!";
    }
}

地址:http://localhost:8080/Spring

@RequestMapping是post还是get请求

  • @RequestMapping默认是get请求,可以使用Postman进行测试
  • 如何接收post请求?
java 复制代码
 @RequestMapping(value = "/message", method = RequestMethod.POST)
    public String message(String name, int age) {
        return "Hello " + name + " " + age;
    }
  • @GetMapping和@PostMapping
  1. get
java 复制代码
// 写法1
@RequestMapping("/index")

// 写法2
@RequestMapping(value = "/index",method = RequestMethod.GET)

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

// 写法2
@PostMapping("/index")

获取参数

  1. 传递单个参数
java 复制代码
@RequestMapping("/m1")
public Object method_1(String name){
    System.out.println("参数 name: "+name);
    return "/index.html";
}
  1. 传递对象
java 复制代码
@Data  
public class Person {  
    private int id;  
    private String name;  
    private String password;  
}


@RequestMapping("/m2")
public Object method_2(Person p){
    System.out.println("对象中的 name: "+p.getName());
    System.out.println("对象中的 password: "+p.getPassword());
    return "/index.html";
}
  1. 表单参数传递/传递多个对象
java 复制代码
@RequestMapping("/m3")
public Object method_3(String name, String pwd) {
    System.out.println("name 参数: " + name);
    System.out.println("pwd 参数: " + pwd);
    return "/index.html";
}
  1. 后端参数重命名(后端参数映射)
  • 某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不一致,比如前端传递了一个 time 给后端,而后端又是有 createtime 字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使用 @RequestParam 来重命名前后端的参数值
java 复制代码
@RequestMapping(value = "/password", method = RequestMethod.POST)
    public String password(@RequestParam("word") String password) {
        return "password " + password;
    }
  1. 参数是否必传
    使用required为true/false,决定是否可传
java 复制代码
@RequestMapping(value = "/user",  method = RequestMethod.GET)
    public String user(@RequestParam(name = "name", required = true) String name, int age,String password) {
        return "user " + name + " " + age + " " + password;
    }
  1. @RequestBody接收JSON对象
java 复制代码
@RequestMapping(value = "/transfer",  method = RequestMethod.POST)
    public String transfer(@RequestBody Person person) {
        return "transfer " + person.getName() + " " + person.getAge() + " " + person.getPassword();
    }
  1. 获取URL中的参数@PathVariable
java 复制代码
@RequestMapping("/HHHH/{name}/{age}")
    public String HHHH(@PathVariable("name") String name, @PathVariable("age") int age) {
        return "HHHH " + name + " " + age;
    }
  1. 上传文件@RequestPart
java 复制代码
@RequestMapping("/OOOO")
    public String OOOO(String name,@RequestPart("myfile") MultipartFile file) throws IOException {
        String fileName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
        String filePath = ClassUtils.getDefaultClassLoader().getResource("static").getPath() + UUID.randomUUID() + fileName;
        file.transferTo(new File(filePath));
        return "OOOO " + fileName;
    }
  1. 获取Cookie/Session/header
java 复制代码
@RequestMapping("/cookie")
    public String cookie(@CookieValue("bite")  String bite) {
        return "bite " + bite;
    }

    @RequestMapping("/header")
    public String header(@RequestHeader("bite") String bite) {
        return "bite " + bite;
    }

    @RequestMapping("/seesion")
    public String seesion(@SessionAttribute String bite) {
        return "bite " + bite;
    }

返回数据

  1. 返回静态页面
java 复制代码
@Controller
@RequestMapping("/p")
public class PersonController {
    @RequestMapping("/index")
    public Object index(){
        // 执行业务...
        // 返回view -> index.html
        return "/index.html";
    }
}
  1. 返回text/html
java 复制代码
@RequestMapping("/m7")
@ResponseBody
public String method_7() {
    return "<h1>Hello,HTML</h1>";
}
  1. 返回JSON对象
java 复制代码
@RequestMapping("/m8")
@ResponseBody
public HashMap<String, String> method_8() {
    HashMap<String, String> map = new HashMap<>();
    map.put("Java", "Java Value");
    map.put("MySQL", "MySQL Value");
    map.put("Redis", "Redis Value");
    return map;
}
  1. 请求转发或请求重定向
    forward vs redirect
  • return可以返回一个视图,还可以实现跳转,跳转方式有两种:
  • forward:请求转发
  • redirect:请求重定向
java 复制代码
// 请求重定向
@RequestMapping("/index")
public String index(){
    return "redirect:/index.html";
}

// 请求转发
@RequestMapping("/index2")
public String index2(){
    return "forward:/index.html";
}

二者具体区别:

  1. 请求重定向 (redirect) 将请求重新定位到资源,请求转发 (forward) 服务器端转发

  2. 请求重定向地址发生变化,请求转发地址不发生变化。

  3. 请求重定向与直接访问新地址效果一致,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问

注意⚠️:

  • 请求转发资源必须在同一目录下,否则可能无法访问
  • 但是假如使用重定向则可以访问

@ResponseBody 说明

@ResponseBody 返回的值如果是字符会转换成 text/html,如果返回的是对象会转换成 application/json 返回给前端。

@ResponseBody 可以用来修饰方法或者是修饰类,修饰类表示类中的所有方法都会返回 html 或者 json,而不是视图。

组合注解:@RestController

@RestController = @Controller + @ResponseBody

相关推荐
Chen-Edward44 分钟前
有了Spring为什么还有要Spring Boot?
java·spring boot·spring
magic334165631 小时前
Springboot整合MinIO文件服务(windows版本)
windows·spring boot·后端·minio·文件对象存储
云创智城-yuncitys1 小时前
SpringCloud 架构在智慧交通路侧停车系统中的实践:从技术落地到城市级服务升级
spring·spring cloud·架构·智慧城市·停车系统·充电系统源码
开心-开心急了1 小时前
Flask入门教程——李辉 第一、二章关键知识梳理(更新一次)
后端·python·flask
掘金码甲哥1 小时前
调试grpc的哼哈二将,你值得拥有
后端
陈小桔2 小时前
idea中重新加载所有maven项目失败,但maven compile成功
java·maven
小学鸡!2 小时前
Spring Boot实现日志链路追踪
java·spring boot·后端
xiaogg36782 小时前
阿里云k8s1.33部署yaml和dockerfile配置文件
java·linux·kubernetes
逆光的July2 小时前
Hikari连接池
java
微风粼粼2 小时前
eclipse 导入javaweb项目,以及配置教程(傻瓜式教学)
java·ide·eclipse