Spring Web MVC基础第一篇

目录

1.什么是Spring Web MVC?

2.创建Spring Web MVC项目

3.注解使用

3.1@RequestMapping(路由映射)

3.2一般参数传递

3.3@RequestParam(参数重命名)

3.4@RequestBody(传递JSON数据)

3.5@PathVariable(获取URL中参数)

3.6@RequestParam(上传文件)


1.什么是Spring Web MVC?

Spring Web MVC 是 Spring 框架的一个模块,用于构建基于 Java 的 Web 应用程序。它遵循模型 - 视图 - 控制器(MVC)设计模式,将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller),以实现关注点分离,提高代码的可维护性和可扩展性。

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

MVC 的工作流程
1. 用户通过界面操作向控制器发送请求。
2. 控制器接收请求后,调用模型的相关方法进行业务处理。
3. 模型处理完业务逻辑后,将数据返回给控制器。
4. 控制器根据返回的数据选择合适的视图,并将数据传递给视图。
5. 视图将数据呈现给用户。


Spring Web MVC是 Web 框架, 那么当用户在浏览器中输入了 url 之后,我们的 Spring MVC 项目就可以感知到用户的请求, 并给予响应.

咱们学习Spring MVC, 重点也就是学习如何通过浏览器和用户程序进行交互. 主要分以下三个方面:

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

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

3. 响应: 执行了业务逻辑之后,要把程序执行的结果返回给用户, 也就是响应.

2.创建Spring Web MVC项目

3.注解使用

Spring Web MVC的学习,主要就是学习注解

3.1@RequestMapping(路由映射)

@RequestMapping即可以修饰类也可以修饰方法,它是用来注册接口的路由映射的.表示服务收到请求时, 路径为 /sayHi 的请求就会调用 t1 这个方法的代码.

路由映射: 当用户访问⼀个 URL 时, 将用户的请求对应到程序中某个类的某个方法的过程就叫路由映射.

我们通过在浏览器中输入http://127.0.0.1:8080/user1/t1便可访问到

127.0.0.1是换回地址,访问当前主机,8080是tomcat的端口号,tomcat集成在了Spring MVC项目里面

1.@RequestMapping 的URL 路径最前面加不加 / (斜杠)都可以, Spring程序启动时, 会进行判断, 如果前面没有加 / , Spring会拼接上⼀个 /
2.@RequestMapping 的URL路径也可以是多层路径, 最终访问时, 依然是 类路径 + 方法路径
3.@RequestMapping 既支持Get请求, 又支持Post请求. 同理, 也支持其他的请求方式.

@RequestMapping设置请求方式

@RequestMapping(value = "/t1",method ={RequestMethod.GET,RequestMethod.POST} )public String t1(){return "hello world";}

设置几个请求方式就在{}括号里面写几个请求方式

若不设置,则默认所有请求方式都可以

设置一个请求方式可不写{}

除此之外,还可以使用

@GetMapping()
@PostMapping()

表示只能使用get请求或post请求

    @GetMapping("/t2")public String t2(){return "GetMappiing";}@PostMapping("/t3")public String t3(){return "PostMapping";}

@GetMapping() @PostMapping()路径名可以相同,但方法名要不同

    @GetMapping("/m7")public String m7(){return "m7";}@PostMapping("/m7")
public String m8(){return "m8";}

3.2一般参数传递

传递字符串:

    @RequestMapping("t4")public String t4(String name){return name;}

传递整型:

    @RequestMapping("/t5")public Integer  t5(Integer age){return age;}

当使用包装类型传递参数时:参数为空时,返回结果为空

抓包发现状态码为200,能够正常放回


当不使用包装类传递参数时:当参数为空时

 @RequestMapping("/t6")public int t6(int age){return age;}

抓包发现状态码为500

对于包装类型, 如果不传对应参数,Spring 接收到的数据则为null 所以企业开发中,对于参数可能为空的数据,建议使⽤包装类型

传递多个参数

    @RequestMapping("/t1")public String t1(String name ,Integer age){return "姓名:"+name+"     年龄:"+age;}

当有多个参数时,前后端进行参数匹配时,是以参数的名称进行匹配的,因此参数的位置是不影响后端获取参数的结果.

传递对象

如果参数比较多时, 方法声明就需要有很多形参. 并且后续每次新增⼀个参数, 也需要修改方法声明. 我们不妨把这些参数封装为⼀个对象.

package com.example.demo2;import org.springframework.web.bind.annotation.RequestMapping;@RequestMapping("/U2")
public class UserInfo {String name;Integer age;String gender;public UserInfo(String name, Integer age, String gender) {this.name = name;this.age = age;this.gender = gender;}public UserInfo() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}@Overridepublic String toString() {return "UserInfo{" +"name='" + name + '\'' +", age=" + age +", gender='" + gender + '\'' +'}';}
}
    @RequestMapping("/t2")public String t2(UserInfo userInfo){return "传递对象:"+userInfo.toString();}

Spring 会根据参数名称自动绑定到对象的各个属性上, 如果某个属性未传递, 则赋值为null(基本类型则赋值为默认初识值, 比如int类型的属性, 会被赋值为0)

传递数组

    @RequestMapping("/t5")public String t5(String []str){return Arrays.toString(str);}

传递集合

集合参数:和数组类似, 同⼀个请求参数名有为多个, 且需要使用 @RequestParam 绑定参数关系

默认情况下,请求中参数名相同的多个值,是封装到数组. 如果要封装到集合,要使用@RequestParam 绑定参数关系

    @RequestMapping("/t6")public String t6(@RequestParam List<String> str){return str.toString();}

3.3@RequestParam(参数重命名)

在某些特殊的情况下,前端可能为了加密,传递给后端的数据名称五花八门,后端为了见名知意需要在使用时对前端传过来的数据进行重命名

我们就可以使用 @RequestParam 来重命名前后端的参数值

    @RequestMapping("/t3")
public String t3(@RequestParam("q") String name){return name;}

如果使用前端规定的名字,传递参数是没有问题的

但是如果使用后端重命名的名字传递参数,就会报错

状态码 400 也是一种常见的 HTTP 状态码,它表示客户端发送的请求存在错误,服务器无法理解或处理该请求。

结论:

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

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

查看@RequestParam的源码,我们可以看到required的默认值为true,这代表@RequestParam进行参数重命名时,参数为必传参数,将required修改为false,参数就为非必传参数

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package org.springframework.web.bind.annotation;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;@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设置为false,非必传参数,传递参数为空就不会报错

   @RequestMapping("/t4")public String t4(@RequestParam(value = "q",required = false) String name){return name;}

3.4@RequestBody(传递JSON数据)

什么是JSON

JSON即JavaScript Object Notation,是一种轻量级的数据交换格式,以纯文本形式存储和传输数据,在前后端数据交互等场景广泛应用,以下是详细介绍:

数据结构

对象:是一个无序的“键 - 值”对集合以“{ }”包裹键和值之间用冒号“:”分隔,不同“键 - 值”对之间用逗号“,”分隔,比如`{"name": "Alice", "age": 25}` 。

数组:是值的有序集合,以“[ ]”包裹,值之间用逗号“,”分隔,值可以是字符串、数字、对象、数组等数据类型,例如`["apple", "banana", {"color": "red"}]` 。

语法规则

:必须是字符串。

:可以是双引号包裹的字符串、数值、true、false、null、对象或者数组。

特点

轻量级:相比一些其他数据交换格式(如XML),JSON数据格式简洁,文件体积小,在网络传输时能减少带宽占用,提高传输效率。

易于阅读和编写:JSON以人类可读的文本形式表示数据,对于开发人员来说,编写和理解都比较容易。

语言无关性:虽然名称中包含JavaScript,但JSON可以被多种编程语言解析和生成,如Java、Python、C#等,这使得它在不同语言编写的系统间进行数据交互时非常方便。

可以使用JSON检查器来判断JSON是否正确:JSON在线解析格式化验证 - JSON.cn

下面是一段JSON代码,可自行阅读,熟悉JSON语法

{
"squadName": "Super hero squad",//字符串
"homeTown": "Metro City",//字符串
"formed": 2016,//数字
"secretBase": "Super tower",//字符串
"active": true,//布尔类型
"members": [{//数组对象嵌套
"name": "Molecule Man",
"age": 29,
"secretIdentity": "Dan Jukes",
"powers": ["Radiation resistance", "Turning tiny", "Radiation
blast"]
}, {
"name": "Madame Uppercut",
"age": 39,
"secretIdentity": "Jane Wilson",
"powers": ["Million tonne punch", "Damage resistance", "Superhuman
reflexes"]
}, {
"name": "Eternal Flame",
"age": 1000000,
"secretIdentity": "Unknown",
"powers": ["Immortality", "Heat Immunity", "Inferno",
"Teleportation", "Interdimensional travel"]
}]
}

JSON的语法:

1. 数据在 键值对(Key/Value) 中

2. 数据由逗号 , 分隔

3. 对象用 {} 表示

4. 数组用 [] 表示

5. 值可以为对象, 也可以为数组, 数组中可以包含多个对象

集合嵌套:需要使用@RequestBody修饰,@RequestBody修饰是传递JSON数据,集合会被封装成数组,所以使用JSON使用[ ]

    @RequestMapping("/t7")public String t7(@RequestBody List<List<String>> list){
return list.toString();}

在Postman中,传递JSON数据,Body->raw->JSON

对象传递数据:

@RequestMapping("/t8")
public String t8(@RequestBody UserInfo userInfo){return  userInfo.toString();
}

请求方式为JSON

3.5@PathVariable(获取URL中参数)

path variable: 路径变量

和字面表达的意思⼀样, 这个注解主要作用在请求URL路径上的数据绑定

默认传递参数写在URL上,SpringMVC就可以获取到

@PathVariable可以对参数进行重命名,重命名后便不可以使用之前的参数名了

每一个需要使用参数都要使用@PathVariable修饰

@RequestMapping("/t9/{name}/{age}")
public String t9(@PathVariable String name,@PathVariable("age") Integer userAge){return "name:"+name+"  age:"+userAge;
}

3.6@RequestParam(上传文件)

    @RequestMapping("/m16")public String m16(@RequestParam("file11") MultipartFile file) throws IOException {System.out.println(file.getName());file.transferTo(new File("D:\\图片\\代码测试图片\\"+file.getOriginalFilename()));return "文件上传成功";}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】使用VirtualBox部署Linux虚拟机

1. 下载并安装 VirtualBox 访问 VirtualBox 官网&#xff0c;下载适合你操作系统的版本&#xff08;Windows&#xff09;。安装 VirtualBox&#xff0c;按照安装向导的提示完成安装。 2. 下载 Linux 发行版 ISO 文件 访问你选择的 Linux 发行版官方网站&#xff08;例如&…

Day07:缓存-数据淘汰策略

Redis的数据淘汰策略有哪些 ? &#xff08;key过期导致的&#xff09; 在redis中提供了两种数据过期删除策略 第一种是惰性删除&#xff0c;在设置该key过期时间后&#xff0c;我们不去管它&#xff0c;当需要该key时&#xff0c;我们再检查其是否过期&#xff0c;如果过期&…

[原创](Modern C++)现代C++的关键性概念: 正则表达式

常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi、XCode、Eclipse、C Bui…

sobel边缘检测算法

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 Sobel边缘检测算法是一种用于图像处理中的边缘检测方法&#xff0c;它能够突出图像中灰度变化剧烈的地方&#xff0c;也就是边缘。该算法通过计算图像在水平方向和垂直方向上的梯度来检测边缘&#xff0c;梯度值越大…

Google Chrome-便携增强版[解压即用]

Google Chrome-便携增强版 链接&#xff1a;https://pan.xunlei.com/s/VOI0OyrhUx3biEbFgJyLl-Z8A1?pwdf5qa# a 特点描述 √ 无升级、便携式、绿色免安装&#xff0c;即可以覆盖更新又能解压使用&#xff01; √ 此增强版&#xff0c;支持右键解压使用 √ 加入Chrome增强…

FLTK - FLTK1.4.1 - demo - bitmap

文章目录 FLTK - FLTK1.4.1 - demo - bitmap概述笔记END FLTK - FLTK1.4.1 - demo - bitmap 概述 // 功能 : 演示位图数据在按钮上的显示 // * 以按钮为范围或者以窗口为范围移动 // * 上下左右, 文字和图像的相对位置 // 失能按钮&#xff0c;使能按钮 // 知识点 // FLTK可…

分布式数据库架构与实践:原理、设计与优化

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 随着大数据和云计算的快速发展&#xff0c;传统单机数据库已难以满足大规模数据存储和高并发访问的需求。分布式数据库&…

设计模式Python版 桥接模式

文章目录 前言一、桥接模式二、桥接模式示例三、桥接模式与适配器模式的联用 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&…

携程Android开发面试题及参考答案

在项目中,给别人发的动态点赞功能是如何实现的? 数据库设计:首先要在数据库中为动态表添加一个点赞字段,用于记录点赞数量,同时可能需要一个点赞关系表,记录用户与动态之间的点赞关联,包括点赞时间等信息。界面交互:在 Android 界面上,为点赞按钮设置点击事件监听器。…

【C语言】main函数解析

文章目录 一、前言二、main函数解析三、代码示例四、应用场景 一、前言 在学习编程的过程中&#xff0c;我们很早就接触到了main函数。在Linux系统中&#xff0c;当你运行一个可执行文件&#xff08;例如 ./a.out&#xff09;时&#xff0c;如果需要传入参数&#xff0c;就需要…

CSS核心

CSS的引入方式 内部样式表是在 html 页面内部写一个 style 标签&#xff0c;在标签内部编写 CSS 代码控制整个 HTML 页面的样式。<style> 标签理论上可以放在 HTML 文档的任何地方&#xff0c;但一般会放在文档的 <head> 标签中。 <style> div { color: r…

传奇引擎游戏微端的作用

传奇引擎游戏微端是一种优化的游戏客户端分发与运行方式&#xff0c;其主要目的是通过减少玩家的下载压力和提升游戏启动速度&#xff0c;让玩家更快地进入游戏。微端在传奇私服以及其他网络游戏中广泛使用&#xff0c;尤其适用于容量较大的游戏客户端。下面从作用、实现原理和…

从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(基础组件实现)

目录 基础组件实现 如何将图像和文字显示到OLED上 如何绘制图像 如何绘制文字 如何获取字体&#xff1f; 如何正确的访问字体 如何抽象字体 如何绘制字符串 绘制方案 文本绘制 更加方便的绘制 字体附录 ascii 6x8字体 ascii 8 x 16字体 基础组件实现 我们现在离手…

吴晓波 历代经济变革得失@简明“中国经济史” - 读书笔记

目录 《历代经济变革得失》读书笔记一、核心观点二、主要内容&#xff08;一&#xff09;导论&#xff08;二&#xff09;春秋战国时期&#xff08;三&#xff09;汉代&#xff08;四&#xff09;北宋&#xff08;五&#xff09;明清时期&#xff08;六&#xff09;近现代&…

Theorem

Theorem 打开题&#xff1a; from Crypto.Util.number import *from gmpy2 import *flag bxxxm bytes_to_long(flag) #flaglong_to_bytes(m)p getPrime(512) #随机生成一个512位的素数pq next_prime(p) #p之后的下一个…

变量的作用域和生命周期

一、根据变量的作用域不同&#xff0c;可分为 局部变量 和 全局变量 1. 作用域&#xff1a;变量起作用的范围&#xff08;变量定义之后&#xff0c;在哪里可以访问变量&#xff09;。 就近原则&#xff1a;当不同作用域里面有两个或者多个同名变量&#xff0c;那么遵循就近原…

力扣【669. 修剪二叉搜索树】Java题解

一开始在想为什么题目说存在唯一答案。然后发现是二叉搜索树就合理了。如下图&#xff1a;如果0节点小于low&#xff0c;那其左子树也都小于low&#xff0c;故可以排除&#xff1b;对于4&#xff0c;其右子树也是可以排除。 代码如下&#xff1a; class Solution {public Tre…

论文阅读:Realistic Noise Synthesis with Diffusion Models

这篇文章是 2025 AAAI 的一篇工作&#xff0c;主要介绍的是用扩散模型实现对真实噪声的仿真模拟 Abstract 深度去噪模型需要大量来自现实世界的训练数据&#xff0c;而获取这些数据颇具挑战性。当前的噪声合成技术难以准确模拟复杂的噪声分布。我们提出一种新颖的逼真噪声合成…

群晖Alist套件无法挂载到群晖webdav,报错【连接被服务器拒绝】

声明&#xff1a;我不是用docker安装的 在套件中心安装矿神的Alist套件后&#xff0c;想把夸克挂载到群晖上&#xff0c;方便复制文件的&#xff0c;哪知道一直报错&#xff0c;最后发现问题出在两个地方&#xff1a; 1&#xff09;挂载的路径中&#xff0c;直接填 dav &…

使用C# 如何获取本机连接的WIFI名称[C# ---1]

前言 楼主最近在写一个WLAN上位机&#xff0c;遇到了使用C#查询SSID 的问题。CSDN上很多文章都比较老了&#xff0c;而且代码过于复杂。楼主自己想了一个使用CMD来获得SSID的方法 C#本身是没有获得WINDOWS网路信息的能力&#xff0c;必须要用系统API&#xff0c;WMI什么的&…