详解Spring MVC

news2024/11/18 16:01:17

目录

1.什么是Spring Web MVC

MVC定义

2.学习Spring MVC

建立连接

@RequestMapping 注解介绍及使用

获取单个参数

 获取多个参数

获取普通对象

 获取JSON对象

获取基础URL参数

获取上传文件

获取Header

获取Cookie

获取Session

总结


1.什么是Spring Web MVC

官⽅对于 Spring MVC 的描述是这样

Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, )Spring Web MVC),

comes from the name of its source module (spring-webmvc)

翻译为中⽂: 

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架 ,从⼀开始就包含在 Spring 框架中。 它的正式名称“ Spring Web MVC”来⾃其源模块的名称(Spring-webmvc) ,但它通常被称为Spring MVC).

从上述定义我们可以得出⼀个信息:

Spring Web MVC 是⼀个 Web 框架. 下⾯咱们简称之为: Spring MVC

MVC定义

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

•  View(视图) 指在应⽤程序中专⻔⽤来与浏览器进⾏交互 ,展⽰数据的资源.

•  Model(模型) 是应⽤程序的主体部分 ,⽤来处理程序中数据逻辑的部分.

•  Controller(控制器)可以理解为⼀个分发器 ,⽤来决定对于视图发来的请求 ,需要⽤哪⼀个模型来处理 ,以及处理完后需要跳回到哪⼀个视图。即 ⽤来连接视图和模型

2.学习Spring MVC

既然是 Web 框架, 那么当⽤⼾在浏览器中输⼊了 url 之后 ,我们的 Spring MVC 项⽬就可以感知到⽤⼾的请求, 并给予响应.

咱们学习Spring MVC, 重点也就是学习如何通过浏览器和⽤⼾程序进⾏交互. 

主要分以下三个⽅⾯:

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

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

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

建立连接

在 Spring MVC 中使⽤@RequestMapping来实现 URL 路由映射 ,也就是浏览器连接程序的作⽤

创建⼀个 UserController  ,实现⽤户通过浏览器和程序的交互 ,具体实现代码如下:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/Romised")
public class BlogController {
    @RequestMapping("/sayHello")
    public String sayHello(){
        return "hello";
    }
}

 接下来访问:http://127.0.0.1:8080/Romised/sayHello 就可以看到程序返回的数据了

代码中为什么要加上@RestController?

因为没有这个注解的话@RequestMapping注解无法被扫描到,无法进行正确的路由映射,@RestController是 @Controller 和 @ResponseBody 的组合,@Controller 注解用于标识一个类是控制器类,用于处理 Web 请求并协调视图和模型之间的交互,@ResponseBody 注解的主要作用是指示方法的返回值直接作为 HTTP 响应体返回给客户端(返回的是数据)

⼀个项⽬中, 会有很多类, 每个类可能有很多的⽅法, Spring程序怎么知道要执⾏哪个⽅法呢?

Spring会对所有的类进⾏扫描, 如果类加了注解@RestController, Spring才会去看这个类⾥⾯的⽅法有没有加@RequestMapping这个注解

@RequestMapping 注解介绍及使用

@RequestMapping是 Spring Web MVC 应⽤程序中最常被⽤到的注解之⼀ ,它是⽤来注册接⼝

路由映射的

收到请求时, 路径为/sayHello 的请求就会调⽤ sayHello这个⽅法的代码.

路由映射:

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

@RequestMapping的使用:

@RequestMapping可修饰类也可以修饰⽅法,当修饰类和⽅法时,访问的地址是类路径 + 法路径

@RequestMapping标识⼀个类:设置映射请求的请求路径的初始信息 

@RequestMapping标识⼀个⽅法:设置映射请求请求路径的具体信息

  @RequestMapping  GET 还是 POST 请求?

本身并不限定是 GET 还是 POST 请求。它主要是用于定义请求的路径映射,通过结合不同的 HTTP 方法(如 @GetMapping 对应 GET 请求,@PostMapping 对应 POST 请求等)来具体指定该映射路径所支持的请求方式。可以与多种 HTTP 方法配合来处理不同类型的请求。

@Controller
public class MyController {

    @RequestMapping(value = "/Romised", method = RequestMethod.GET)
    public String getMethod() {
        return "result for GET";
    }

    @RequestMapping(value = "/Romised", method = RequestMethod.POST)
    public String postMethod() {
        return "result for POST";
    }
}

Spring MVC 参数获取

1.获取单个参数

@RestController
@RequestMapping("/Romised")
public class BlogController {
    @RequestMapping("/sayHello")
    public String sayHello(String name){
        return "hello!" + name;
    }
}

获取单个参数

注意说明:

1.代码中声明的参数名与请求地址栏中的参数名要完全一致,若不一致则无法获取到地址栏中对应的参数值,获取的为参数的默认值。

2.如果想明确指定请求中的参数要绑定到方法的参数,可以在方法的参数前加上@RequestParam注解进行参数重命名操作

 获取多个参数

@RestController
@RequestMapping("/Romised")
public class BlogController {
    @RequestMapping("/sayHello")
    public String sayHello(String name,String password){
        return "name:" + name + " password:" + password;
    }
}

获取多个参数注意说明:

1.进行参数匹配时,后端代码的参数名称要与地址栏中的参数名称要保证完全一致。

2.前后端进行参数匹配时,是以参数的名称进行匹配的,因此地址栏中的参数位置是不影响后端获取参数的结果

获取普通对象

创建实体类Person:

import lombok.Data;
@Data
public class Person {
   private Integer id;
   private String name;
}

 获取Person:

@RestController
@RequestMapping("/Romised")
public class BlogController {
    @RequestMapping("/sayHello")
    public Person sayHello(Person person){
        return person;
    }
}

 获取JSON对象

上述代码运行后获取JSON对象:发现获取不到JSON对象

在Spring MVC 中,提供了 @RequestBody 注解来实现接收 Json 对象的操作。代码如下: 

@RestController
@RequestMapping("/Romised")
public class BlogController {
    @RequestMapping("/sayHello")
    public Person sayHello(@RequestBody Person person){
        return person;
    }
}

获取基础URL参数

代码示例:

@RestController
@RequestMapping("/Romised")
public class BlogController {
    @RequestMapping("/sayHello/{name}/{password}")
    public String sayHello(@PathVariable(value = "name") String name,@PathVariable String password){
        return "name:" + name + " password:" + password ;
    }
}

获取基础URL参数注意说明:

使用@PathVariable 进行参数匹配时,后端代码的参数名称要与地址栏中的参数名称要保证一致且其对应的参数值要对应。

获取上传文件

代码示例:注意@RequestPart中的文件名和上传的要一致

@RestController
@RequestMapping("/fileTest")
public class BlogController {
    @RequestMapping("file")
    public String file(@RequestPart("Kun") MultipartFile file) throws IOException {
        System.out.println(file.getOriginalFilename());
        file.transferTo(new File("D:/BlogTest/" + file.getOriginalFilename()));
        return "success";
    }
}

上传文件成功!

注意:在new File的时候不要把路径写死,这样就可以上传多个文件不会覆盖

获取Header

获取Header的操作代码:

@RestController
@RequestMapping("/Romised")
public class BlogController {
    @RequestMapping("/getHeader")
    public String getHeader(HttpServletRequest request) {
        String userAgent = request.getHeader("User-Agent");
        return "userAgent:" + userAgent;
    }
}

在地址栏输入URL后,使用FIddler进行抓包操作获取请求的相关信息和响应信息

注意:

使用@RequestHeader 注解进行获取Header中的参数操作,该注解里的参数的参数名要与Header里面的参数名要一致

获取Cookie

首先在Chrome浏览器中打开开发者工具设置Cookie

 代码示例:

@RestController
@RequestMapping("/Romised")
public class BlogController {
    @RequestMapping("/getCookie")
    public String getCookie2(@CookieValue String kun,@CookieValue String romised){
        return "cookie存取的值kun:"+kun+",romised:"+romised;
    }
}

获取Session

获取Session的操作代码:

    @RequestMapping("/setSession")
    public String setSession(HttpServletRequest request){
        HttpSession session = request.getSession();
        session.setAttribute("username","Romised");
        return "success";
    }
    @RequestMapping("/getSession")
    public String getSession(HttpServletRequest request){
        HttpSession session = request.getSession(false);
        if (session!=null){
            String username = (String)session.getAttribute("username");
            return "登录用户:"+username;
        }
        return "session 为空";
    }
    @RequestMapping("/getSession2")
    public String getSession2(@SessionAttribute(required = false) String username){
        return "username:"+username;
    }
    @RequestMapping("/getSession3")
    public String getSession3(HttpSession session){
        String username = (String)session.getAttribute("username");
        return "登录用户:"+username;
    }

首先先设置session,然后可以通过三个方法获取session

总结

学习Spring MVC, 其实就是学习各种Web开发需要的注解

@RequestMapping: 路由映射

@RequestParam: 后端参数重命名

@RequestBody: 接收JSON类型的参数

@PathVariable: 接收路径参数

@RequestPart: 上传⽂件

@ResponseBody: 返回数据

@CookieValue: Cookie中获取值

@SessionAttribute: Session中获取值

@RequestHeader: Header中获取值

@Controller: 定义⼀个控制器, Spring 框架启动时加载, 把这个对象交Spring管理. 默认返回视图.

RestController: @ResponseBody + @Controller 返回数据

Cookie Session都是会话机制, Cookie是客户端机制, Session是服务端机制.二通过SessionId 来关联. Spring MVC内置HttpServletRequest, HttpServletResponse两个对象. 需要使⽤时, 直接在方法中添加对应参数即可, CookieSession可以从HttpServletRequest中来获取, 也可以直接使用HttpServletResponse设置Http响应状态码.

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

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

相关文章

私域如何高效管理多微信并实现聚合聊天?

在私域经营中,管理多个微信号是一项具有挑战性的任务。为了提高工作效率,辅助工具成为必不可少的一部分。而个微管理系统将为大家带来高效的多微信号管理体验,让大家能够更好地聚合聊天。 首先,个微管理系统提供了一个统一的界面…

PP-ShiTu V2商品识别系统(01.简介)

PP-ShiTu V2商品识别系统(01.简介) PP-ShiTuV2 是基于 PP-ShiTuV1 改进的一个实用轻量级通用图像识别系统,由主体检测、特征提取、向量检索三个模块构成,相比 PP-ShiTuV1 具有更高的识别精度、更强的泛化能力以及相近的推理速度*…

5.28_Java语法_运算符,接收键盘数据

1、运算符 具体应用同我C语言操作符详解博客相同,另有补充会直接写 1.1、基本的算术运算符、符号做连接符 CSDN 具体应用同我C语言操作符详解博客相同 符号做连接符: ""符号与字符串运算连用的时候是用作连接符的,其结果依然是一个字符串…

B站广告推广引流哪里能做?

哔哩哔哩(B站)作为国内领先的年轻人文化社区与视频平台,其独特的二次元文化氛围和高度活跃的用户群体,成为了众多品牌寻求突破、触达年轻消费群体的理想阵地。在这样一个充满活力但又竞争激烈的平台上有效推广,吸引并留…

光伏智慧化运营解决方案的应用和价值

在社会对新能源需求的不断扩大,光伏已经成为了可再生能源的重要组成部分,随着光伏电站数量和规模的不断扩大,相关企业和用户都就开始关注如何能够高效精准的进行电站管理,对此,鹧鸪云提出了光伏智慧化运营解决方案&…

webpack5_相关知识点

webpack是一个现代JavaScript应用程序的静态模块打包器(module bundler) ,是前端资源模块化管理和打包工具, 它可以将许多松散耦合的模块按照依赖和规则打包成符合生产环境部署的前端资源。还可以将按需加载的模块进行代码分离,等到实际需要时…

【光伏干货】光伏无人机巡检步骤

随着光伏产业的迅速发展和无人机技术的日益成熟,光伏无人机巡检已成为提高光伏电站运维效率、降低运维成本的重要手段。本文将详细介绍光伏无人机巡检的步骤,帮助读者更好地理解和应用这一技术。 一、前期准备 1、设备检查:对无人机及其相关…

Kong api网关实战教程

1. kong介绍 Kong是一款基于OpenResty(NginxLua模块)编写的高可用、易扩展的,由Mashape公司开源的API Gateway项目。Kong是基于NGINX和Apache Cassandra或PostgresQL构建的,能据供易于使用的RSTTAP[来操作和配置API管理系统,所以它可以水平扩…

HDU 2196 Computer(树形dp)

H D U 2196 C o m p u t e r (树形 d p ) \Huge{HDU 2196 Computer(树形dp)} HDU2196Computer(树形dp) 文章目录 题意思路标程 题目链接:Problem - 2196 (hdu.edu.cn) 题意 给出一个n个节点的无…

go webview/wails学习记录

文章目录 webview安装基础代码错误情况wails安装初始化一个项目错误信息使用arco-design(在初始化项目上修改代码)修改窗口图标多页面展示添加自定义图标-iconfont制作伸缩侧边栏侧边栏菜单在form中使用select且select联动选择使用go读取本地excel文件在转json_str使用go将json…

怎么把电脑上的文件传到手机上?可保存文档的云笔记

在职场中,我们经常需要将电脑上的重要文件、资料传到手机上,以便随时查阅和使用。比如,当你在公司完成了一份关键报告,但即将外出与客户沟通,这时如果能将报告传到手机上,就能在移动中随时准备应对客户的咨…

5.22-wjn

使用select实现的TCP并发服务器端 #define SER_PORT 8888 #define SER_IP "192.168.125.158" int main(int argc, const char *argv[]) {//1、为通信创建一个端点int sfd socket(AF_INET, SOCK_STREAM, 0);//参数1:说明使用的是ipv4通信域//参数2&#…

Oracle的安装以及一些相关问题

系列文章目录 Oracle的安装以及一些相关问题 文章目录 系列文章目录前言一、Oracle的安装二、常用命令三、误删dbf四、PLSQL乱码五、oracle更换数据库字符集总结 前言 一段时间没更新,主要最近一直在找工作,最终还是顺着春招找到工作了,现在…

【基础篇-Day8:JAVA字符串的学习】

目录 1、常用API2、String类2.1 String类的特点2.2 String类的常见构造方法2.3 String类的常见面试题:2.3.1 面试题一:2.3.2 面试题二:2.3.3 面试题三:2.3.4 面试题四: 2.4 String类字符串用于比较的方法2.5 String类字…

文生图模型演进:AE、VAE、VQ-VAE、VQ-GAN、DALL-E 等 8 模型

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…

【idea】IDEA 设置自动导入类 / 包等信息(import)

如果大家正在使用一个未曾导入(import)过的类,或者它的静态方法或者静态字段,IDEA 会给出对应的建议。需要手动操作导入类。 以下设置可以自动导入

磁珠笔记汇总

磁珠笔记汇总 磁珠是和电感很相似的器件。 电感磁珠单位亨(H)欧姆(Ω)是否储能存储能量消耗高频能量应用场景通常用于开关电源吸收高频,EMC保护如何看待损耗使用电感时希望损耗越小越好使用磁珠时是利用其损耗来消耗不需要的高频分量 一、磁珠的工作原理 磁珠与…

第十三届蓝桥杯国赛大学B组填空题(c++)

A.2022 动态规划 AC; #include<iostream> #define int long long using namespace std; int dp[2050][15]; //dp[i][j]:把数字i分解为j个不同的数的方法数 signed main(){dp[0][0]1;for(int i1;i<2022;i){for(int j1;j<10;j){//一种是已经分成j个数,这时只需每一个…

unbantu安装ollama,maxkb

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 背景一、Ollama安装1.安装2.安装后检验3.运行模型4.常用命令 二、安装maxkb1.说明2.docker安装maxkb2.添加模型3.创建应用4.api域名无效 三、总结 背景 最近在学习…

zabbix监控mysql

一、mysql数据库监控的内容有 mysql的吞吐量 mysql的常规操作&#xff08;增删改查&#xff09; QPS&#xff08;Questions Per second:&#xff09;每秒能处理多少次请求数 TPS&#xff08;Transactions Per Second&#xff09;每秒查询处理的事务数 mysql库大小和表大小 监控…