Spring(1)——mvc概念,部分常用注解

1、什么是Spring Web MVC?

Spring MVC 是一种基于 Java 的实现了 MVC(Model-View-Controller,模型 - 视图 - 控制器)设计模式的 Web 应用框架,它是 Spring 框架的一个重要组成部分,用于构建 Web 应用程序。

1.1 MVC定义

在这里插入图片描述

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

**View(视图):**指在应⽤程序中专⻔⽤来与浏览器进⾏交互,展⽰数据的资源.
**Model(模型):**是应⽤程序的主体部分,⽤来处理程序中数据逻辑的部分.
**Controller(控制器):**可以理解为⼀个分发器,⽤来决定对于视图发来的请求,需要⽤哪⼀个模型来处理,以及处理完后需要跳回到哪⼀个视图。即⽤来连接视图和模型 。

1.2 什么是Spring MVC?

Sping MVC是对MVC架构的实现,是一个Web框架,不过Sping MVC中MVC的架构稍有改变

在这里插入图片描述

浏览器发来的请求将直接通过控制器简单处理后,传给对应的模型而不经过视图。

对于Spring MVC,当用户在浏览器中输入了URL之后是如何感知到用户的请求并给予相应的?

主要分以下三个方面:

  1. 建⽴连接:将用户(浏览器)和Java程序连接起来,也就是访问⼀个地址能够调⽤到我们的Spring程序。

  2. 请求:⽤⼾请求的时候会带⼀些参数,在程序中要想办法获取到参数,所以请求这块主要是获取参数
    的功能。

  3. 响应:执⾏了业务逻辑之后,要把程序执⾏的结果返回给⽤⼾,也就是响应. 。

1.2.1 传递参数

下面四种分别体现了get和post的两种实现方式

@RestController
@RequestMapping("/user")
public class UserController {

    @RequestMapping(value = "/v1",method = RequestMethod.GET)
    public String v1() {
        return "Hello method = RequestMethod.GET";
    }
    @GetMapping("/v2")
    public String v2() {
        return "Hello GetMapping";
    }

    @RequestMapping(value = "/v3", method = RequestMethod.POST)
    public String v3() {
        return "Hello method = RequestMethod.POST";
    }
    @PostMapping("/v4")
    public String v4() {
        return "Hello PostMapping";
    }
}

1.2.2 传递对象

  • 如果参数⽐较多时,⽅法声明就需要有很多形参.并且后续每次新增⼀个参数,也需要修改⽅法声明.
  • 我们不妨把这些参数封装为⼀个对象.
  • SpringMVC也可以⾃动实现对象参数的赋值,⽐如Person对象:
  • 需要注意的是对象类必须完成get和set方法Spring才能赋值和取值
public class Person {
private int id;
private String name;
private String password;

public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}

传递对象代码实现:

@RequestMapping("/m3")
public Object method3(Person p){
return p.toString();
}  

1.2.3 给参数重命名

前后端对同一个参数名称命名习惯可能不同,比如对于用户名,前端有可能是userName,后端是name。这种情况就需要给参数重命名。

创建前端请求:
在这里插入图片描述

后端使用**@RequestParam**注解:

在这里插入图片描述

前端得到的相应:

在这里插入图片描述

如果此时前端名称改为name,即和后端参数列表中同一参数名一样是不能传递成功的:

在这里插入图片描述

在这里插入图片描述

就是说后端只认重命名注解中的名字。

还有一点需要注意的是,当对一个参数使用了**@RequestParam**注解时,这个参数就默认成为了必传参数,即前端如果没有传递该参数,会产生请求错误:

在这里插入图片描述
在这里插入图片描述

可以得出结论:

  1. 使⽤**@RequestParam** 进⾏参数重命名时,请求参数只能和**@RequestParam** 声明的名称⼀
    致,才能进⾏参数绑定和赋值.

  2. 使⽤ @RequestParam 进⾏参数重命名时,参数就变成了必传参数.

如果我们的实际业务前端的参数是⼀个⾮必传的参数,针对上述问题,如何解决呢?
先来了解下参数必传的原因,我们查看 @RequestParam 注解的实现细节就可以发现端倪,注解实现如下:

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
    @AliasFor("name")
    String value() default "";

    @AliasFor("value")
    String name() default "";

    boolean required() default true;

    String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}

可以看到 required 的默认值为true,表⽰含义就是:该注解修饰的参数默认为必传。既然如此,我们可以通过设置 @RequestParam 中的 required=false 来避免不传递时报错,
具体实现如下 :

 @RequestMapping("/v3")
    public String v3(@RequestParam(value = "userName",required = false) String name, Integer age){
            return name + " " + age;
    }

此时被**@RequestParam**注解的参数就不是必传参数了

在这里插入图片描述

1.2.4 传递数组

代码如下:

 @RequestMapping("/v4")
    public String v4(String[] array){
        System.out.println(array.length);
        return Arrays.toString(array);
    }

前端可以这样传

  1. 在这里插入图片描述
    后端也可以看到数组长度为4在这里插入图片描述

  2. 在这里插入图片描述

同一个参数传多次,也会被认为同一个数组,后端也可以看到数组长度为3在这里插入图片描述

1.2.5 传递List

 @RequestMapping("/v5")
    public String v5(@RequestParam List<String> list){
        System.out.println(list.size());
        return Arrays.toString(list.toArray());
    }

需要用**@RequestParam**对参数进行标记

1.3 传递JSON数据

1.3.1 JSON的语法:

  1. 数据在键值对(Key/Value) 中
  2. 数据由逗号**,**分隔
  3. 对象⽤ {} 表示
  4. 数组⽤** []** 表示
  5. 值可以为对象,也可以为数组,数组中可以包含多个对象

1.3.2 JSON的两种结构

  1. 对象:⼤括号 {} 保存的对象是⼀个⽆序的键值对集合。⼀个对象以左括号 { 开始,右括号 }
    结束。每个"键"后跟⼀个冒号 : ,键值对使⽤逗号 , 分隔
  2. 数组:中括号 [] 保存的数组是值(value)的有序集合.⼀个数组以左中括号 [ 开始,右中括
    号 ] 结束,值之间使⽤逗号 , 分隔。

如下:

在这里插入图片描述

1.3.3 Json字符串和Java对象的转换

JSON本质上是⼀个字符串,通过⽂本来存储和描述数据。
SpringMVC框架也集成了JSON的转换⼯具,我们可以直接使⽤,来完成JSON字符串和Java对象的互转。

//对象
public class User {
    String name;
    int age;
    String gender;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }
}

使⽤ObjectMapper对象提供的两个⽅法,可以完成对象和JSON字符串的互转
writeValueAsString:把对象转为JSON字符串
readValue:把字符串转为对象

public class JsonTest {
    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();

        User user = new User();
        user.age = 17;
        user.name = "火车";

        //对象转json
        String s = objectMapper.writeValueAsString(user);
        System.out.println("json字符串:" + s);

        //json转对象
        User user1 = objectMapper.readValue(s, user.getClass());
        System.out.println(user1);
    }
}

运行结果:
在这里插入图片描述

Json字符串和Java对象的转换本质上是jackson-databind提供的功能,SpringMVC框架中已经把该⼯具包引⼊了进来,咱们直接使⽤即可,如果脱离SpringMVC使⽤,需要引⼊相关依赖

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.5</version>
</dependency>

1.3.4 传递Json对象

接受JSON对象,需要使用**@RequsetBody**注解。

@RequestMapping("/v6")
public String v6(@RequestBody User user){
    return user.toString();
}

在这里插入图片描述

1.4 获取URL中的参数

使用**@PathVariable**注解

@RequestMapping("/user/{id}/{name}")
    public String getArticle(@PathVariable("id") String id,@PathVariable("name") String name){
        return "id:" + id + "\n" + "name:" +name;
    }

在这里插入图片描述

1.5上传文件

@RequestMapping("/v7")
    public String getFile(@RequestPart("file")MultipartFile file) throws IOException {
        String originalFilename = file.getOriginalFilename();
        file.transferTo(new File("f:\\重头来过\\" + file.getOriginalFilename()));
        return "接收到文件名称为: " + originalFilename;
    }

在这里插入图片描述

可以看到上传成功

在这里插入图片描述

二、总结

  1. @RequestMapping:路由映射
  2. @RequestParam:后端参数重命名
  3. @RequestBody:接收JSON类型的参数
  4. @PathVariable:接收路径参数
  5. @RequestPart:上传⽂件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/984332.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PY32MD320单片机 QFN32封装,内置多功能三相 NN 型预驱。

PY32MD320单片机是普冉半导体的一款电机专用MCU&#xff0c;芯片采用了高性能的 32 位 ARM Cortex-M0 内核&#xff0c;主要用于电机控制。PY32MD320嵌入高达 64 KB Flash 和 8 KB SRAM 存储器&#xff0c;最高工作频率 48 MHz。PY32MD320单片机的工作温度范围为 -40 ~ 105 ℃&…

《OkHttp:工作原理 拦截器链深度解析》

目录 一、OKHttp 的基本使用 1. 添加依赖 2. 发起 HTTP 请求 3. 拦截器&#xff08;Interceptor&#xff09; 4. 高级配置 二、OKHttp 核心原理 1. 责任链模式&#xff08;Interceptor Chain&#xff09; 2. 连接池&#xff08;ConnectionPool&#xff09; 3. 请求调度…

HeidiSQL:一款免费的数据库管理工具

HeidiSQL 是一款免费的图形化数据库管理工具&#xff0c;支持 MySQL、MariaDB、Microsoft SQL、PostgreSQL、SQLite、Interbase 以及 Firebird&#xff0c;目前只能在 Windows 平台使用。 HeidiSQL 的核心功能包括&#xff1a; 免费且开源&#xff0c;所有功能都可以直接使用。…

C/C++蓝桥杯算法真题打卡(Day3)

一、P8598 [蓝桥杯 2013 省 AB] 错误票据 - 洛谷 算法代码&#xff1a; #include<bits/stdc.h> using namespace std;int main() {int N;cin >> N; // 读取数据行数unordered_map<int, int> idCount; // 用于统计每个ID出现的次数vector<int> ids; …

【2025软考高级架构师】——软件工程(2)

摘要 本文主要介绍了软件工程中常见的多种软件过程模型&#xff0c;包括瀑布模型、原型模型、V模型、W模型、迭代与增量模型、螺旋模型、构件组装模型、基于构件的软件工程&#xff08;CBSE&#xff09;、快速应用开发&#xff08;RAD&#xff09;、统一过程/统一开发方法和敏…

【Vue3 Element UI - Plus + Tyscript 实现Tags标签输入及回显】

Vue3 Element Plus TypeScript 实现 Tags 标签输入及回显 在开发后台管理系统或表单页面时&#xff0c;动态标签&#xff08;Tags&#xff09; 是一个常见的功能需求。用户可以通过输入框添加标签&#xff0c;并通过关闭按钮删除标签&#xff0c;同时还需要支持标签数据的提…

Easysearch 使用 AWS S3 进行快照备份与还原:完整指南及常见错误排查

Easysearch 可以使用 AWS S3 作为远程存储库&#xff0c;进行索引的快照&#xff08;Snapshot&#xff09;备份和恢复。同时&#xff0c;Easysearch 内置了 S3 插件&#xff0c;无需额外安装。以下是完整的配置和操作步骤。 1. 在 AWS S3 上创建存储桶 登录 AWS 控制台&#x…

【CSS3】筑基篇

目录 复合选择器后代选择器子选择器并集选择器交集选择器伪类选择器 CSS 三大特性继承性层叠性优先级 背景属性背景色背景图背景图平铺方式背景图位置背景图缩放背景图固定背景复合属性 显示模式显示模式块级元素行内元素行内块元素 转换显示模式 结构伪类选择器结构伪类选择器…

【MySQL】(4) 表的操作

一、创建表 语法&#xff1a; 示例&#xff1a; 生成的数据目录下的文件&#xff1a; 二、查看表结构 三、修改表 语法&#xff1a; 另一种改表名语法&#xff1a;rename table old_name1 to new_name1, old_name2 to new_name2; 示例&#xff1a; 四、删除表 语法&#xf…

C++:string容器(下篇)

1.string浅拷贝的问题 // 为了和标准库区分&#xff0c;此处使用String class String { public :/*String():_str(new char[1]){*_str \0;}*///String(const char* str "\0") // 错误示范//String(const char* str nullptr) // 错误示范String(const char* str …

基于Harbor构建docker私有仓库

Harbor 是一个开源的企业级容器镜像仓库&#xff0c;主要用于存储、签名和扫描容器镜像。Harbor 基于 Docker Registry 构建&#xff0c;并在此基础上增加了许多企业级特性&#xff0c;以满足企业对安全性、可扩展性和易用性的需求。Harbor 的架构由多个组件组成&#xff0c;包…

阿里发布新开源视频生成模型Wan-Video,支持文生图和图生图,最低6G就能跑,ComFyUI可用!

Wan-Video 模型介绍&#xff1a;包括 Wan-Video-1.3B-T2V 和 Wan-Video-14B-T2V 两个版本&#xff0c;分别支持文本到视频&#xff08;T2V&#xff09;和图像到视频&#xff08;I2V&#xff09;生成。14B 版本需要更高的 VRAM 配置。 Wan2.1 是一套全面开放的视频基础模型&…

运动控制卡--概述学习

目录 概述 技术背景 常见的运动控制卡分类&#xff1a; 国外品牌 国内品牌 各个品牌官网 国外品牌 国内品牌 概述 运动控制卡被称作控制卡&#xff0c;只是因为它做成卡的形式&#xff0c;可以插进工控机主板上&#xff0c;一般走pci或pcie通讯。运动控制卡负责接收计算…

网络编程-----服务器(多路复用IO 和 TCP并发模型)

一、单循环服务器模型 1. 核心特征 while(1){newfd accept();recv();close(newfd);}2. 典型应用场景 HTTP短连接服务&#xff08;早期Apache&#xff09;CGI快速处理简单测试服务器 3. 综合代码 #include <stdio.h> #include <sys/types.h> /* See NO…

Java【网络原理】(3)网络编程续

目录 1.前言 2.正文 2.1ServerSocket类 2.2Socket类 2.3Tcp回显服务器 2.3.1TcpEchoServer 2.3.2TcpEchoClient 3.小结 1.前言 哈喽大家好&#xff0c;今天继续进行计算机网络的初阶学习&#xff0c;今天学习的是tcp回显服务器的实现&#xff0c;正文开始 2.正文 在…

SpringMvc与Struts2

一、Spring MVC 1.1 概述 Spring MVC 是 Spring 框架的一部分&#xff0c;是一个基于 MVC 设计模式的轻量级 Web 框架。它提供了灵活的配置和强大的扩展能力&#xff0c;适合构建复杂的 Web 应用程序。 1.2 特点 轻量级&#xff1a;与 Spring 框架无缝集成&#xff0c;依赖…

web—HTML

什么是web ●Web:全球广域网&#xff0c;也称为万维网(www World Wide Web),能够通过浏览器访问的网站。 在浏览器中呈现精美的网页。 1.网页由那几部分组成&#xff1f; >文字、图片、视频、音频、超链接&#xff0c;&#xff0c;&#xff0c; 2.我们看到的网页&#xf…

php虚拟站点提示No input file specified时的问题及权限处理方法

访问站点&#xff0c;提示如下 No input file specified. 可能是文件权限有问题&#xff0c;也可能是“.user.ini”文件路径没有配置对&#xff0c;最简单的办法就是直接将它删除掉&#xff0c;还有就是将它设置正确 #配置成自己服务器上正确的路径 open_basedir/mnt/qiy/te…

INFINI Labs 产品更新 | Easysearch 增加异步搜索等新特性

INFINI Labs 产品更新发布&#xff01;此次更新&#xff0c;Easysearch 增加了新的功能和数据类型&#xff0c;包括 wildcard 数据类型、Point in time 搜索 API、异步搜索 API、数值和日期字段的 doc-values 搜索支持&#xff0c;Console 新增了日志查询功能。 INFINI Easyse…

关于OceanBase与CDH适配的经验分享

CDH是Cloudera早期推出的一个开源平台版本&#xff0c;它实质上成为了Apache Hadoop生态系统内公认的安装与管理平台&#xff0c;专为企业级需求量身打造。CDH为用户提供了即装即用的企业级解决方案。通过整合Hadoop与另外十多项关键开源项目&#xff0c;Cloudera构建了一个功能…