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

相关推荐
AAA修煤气灶刘哥5 小时前
接口又被冲崩了?Sentinel 这 4 种限流算法,帮你守住后端『流量安全阀』
后端·算法·spring cloud
至此流年莫相忘5 小时前
设计模式:模板方法模式
java·开发语言·设计模式
用户298698530145 小时前
Spire.XLS实战教程:轻松实现Excel到CSV的转换与导出
后端
人机1015 小时前
Spring Security - FilterChainProxy
java
一直_在路上6 小时前
Go项目实战案例解析】:以Go语言之道,构建电商高并发架构
后端·架构
tan180°6 小时前
Boost搜索引擎 查找并去重(3)
linux·c++·后端·搜索引擎
SimonKing6 小时前
Apache Commons Math3 使用指南:强大的Java数学库
java·后端·程序员
渣哥6 小时前
Java 集合迭代中的 fail-fast 与 fail-safe 机制详解
java
uhakadotcom6 小时前
DuckDB相比于ClickHouse有什么不同点和优势?
后端·面试·github