当前位置: 首页 > news >正文

Spring Web MVC入门(上)

1. Spring Web MVC

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

        什么是Servlet呢?

        Servlet 是一种实现动态页面的技术.准确来讲Servlet是一套 Java Web 开发的规范,或者说是一套Java Web 开发的技术标准,只有规范并不能做任何事情,必须要有人去实现它。        

        所谓实现 Servlet 规范,就是真正编写代码去实现 Servlet 规范提到的各种功能,包括类、方法、属性等。Servlet 规范是开放的,除了 Sun 公司,其它公司也可以实现 Servlet 规范,目前常见的实现了Servlet 规范的产品包括Tomcat、Weblogic、Jetty、Jboss、WebSphere 等,它们都被称为"Servlet 容器"。Servlet 容器用来管理程序员编写的 Servlet 类

        综上所述,Spring Web MVC 是⼀个 Web 框架. 下⾯咱们简称之为: Spring MVC;为了我们能够深入的了解spring mvc,我们下面首先来了解一下mvc;

1.1 MVC 定义

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

View(视图):指在应用程序中专门用来与浏览器进行交互,展示数据的资源。

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

Model(模型):是应用程序的主体部分,用来处理程序中数据逻辑的部分。

1.2 理解Spring MVC

         MVC 是⼀种架构设计模式, 也⼀种思想, ⽽ Spring MVC 是对 MVC 思想的具体实现. 除此之外, Spring MVC还是⼀个Web框架.

        总结来说,Spring MVC 是⼀个实现了 MVC 模式的 Web 框架. 所以, Spring MVC主要关注有两个点:

        1、mvc思想;

        2、web框架;

其实, Spring MVC 我们在前⾯已经⽤过了, 在创建 Spring Boot 项⽬时,我们勾选的 Spring Web 框架其实就是 Spring MVC 框架,如下图所示:

        如上图所示,Build web, including RESTful, applications using Spring MVC. Uses Apache Tomcat as the defaultembedded container.  说明创建spring boot项目应用了Spring MVC框架。

        我们也可以这样理解,Spring Boot 只是实现Spring MVC的其中⼀种⽅式⽽已. Spring Boot 可以添加很多依赖, 借助这些依赖实现不同的功能. Spring Boot 通过添加Spring Web MVC框架, 来实现web功能.

        不过Spring在实现MVC时, 也结合⾃⾝项⽬的特点, 做了⼀些改变, 相对⽽⾔, 下⾯这个图更能提体现spring 实现mvc思想的结构图:

2. 学习spring mvc

        既然是 Web 框架, 那么当用户在浏览器中输⼊了 url 之后,我们的 Spring MVC 项⽬就可以感知到用户的请求, 并给予响应. 故此学习Spring MVC, 重点也就是学习如何通过浏览器和⽤⼾程序进⾏交互,主要是下面三个方面:

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

2、请求:用户请求的时候,会带一些参数,在spring程序中要想办法获取到参数,所以请求主要是 要带有获取参数的功能。

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

        对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了 Spring MVC.

 2.1 项⽬准备

        Spring MVC 项⽬创建和 Spring Boot 创建项⽬相同,在创建的时候选择 Spring Web 就相当于创建了 Spring MVC 的项⽬.

        Spring MVC 使⽤ Spring Boot 的⽅式创建 ,创建项⽬时, 勾选上 Spring Web 模块即可,如下图所⽰:

2.2 建⽴连接

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

        创建UserController 类,编写如下代码:

package com.example.zxslzw2014_8_11;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@RequestMapping("/hello")public String hello(){return "hello,仲夏是荔枝味!";}
}

        注意:⽅法名和路径名称⽆需⼀致

2.2.1 @RequestMapping 使用

         @RequestMapping 是Spring Web MVC 应用程序中最常被用到的注解之一,它是用来注册接口的路由映射的

        上面代码中注解里包含 "/hello",表示服务器收到浏览器请求时,路径为 /hello 的请求就会调用 hello这个方法的代码。

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

        @RequestController的作用:

        既然使用@RequestMapping就可以使浏览器知道要把请求教给哪个方法了,那为什么还要加上@RequestController呢?我们现在把@RequestController去掉,再访问一次看看:

        可以看到, 程序报了404, 找不到该⻚⾯. 这就是 @RestController 起到的作⽤.

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

        Spring会对所有的类进⾏扫描, 如果类加了注解@RestController, Spring才会去看这个类⾥⾯的⽅法 有没有加 @RequestMapping 这个注解,spring就不会对这个类进行扫描,更不用说对着这个类的方法进行访问了

2.2.2 @RequestMapping 使⽤

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

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

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

        修改代码如下,给类加上注解:

package com.example.zxslzw2014_8_11;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/user")
public class UserController {@RequestMapping("/hello")public String hello(){return "hello,仲夏是荔枝味!";}
}

 

         @RequestMapping的URL路径前面不加 / (斜杠)也是可以的,Spring程序启动时,会进行判断,如果前面没有加 / ,Spring会自己拼接上一个 / 。现在代码如下:

package com.example.zxslzw2014_8_11;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("user")
public class UserController {@RequestMapping("hello")public String hello(){return "hello,仲夏是荔枝味!";}
}

 

        综上所述,结果是没有发生变化的;

        但在开发时还是建议把 / 加上,大部分企业的规范也是加上的,@RequestMapping的URL路径也可以是多层路径,但最终访问时,依然是:类路径 + 方法路径。

2.2.3 @RequestMapping是GET还是POST请求

        GET请求:

        浏览器发送的请求类型,都是get方法的,通过上面代码案例可以看出来@RequestMapping支持get请求。下面用fiddler抓包如下:

        POST请求:

        我们通过form表单来构造请求,先创建test.html,前端代码如下所示;

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><form action="/user/sayHi" method="post"><input type="submit" value="提交"></form></body>
</html>

        将前端代码要放在static目录下:

        访问地址url为http://127.0.0.1:8080/user/hello,点击提交;

        从运⾏结果可以看出: @RequestMapping 既⽀持Get请求, ⼜⽀持Post请求. 同理, 也⽀持其他的请 求⽅式.

2.2.4 指定GET/POST⽅法类型

        可以显⽰的指定@RequestMapping 来接收POST的情况,如下所⽰:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController2 {@RequestMapping(value = "/getRequest",method= RequestMethod.POST)public String sayHi(){return "get request...";}
}

3.postman的学习

3.1 下载安装Postman

        (略)

3.2  创建请求

        下图为添加请求页面的介绍:

        下图为请求的响应结果:

3.3 传参介绍

3.3.1 普通传参

         学习HTTP环节时,我们通过URL来访问互联网上的某一个资源,URL的格式如下:

        其中, 查询字符串就是请求的参数,如下所示:

3.3.2. form-data

        (完整表⽰为: multipart/form-data)

        表单提交的数据,在 form 标签中加上:enctyped="multipart/form-data",通常用于提交图片 / 文件。对应 Content-Type:multipart/form-data。

3.3.3 x-www-form-urlencoded

          form表单,对应:Content-Type: appliction/x-www-from-urlencode

3.3.4 raw

        可以上传任意的文本格式,例如text、json、xml、html等等,如图:

ps:本次的内容就到这里了,如果对你有所帮助的话,就请一键三连哦!!!

本文的封面来自:bilibili苏杉杉的pv,侵权删 url:https://www.bilibili.com/video/BV1vo4y167eh/?spm_id_from=333.999.0.0&vd_source=866da5be2ef0ddd213b053523da53138
————————————————

电子签名:上嘉路

相关文章:

Spring Web MVC入门(上)

1. Spring Web MVC Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc)&#xff0c;但它通常被称为“spring MVC”&#xff1b; 什么是Servlet呢? Servlet…...

【c++】公差判断函数 isInTolerance

定义&#xff1a; isInTolerance 函数用来判断一个特定数值&#xff08;变量&#xff09;是否在以某个中心值为基准 &#xff0c;给定半径的范围内。这个函数包含了一个可选的参数 includeEndpoints&#xff08;默认为 true&#xff09;&#xff0c; 用于决定范围是否包含其端点…...

电脑新加的硬盘如何分区?新加硬盘分区选MBR还是GPT

最近有网友问我,电脑新加的硬盘如何分区?电脑新加的硬盘分区选MBR还是GPT要看引导模式采用uefi还是传统的legacy模式&#xff0c;如果采用的是uefi引导模式&#xff0c;分区类型对应的就是gpt分区(guid)&#xff0c;如果引导模式采用的是legacy&#xff0c;对应的分区类型为mb…...

白骑士的Matlab教学基础篇 1.3 控制流

系列目录 上一篇&#xff1a;白骑士的Matlab教学基础篇 1.2 MATLAB基础语法 控制流是编程中的核心概念&#xff0c;通过控制程序执行的顺序&#xff0c;从而实现复杂的逻辑操作。MATLAB 提供了多种控制流语句&#xff0c;包括条件语句、循环语句以及循环控制语句。掌握这些控制…...

设计模式 - 适配器模式

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、适配器…...

docker部署minIO

docker部署minIO 旧版本新版本 旧版本 #-u 以root用户运行容器&#xff1b;--privilegedtrue 给予容器命令访问权限 docker pull minio/minio:RELEASE.2021-06-17T00-10-46Z docker run -p 9001:9000 --name minio -d \-u root --privilegedtrue \-e "MINIO_ROOT_USERmin…...

「Pytorch」BF16 Mixed Precision Training

在深度学习领域&#xff0c;神经网络的训练性能瓶颈常常出现在 GPU显存的使用上。主要表现为两方面&#xff1a; 单卡上可容纳的模型和数据量有限&#xff1b;显存与计算单元之间的带宽和延迟限制了运算速度&#xff1b; 为了解决显卡瓶颈的问题&#xff0c;涌现了不同的解决…...

论文阅读:Efficient Core Maintenance in Large Bipartite Graphs | SIGMOD 2024

还记得我们昨天讨论的《Querying Historical Cohesive Subgraphs over Temporal Bipartite Graphs》这篇论文吗? https://blog.csdn.net/m0_62361730/article/details/141003301 这篇(还没看的快去看) 这篇论文主要研究如何在时间双向图上查询历史凝聚子图&#xff0c;而《E…...

LLMOps — 使用 BentoML 为 Llama-3 模型提供服务

使用 BentoML 和 Runpod 快速设置 LLM API 经常看到数据科学家对 LLM 的开发感兴趣&#xff0c;包括模型架构、训练技术或数据收集。然而&#xff0c;我注意到&#xff0c;很多时候&#xff0c;除了理论方面&#xff0c;许多人在以用户实际使用的方式提供这些模型时遇到了问题…...

微软蓝屏事件揭秘:有问题的数据引发内存读取越界

讲动人的故事&#xff0c;写懂人的代码 CrowdStrike前一阵在官网上发布了上周爆发的全球企业微软蓝屏事件的官方初步复盘结果。其中谈到了这次事件的根本原因&#xff1a; 2024年7月19日&#xff0c;我们部署了两个额外的IPC模板实例。由于内容验证器中的一个bug&#xff0c;使…...

NASA:北极ARCTAS差分吸收激光雷达(DIAL)遥感数据

ARCTAS Differential Absorption Lidar (DIAL) Remotely Sensed Data ARCTAS差分吸收激光雷达&#xff08;DIAL&#xff09;遥感数据 简介 ARCTAS差分吸收激光雷达&#xff08;DIAL&#xff09;遥感数据是一种远程感测技术&#xff0c;用于测量大气中不同波长的激光辐射被大…...

Android 文件上传与下载

在实际开发涉及文件上传不会自己写上传代码&#xff0c;一般 会集成第三网络库来做图片上传&#xff0c;比如android-async-http&#xff0c;okhttp等&#xff0c;另外还有七牛也提供 了下载和上传的API。 1.项目用到的图片上传的关键方法&#xff1a; 这里用到一个第三方的库…...

Java语言的充电桩系统Charging station system

介绍 SpringBoot 框架&#xff0c;充电桩平台充电桩系统充电平台充电桩互联互通协议云快充协议1.5-1.6协议新能源汽车二轮车公交车二轮车充电-四轮车充电充电源代码充电平台源码Java源码-共享充电桩-充电桩软件 软件介绍 小程序端&#xff1a;城市切换、附近电站、电桩详情页…...

RCE之无参数读取文件

什么是无参数&#xff1f; 顾名思义&#xff0c;就是只使用函数&#xff0c;且函数不能带有参数&#xff0c;这里有种种限制&#xff1a;比如我们选择的函数必须能接受其括号内函数的返回值&#xff1b;使用的函数规定必须参数为空或者为一个参数等 例题&#xff1a; <?…...

Python GUI开发必看:Tkinter Button控件使用详解

Button&#xff08;按钮&#xff09;组件用于实现各种各样的按钮。 Button组件可以包含文本或图像&#xff0c;你可以将一个Python的函数或方法与之相关联&#xff0c;当按钮被按下时&#xff0c;对应的函数或方法将被自动执行。 Button组件仅能显示单一字体的文本&#xff0c…...

上海市计算机学会竞赛平台2024年7月月赛丙组得分排名

题目描述 给定 nn 名学生的考试得分&#xff0c;这些学生的学号为 11 到 nn&#xff0c;其第 ii 号学生的得分为 aiai​&#xff0c;请将这些学生按照分数从大到小的顺序排列并输出学号序列。 若两个学生得分相同&#xff0c;则先输出较小的学号。 输入格式 第一行&#xf…...

Can GPT-3 Perform Statutory Reasoning?

文章目录 题目摘要相关工作SARAGPT-3 对美国法典的了解GPT-3 在对合成法规进行简单推理时遇到困难结论 题目 GPT-3 可以进行法定推理吗&#xff1f; 论文地址&#xff1a;https://arxiv.org/abs/2302.06100 摘要 法定推理是用事实和法规进行推理的任务&#xff0c;法规是立法机…...

redis面试(十一)锁超时

boolean res lock.tryLock(100, 10, TimeUnit.SECONDS); RedissonLock里面有这样一个方法tryLock()&#xff0c;意思是尝试获取锁的结果。 最大等待时间100s&#xff0c;并且获取到锁之后&#xff0c;10s之内没有释放的话&#xff0c;锁会自动失效。 尝试获取锁超时 time …...

C代码做底层及Matlab_SimuLink做应用层设计单片机程序

前言:SimuLink工具极其强大,但是能直接支持单片机自主开发的很少,造成这个问题的原因主要是我们使用的芯片底层多是C代码工程,芯片厂家也只提供C代码库,很少能提供SimuLink的支持库,即使提供也不是很不完善,如NXP的一些芯片提供的SimuLink库不含盖高级应用,再比如意法半…...

Cloud Kernel SIG 月度动态:ANCK OOT 驱动基线更新,发布 2 个 ANCK 版本

Cloud Kernel SIG&#xff08;Special Interest Group&#xff09;&#xff1a;支撑龙蜥内核版本的研发、发布和服务&#xff0c;提供生产可用的高性价比内核产品。 01 SIG 整体进展 1. 发布 ANCK 5.10-016.4 小版本。 2. 发布 ANCK 5.10-017.1 小版本。 3. ANCK 新增海光平…...

vue3仿飞书头像,根据不同名称生成不同的头像背景色

效果展示&#xff1a; 传递三个参数&#xff1a; name&#xff1a;要显示的名称&#xff1b;size&#xff1a;头像的大小&#xff1b;cutNum&#xff1a;分割当前名称的最后几位数&#xff1b; 代码如下&#xff1a; <template><div:style"{color: #fff,borde…...

SpringBoot整合三方

SpringBoot整合redis 引入redis依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>redis.clients</groupId&g…...

React之组件的使用

Vue、React和Angular是三个流行的前端框架&#xff0c;采用组件化的开发方式。支持虚拟DOM&#xff08;Virtual DOM&#xff09;技术&#xff0c;有丰富的生态系统、大量的插件和工具可以使用。Vue的语法是传统的HTML和JavaScript&#xff0c;React使用JSX语法&#xff0c;Angu…...

深度学习--长短期记忆网络

1.引入 RNN 可以将以前的信息与当前的信息进行连接。例如&#xff0c;在视频中&#xff0c;可以用前面的帧来 帮助理解当前帧的内容&#xff1b;在文本中&#xff0c;可以用前面半句话的内容来预测后面的内容。但是&#xff0c; RNN 存在一个记忆消失的问题。例如&#xff0c;…...

研0 冲刺算法竞赛 day29 P2249 【深基13.例1】查找

P2249 【深基13.例1】查找 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路&#xff1a; ①二分查找 ②stl函数&#xff1a;lower_bound(a.begin(),a.end(),x) 返回第一个大于等于 x的数的地址 代码&#xff1a; #include<iostream> #include<algorithm> …...

基于vue框架的CKD电子病历系统nfa2e(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;患者,医生,药品信息,电子病历,临时医嘱,长期医嘱,健康科普 开题报告内容 基于Vue框架的CKD电子病历系统 开题报告 一、选题背景 随着信息技术的飞速发展和医疗信息化的深入推进&#xff0c;电子病历系统&#xff08;Electronic Medic…...

笔记:python 安装tar包报错

报错信息 ERROR: Could not find a version that satisfies the requirement setuptools>40.8.0 (from versions: none)ERROR: No matching distribution found for setuptools>40.8.0分析 1&#xff0c;当前已安装 setuptools 并且版本超过40.8.0 解决方案 缺包了&am…...

575. 分糖果

哈喽&#xff01;大家好&#xff0c;我是奇哥&#xff0c;一位专门给面试官添堵的职业面试员 文章持续更新&#xff0c;可以微信搜索【小奇JAVA面试】第一时间阅读&#xff0c;回复【资料】更有我为大家准备的福利哟&#xff01; 文章目录 一、题目二、答案三、总结 一、题目 …...

手机电量消耗分析工具 Battery Historian 指南

阅读五分钟&#xff0c;每日十点&#xff0c;和您一起终身学习&#xff0c;这里是程序员Android 本篇文章主要介绍 Android 开发中 电量 的部分知识点&#xff0c;通过阅读本篇文章&#xff0c;您将收获以下内容: 一、安装Battery Historian二、收集Batterystats 数据三、使用B…...

笔试练习day4

目录 WY22 Fibonacci数列题目解析解法暴力解法贪心代码 NC242 单词搜索题目解析例子1解析例子2解析例子3解析解法深度优先遍历dfs实现最终代码 BC140 杨辉三角解法线性dp问题代码 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&am…...