Spring Web MVC入门(1)

news2024/11/15 11:14:28

什么是Spring Web MVC?

定义:Spring Web MVC是基于Servlet构建的原始Web框架,从一开始就包含在Spring框架中.它的正式名称"Spring Web MVC"来自其源模块的名称(Spring-webmvc),但是它通常被称为"Spring MVC".

什么是Servlet?

Servlet是一种实现动态页面的技术.准确地来讲Servlet是一套Java Web开发的规范,或者是一套Java Web开发的技术标准.只有规范并不能做任何事情,必须要有人来实现它.所谓实现Servlet规范,就是真正编写代码去实现Servlet规范提到的各种功能,包括类,方法,属性等.

从定义中可以得到一个关键信息: Spring Web MVC是一个Web框架. 之后我们简称为:Spring MVC

然而想真正搞清楚什么是Spring MVC, 我们首先要搞懂MVC是什么.

MVC定义

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

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

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

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

比如去饭店吃饭

客户进店之后,服务员来接待客户点餐,客户点完餐之后,把客户菜单交给前厅.前厅根据客户菜单给后厨下达命令.后厨负责做饭,做完之后,再根据菜单告诉服务员,这是X号餐桌客人的饭. 

在这个过程中

服务员就是View(视图),负责接待客户,帮助客户点餐,以及给顾客端饭.

前厅就是Controller(控制器),根据用户的点餐情况,来选择给哪个后厨下达命令.

后厨就是Model(模型),根据前厅的要求来完成客户的用餐需求. 

 什么是Spring MVC

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

总结来说, Spring MVC是一个实现了Web模式的MVC框架.

所以Spring MVC主要的关注有两个点: 1.MVC; 2.Web框架.

Spring boot和Spring MVC之间的关系:

Spring Boot是实现Spring MVC的一种方式.

Spring Boot可以添加很多依赖,借助这些依赖实现不同的功能.Spring Boot通过添加Spring Web MVC框架,来实现Web功能.

比如:厨房可以用来做饭,但真实实现做饭功能的是火及各种做饭的相关食材和工具.

厨房就好比Spring Boot,厨房可以装柜子,实现收纳功能,装燃气灶等,实现做饭功能.

做饭这个事,就是MVC,在几千年前,有火有食材就可以做饭. 

不过Spring在实现MVC时,也结合自身项目的特点,做了一点改变,相对而言,使用这个图更合适:
 

不过核心没有变

比如上面的例子中,去饭店吃饭.一些饭店是前厅负责接待客户,帮助客户点餐,也就是Controller来负责接收用户的请求. 

学习Spring MVC

既然是Web框架,那么当在浏览器中输入url之后,我们的Spring MVC就可以感知到用户的请求,并给予响应.(我们学习Spring MVC,重点也就是学习如何通过浏览器和用户程序进行交互).

主要分以下几个方面:

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

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

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

比如用户去银行存款

1.建立连接:去柜台

2.请求:带着银行卡,身份证去存款.

3.响应:银行返回一张存折. 

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

建立连接

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

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

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

@RestController
public class UserController {
    //路由器规则注册
    @RequestMapping("/sayHi")
    public String sayHi() {
        return "hello, Spring MVC";
    }
}

方法名和路径名称无需一致.

接下来访问:http://127.0.0.1:8080/sayHi,就可以看到程序返回的程序了.

 

@RequestMapping注解介绍

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

表示服务收到请求时,路径为/sayHi的请求就会调用sayHi这个方法的代码.

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

既然@RequestMapping已经可以达到我们的目的了,我们为什么还要加@RestController呢?

我们把@RestController去掉,再来访问一次:

可以看到,程序报了404,找不到页面.

这就是@RestController起到的作用

一个项目中,会有很多类,每个类可能有很多的方法,Spring程序怎么知道要执行哪个方法呢?

Spring会对所有的类进行扫描,如果类加了注解@RestController, Spring才会去看这个类里面的方法有没有加@RequestMapping这个注解,当然它的作用不止这一点,咱们先用.

@RequestMapping使用

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

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

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

@RequestMapping("/user")
@RequestController
public class UserController {
    @RequestMapping("/sayHi")
    public String sayHi() {
        return "Hello, Spring MVC";
    }
}

访问地址:http://127.0.0.1:8080/user/sayHI

注意:@RequestMapping的URL路径最前面加不加 / (斜杠)都可以,Spring程序启动时,会进行判断,如果前面没有加 / , Spring就会加上一个 / .

访问之后仍然是可以正常响应的. (通常情况下,我们都会加上 / 

@RequestMapping的路径也可以是多层路径,最终访问时,依然是类路径 + 方法路径.

​
@RequestMapping("/user/m1")
@RequestController
public class UserController {
    @RequestMapping("/say/hi")
    public String sayHi() {
        return "Hello, Spring MVC";
    }
}

​

访问路径:http://127.0.0.1:8080/user/m1/say/hi

 @RequestMapping是GET还是POST请求?

我们来测试一下就可以得到结论了.

GET请求:

浏览器发送的类型都是get,通过以上案例,可以看出来@RequestMapping支持get请求.

POST请求:

我们通过form表单来构造请求.

创建test.html, html代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/request/hello" method="post">
        <input type="submit" value="发送请求">
    </form>
</body>
</html>

访问方式为http://127.0.0.1:8080/test.html

从运行结果可以看出:@RequestMapping既支持Get请求,又支持Post请求.同理,也支持其它的请求方式. 

 

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

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

相关文章

【C++】排序算法

目录 一、排序算法概述 二、初级排序算法 三、进阶排序算法 四、分治思想排序 五、哈希思想排序 六、分割思想排序 一、排序算法概述 在C语言中&#xff0c;通常需要手写排序算法实现对数组或链表的排序&#xff0c;但是在C中&#xff0c;标准库中的<algorithm>头…

【兔子机器人】实现从初始状态到站立

一、遥想星空up主的方法 由于我有卡位结构&#xff0c;无法做到劈腿&#xff0c;而且底盘也不一样&#xff0c;无法使用此方法 但是其代码思想是可以借鉴的。 参考视频&#xff1a; 【【开源啦&#xff01;】无刷轮腿平衡机器人】 【精准空降到 01:16】 https://www.bilibili…

C++类和对象一

#include <iostream> using namespace std;//设计一个学生类 class CStudent {public: //公有成员void InputData(){cout << "请输入学号";cin >> sno;cout << "请输入姓名";cin >> sname;cout << "请输入分…

RabbitMq踩坑记录

1、连接报错&#xff1a;Broker not available; cannot force queue declarations during start: java.io.IOException 2.1、原因&#xff1a;端口不对 2.2、解决方案&#xff1a; 检查你的连接配置&#xff0c;很可能是你的yml里面的端口配置的是15672&#xff0c;更改为5672即…

第110讲:Mycat实践指南:指定Hash算法分片下的水平分表详解

文章目录 1.应用指定Hash算法分片的概念2.使用应用指定Hash算法分片对某张表进行水平拆分2.1.在所有的分片节点中创建表结构2.2.配置Mycat实现应用指定Hash算法分片的水平分表2.2.1.配置Schema配置文件2.2.2.配置Rule分片规则配置文件2.2.3.配置Server配置文件2.2.4.重启Mycat …

交换机/路由器的存储介质-思科

交换机/路由器的存储介质-思科 本文主要介绍网络设备的存储介质组成。 RAM(random-accessmemory&#xff0c;随机访问存储器) RAM中内容断电丢失&#xff0c;主要用于运行操作系统、运行配置文件、IP 路由表:、ARP 缓存、数据包缓存区。 ROM(read-only memory&#xff0c;只…

多做【二叉搜索树】【数组转化为树】Leetcode 108. 将有序数组转换为二叉搜索树

【二叉搜索树】【数组转化为树】Leetcode 108. 将有序数组转换为二叉搜索树 解法1 递归 ---------------&#x1f388;&#x1f388; 108. 将有序数组转换为二叉搜索树 题目链接&#x1f388;&#x1f388;------------------- 解法1 递归 给你一个整数数组 nums &#xff0…

【Vue2】组件通信

父子通信 父 -> 子 子 -> 父 props 校验 props: {校验的属性名: {type: 类型, // Number String Boolean ...required: true, // 是否必填default: 默认值, // 默认值validator (value) {// 自定义校验逻辑return 是否通过校验}} },data 的数据是自己的 → 随便改pr…

【leetcode+深度/广度优先搜索】841. 钥匙和房间 (DFS,BFS)

leetcode-cn&#xff1a;leetcode面试75道精华&#xff1a;https://leetcode.cn/studyplan/leetcode-75/ 841.钥匙和房间&#xff1a;https://leetcode.cn/problems/keys-and-rooms/description/ 一、题目&#xff1a;841. 钥匙和房间 有 n 个房间&#xff0c;房间按从 0 到 n…

面试经典-16- 环形链表

题目 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#…

【数学建模】熵权法

之前我们学了层次分析法和topsis法&#xff0c;但是主观性十分强&#xff0c;有没有科学的方法得出权重呢&#xff1f;今天&#xff0c;我们来学习熵权法&#xff01; 基本概念&#xff1a; 熵权法&#xff0c;物理学名词&#xff0c;按照信息论基本原理的解释&#xff0c;信息…

尼伽OLED透明屏闪耀第24届中国零售业博览会,引领零售行业革新

2024 CHINA SHOP 第二十四届中国零售业博览会 3.13-15 上海 3.13-15日&#xff0c;第24届中国零售业博览会盛大开幕&#xff0c;起立科技&#xff08;旗下品牌&#xff1a;起鸿、尼伽&#xff09;携其自主研发的30寸OLED透明屏和移动AI透明屏机器人惊艳亮相&#xff0c;成为展…

租房网站|基于springboot框架+ Mysql+Java+B/S架构的租房网站设计与实现(可运行源码+数据库+设计文档+部署说明)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 用户功能模块 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参…

Redis-复制功能

0 序言 复制功能是Redis提供的多机功能中最基础的一个&#xff0c;这个功能是通过主从复制&#xff08;master-slave replication&#xff09;模式实现的&#xff0c;它允许用户为存储着目标数据库的服务器创建出多个拥有相同数据库副本的服务器&#xff0c;其中存储目标数据库…

【C++】stack、queue模拟实现+仿函数

stack、queue模拟实现仿函数 stack定义stack模拟实现 queue定义queue模拟实现 priority_queue定义priority_queue模拟实现 deque定义底层分析 容器适配器定义种类 仿函数控制类里面数据的比较逻辑回调函数仿函数两者区别 铁汁们&#xff0c;今天给大家分享一篇stack、queue模拟…

Kubernetes operator系列:webhook 知识学习【更新中】

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes operator学习 系列文章&#xff0c;本节会对 kubernetes webhook 知识进行学习 本文的所有代码&#xff0c;都存储于github代码库&#xff1a;https://github.com/graham924/share-code-operator-st…

【大厂AI课学习笔记NO.80】深度学习行业人才能力图谱

深度学习领域的就业岗位及所需关键技术、工具、能力分析 深度学习作为人工智能领域的一个重要分支&#xff0c;近年来得到了飞速的发展。随着技术的不断进步和应用场景的不断拓展&#xff0c;深度学习领域的就业岗位也日益增多。本文将从领军人才、产业研发人才、应用开发人才…

Lombok原理及实例(Java) - 简化JavaBean开发

Lombok 1.作用:简化javabean开发 2.使用:a.下插件 -> 如果是idea2022不用下载了,自带b.导lombok的jar包c.修改设置 1.lombok介绍 Lombok通过增加一些“处理程序”&#xff0c;可以让javabean变得简洁、快速。 Lombok能以注解形式来简化java代码&#xff0c;提高开发效…

HttpServer整合模块设计与实现(http模块五)

目录 类功能 类定义 类实现 编译测试 源码路标 类功能 类定义 // HttpServer模块功能设计 class HttpServer { private:using Handler std::function<void(const HttpRequest &, HttpResponse &)>;std::unordered_map<std::string, Handler> _get_r…

JS实现漂浮广告案例

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>漂浮广告</title><style>#link {…