javaEE进阶——SpringBoot与SpringMVC第一讲

文章目录

  • 什么是springMVC
    • SpringMVC
    • 什么是模型、视图、控制器
    • MVC和SpringMVC的关系
    • SpringMVC的使用
      • 第一个SpringMVC程序
        • @RestController
          • 什么是注解
        • 那么@RestController到底是干嘛的呢?
        • @RequestMapping
    • 如何接收来自请求中的querystrying
      • @RequestParam
      • @RequestMapping("/m9/{userId}/{name}")

什么是springMVC

SpringMVC

首先想要知道什么是SpringMVC我们就要先知道它的意思,首先什么是MVC呢?MVC即

	模型,视图,控制器

其实SpringMVC全名应该叫做SpringWebMVC,它其实是基于servlet来构建的一个原始web框架从一开始就包含在了spring框架中。
那么通过上面的介绍我们知道SpringMVC的两个基本信息

第一个:它是一个web矿建
第二个:它是基于servlet的api构建出的一个框架

什么是模型、视图、控制器

模型视图控制器其实是我们软件架构模式中的一种,它把软件系统分为了这三个部分我们来分别进行解析一下
在这里插入图片描述
Model(模型):是应用程序中负责存取程序和数据逻辑的部分,一般是在数据库中负责数据的存取
Controller(控制器):是应用程序中负责用户交互的部分通常控制器负责从视图中读取,用户需要的数据并返回给用户。
View(视图):是应用程序中用来显示出数据的部分通常视图是依据模型数据创建的。

MVC和SpringMVC的关系

我们上面说到MVC其实是实现一个应用的一种架构,那么SpringMVC呢?其实就是对这种架构的具体实现,也就是说MVC是一种思想,SpringMVC是实现这种思想的其中一种方式,

SpringMVC的使用

那么我们说了既然SpringMVC是一个web框架,并且还是MVC架构的一种实现,并且还是基于servlet的API创造出的,那么我们代入一下,学习Servlet的过程,我们可以推测出他肯定也是获取连接,并且根据连接请求,建立与数据库的交互并且返回数据,那么Servlet是根据@WebServlet(“/xxx”)来进行解析连接的,那么SpringMVC是怎么使用的呢?我们来看一下。

第一个SpringMVC程序

首先我们先写一个类

@RestController
public class hello {
    
}

我们来看一下映入眼帘中的第一个让我们懵逼的东西那就是这个类上的注解@RestController,我们接下来就来解释一下这个注解

@RestController

什么是@RestController呢?他是一个注解,或者说叫做组合注解,那么我们先搞懂一个概念,什么是注解?

什么是注解

我们可以类比于注释的概念去理解,这两者最大的区别就是注释主要是给人看的,而注解是给机器看的,比如说我们在学习多态那里的时候如果细心的同学应该在重写了父类的方法子类方法中见到过@Override这个注解,这个注解的作用就是告诉编译器我的 这个方法是重写了父类的方法,那么当编译器看到这个注解的时候他会多做一些事情,首先要做的就是要先看看你到底有没有重写父类的方法你要是没有写那你就是欺骗我的感情,是渣男,渣女人渣,这时候编译器直接不留情面的给你来个报错。那么专业些的说法是什么呢?
注解是提供一种为程序元素设置元数据的方法,理解起来还是一样的,程序元素就是指接口、类、属性、方法,这些都是属于程序的元素,那啥叫元数据呢?就是描述数据的数据(data about data),举个简单的例子,系统上有一个sm.png文件,这个文件才是我们真正需要的数据本身,而这个文件的属性则可以称之为sm.png的元数据,是用来描述png文件的创建时间、修改时间、分辨率等信息的,这些信息无论是有还是没有都不影响它作为图片的性质,都可以使用图片软件打开。

那么@RestController到底是干嘛的呢?

我们有了上面概念的基础我们再来说一下,到底@RestController是干嘛的,他想告诉编译器什么?大家不要急要想知道这个问题我们要先搞明白,为什么说他是组合注解它组合了谁,它组合 的就是@Controller和@ResponseBody两个注解的功能。那么组合之后有什么功能呢?@RestController注解的类接下来类中的方法返回的数据都是json数据,也就是说当我们使用了@RestController这个注解之后我们就不需要在要返回json数据的方法中添加@ResponseBody注解了。
那么接下来我们就要继续写代码了。

package com.example.test_spring2.controller;

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

@RestController
public class hello {
    @RequestMapping("sayHi")
    public String hello(){
        return "hello Spring MVC";
    }
}

这一次我们加入了新的方法和注解那就是@RequestMapping那么接下来我们再次来学习一下这个注解

@RequestMapping

这个注解的作用是什么呢?这个注解的作用我们可以参考一下@WebServlet这个注解,我们知道@WebServlet这个注解是为了映射连接的说白了我们想要访问被这个注解修饰的方法就必须要输入这个注解中的值作为url,那么@RequestMapping也一样也是为了去进行地址映射的,那么这个注解除了修饰方法之外还能修饰类吗?答案是可以的。那么我们来写一个代码试试把

package com.example.test_spring2.controller;

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

@RestController
@RequestMapping("/sayicll")
public class hello {
    @RequestMapping("sayHiIicll")
    public String hello(){
        return "hello Spring MVC";
    }
}

那么如果代码这样写的话我们的url该怎么写呢?如下

	http://127.0.0.1:8080/sayicll/sayHiIicll

也就是说我们需要先将描述类的那层@RequestMapping写在前面然后写描述方法的@RequestMapping,此时可能就会用同学有疑问,既然这样子的话那我发送什么请求可以被接收呢?我们来测试一下就可以了这里我们使用的软件是postman
在这里插入图片描述
在这里插入图片描述

这里我们发现无论是get还是post请求我们都能发送别接受其返回,那么这时候可能会用同学有疑问那么如果我就是想要让他特定的接收其中一个请求怎么办呢?当然也可以,这就需要用到method了如下

@RestController
@RequestMapping("/sayicll")
public class hello {
    @RequestMapping(value = "sayHiIicll",method = RequestMethod.POST)
    public String hello(){
        return "hello Spring MVC";
    }
}

这就表示他只能使用post进行那么还有别的形式吗?也是有的如下代码我们来构建一下请求

@RestController
@RequestMapping("/sayicll")
public class hello {
    @PostMapping("helloIicll")
    public String hello(){
        return "hello Spring MVC";
    }
    @PostMapping("hiIicll")
    public String hi(){
        return "hi I i cll";
    }
}

在这里插入图片描述
那么如上这个注解就可以帮助我们这个方法只能,接收post请求那么我们按照相同的思路就能猜测到肯定有个注解叫做@GetMapping,那么这个注解肯定就是帮助我们的方法只能接收Get请求了。

如何接收来自请求中的querystrying

首先我们来看一下我们的后端代码

 @RequestMapping("/h1")
    public String h1(String name){
        return "name="+name;
    }

有了上面的基础我们来尝试一下接收来自请求中querystring中的参数,这里的参数如何获取呢?其实也很简单就是保证我们这个方法中的参数和我们querystring中的参数一致这样spring可以帮助我们自动匹配,那么我们来看一下结果验证一下吧。
在这里插入图片描述
这里我们发现我们只需要做到前端的querystring和后端方法中设置的参数名一致就可以保证我们的请求序列中的参数被准确的接收到了。那么假如说我不希望和前端的保持一致呢?也就是我如何才能跟前端发给我的参数名称进行重命名呢?这时候就需要学习到一个新的注解了。

@RequestParam

我们来解释一下@RequestParam这个注解,这个注解的作用就是重命名前端传来的参数,用法是如何呢?我们来看一下代码

 @RequestMapping("/h1")
    public String h1(@RequestParam("name") String username){
        return "name="+username;
    }

我们来看一下结果如下图
在这里插入图片描述
那么这时候我们来思考一个问题那就是这里有什么不同呢?其实很明显的一个就是我们的代码中原来返回的是name现在返回的参数是username了,其实这就是因为name是前端发送给我们的数据参数,username才是我们后端自己命名的参数那么你想在后端代码中使用这个值你肯定用的是自己定义的参数才对嘛。此外我们需要注意的是这样写的话这个name就是一个必传参数,也就是说必须要有这个name值才可以那么如果我不想设置这个参数呢?

 @RequestMapping("/h1")
    public String h1(@RequestParam(value = "name",required = false) String username){
        return "name="+username;
    }

在这里插入图片描述
这里我们只需要设置一下request=false就可以了。

@RequestMapping(“/m9/{userId}/{name}”)

这里我们想一下一些url的一些我们需要的属性可能即不在query string中也不在body中而是在url中那么这时候我们该怎么办呢?这里 @RequestMapping给我们提供了更多的用法也就是上面的那种我们只需要将我们需要的参数提前在 @RequestMapping中设置好就可以了,此外我们还需要搭配着另外的一个属性,@PathVariable 进行使用那么代码如下

  @RequestMapping("/m9/{userId}/{name}")
    public String m9(@PathVariable Integer userId,@PathVariable("name") String userame){
        return "userId:"+userId + ",userame:"+userame;
    }

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

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

相关文章

Java入门基础学习笔记18——赋值运算符

赋值运算符: 就是“”,就是给变量赋值的,从右边往左边看。 int a 10; // 把数据赋值给左边的变量a存储。 扩展赋值运算符: 注意:扩展的赋值运算符隐含了强制类型转换。 package cn.ensource.operator;public class…

Linux 第三十四章

🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要等到什么都没有了…

svn批量解锁

问题 svn对文件进行checkout之后,先进行lock,之后再去更改,最后进行Commit操作; 上述为我们通过svn管理代码的正常方式,但总会有其他现象发生; 如果我们非正常操作,批量锁所有的svn文件&#x…

中国农业大学:学硕11408复试线上涨40分,今年还会持续涨吗?中国农业大学计算机考研考情分析!

中国农业大学(China Agricultural University),简称“中国农大”,坐落于中国首都北京,由中华人民共和国教育部直属,中央直管副部级建制,水利部、农业部和北京市共建,位列国家“双一流…

串,数组和广义表

2.1.求next和nextval的实现 代码&#xff1a; int next_one(char *str, int len) {int result 1;if(len 1 || len 0) return len;for (size_t i 1; i < len; i){ if(compare(str, strlen-i, i)) {result i1;//break;}}return result; }int next(char *str, int *…

【校园生活小程序_超详细部署】

校园生活小程序 1 完整小程序源码2 运行环境3 初次运行3.1 启动后端程序3.1.1 导入项目&#xff0c;找到项目的pom.xml文件&#xff0c;点击ok进行打开。3.1.2 创建数据库并插入内容 3.1.3 配置项目结构信息3.1.4 配置Tomcat服务器3.1.5 正式启动后端项目3.1.6出现BUG3.1.7 解决…

小程序框架是智能融媒体平台构建的最佳线路

过去5年&#xff0c;媒体行业一直都在进行着信息化建设向融媒体平台建设的转变。一些融媒体的建设演变总结如下&#xff1a; 新闻终端的端侧内容矩阵建设&#xff0c;如App新闻端&#xff0c;社交平台上的官方媒体等新闻本地生活双旗舰客户端&#xff0c;兼顾主流媒体核心宣传…

【密评】 | 商用密码应用安全性评估从业人员考核题库(09)

Hill密码是重要古典密码之一&#xff0c;其加密的核心思想的是&#xff08;&#xff09;。 A.线性变换 B.非线性变换 C.循环移位 D.移位 著名的Kerckhoff原则是指&#xff08;&#xff09;。 A.系统的保密性不但依赖于对加密体制或算法的保密&#xff0c;而且依赖于密钥 B.系统…

深入 Go 语言:使用 math/rand 包实现高效随机数生成

深入 Go 语言&#xff1a;使用 math/rand 包实现高效随机数生成 介绍math/rand 包的核心功能设计哲学应用场景 基础使用方法初始化和种子设置设置种子创建私有随机数生成器 基础函数详解生成整数生成特定范围的整数生成浮点数随机置乱数组 进阶技巧随机数的统计属性生成正态分布…

第83天: 代码审计-PHP 项目RCE 安全调试追踪代码执行命令执行

案例一&#xff1a;CNVD拿1day-RCE命令执行-百家CMS 这里用代码审计系统搜索system&#xff0c;可以利用的是第一种 打开看细节 查找函数引用 查找$_file第一次出现的地方 这个时候就明白了&#xff0c;必须上传文件&#xff0c;然后利用文件名&#xff0c;去执行system命令 …

2024年湖北省安全员-B证证模拟考试题库及湖北省安全员-B证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年湖北省安全员-B证证模拟考试题库及湖北省安全员-B证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;湖北省安全员-B证证模拟考试题库是根据湖北省安全员-B证最新版教材&#xff0c;湖北省安全员-B证大…

有多少小于当前数字的数字

链接&#xff1a;https://leetcode.cn/problems/how-many-numbers-are-smaller-than-the-current-number/description/ 思路&#xff1a; 最简单的思路来说&#xff0c;就是双重for循环进行遍历&#xff0c;来判断个数&#xff0c; 优化思路&#xff0c;其中一个思路就是递推 …

vue3修改eldialog弹窗css不生效

问题&#xff1a;子组件中的eldialog没有父标签 直接使用如下是不生效的 .el-dialog{ top: 10%; } 解决&#xff1a; 加一个父标签 使用deep深度查询 .dialogClass :deep(.el-dialog) { top: 10%; } 就可以修改了

传输层协议——TCP协议

TCP协议又叫传输控制协议&#xff0c;TCP/IP协议是计算机通信网络中目前使用最多的协议&#xff0c;同时也融入了生活的方方面面&#xff0c;不管是浏览网页使用的http/https协议、物联网设备使用的MQTT/MQTTS协议与下载文件使用的ftp协议、工业以太网中使用的Modbus TCP协议等…

Elasticsearch 搜索引擎实现对文档内容进行快速检索(保姆级教程)

本文主要讲解ES如何从提取文档中提取内容&#xff08;word、pdf、txt、excel等文件类型&#xff09;&#xff0c;实现快速检索文档内容实现。 特别说明一下&#xff0c;为什么用7.10.0版本&#xff0c;因为在项目中除了精确匹配的要求&#xff0c;也会有模糊查询&#xff08;关…

k8s二进制部署--多master、负载均衡、高可用

目录 1、环境准备 1.1 服务器配置 1.2 master02 节点部署 2、负载均衡部署 2.1 下载nginx 2.2 修改nginx配置文件 2.3 启动nginx 2.3.1 检查配置文件语法 2.3.2 启动nginx服务&#xff0c;查看已监听6443端口 3. 部署keepalived服务(nginx主机&#xff0c;以nginx01为…

SOP for Oracle 23ai:Python 连接 Oracle 的两种方法

前情回顾 前文介绍了如何使用 python-oracledb 连接 Oracle 23ai 数据库&#xff0c;并演示了如何使用独立连接方式。 其中提到了支持两种连接池&#xff1a; DRCP 和 PRCP。 本文将对这两种连接池做具体演示。 DRCP 和 PRCP 连接池 连接池技术的优点不言而喻&#xff1a; 缩短…

selenium发展史

Selenium Core 2004 年&#xff0c;Thoughtworks 的工程师 Jason Huggins 正在负责一个 Web 应用的测试工作&#xff0c;由于这个项目需要频繁回归&#xff0c;这导致他不得不每天做着重复且低效的工作。为了解决这个困境&#xff0c;Jason 开发了一个运行在 JavaScript 沙箱中…

Python的for循环

for循环 Python中的for循环是一种迭代循环&#xff0c;可以迭代容器中的每一个元素。 for循环结构 示例&#xff1a; users ["汤姆", "艾米", "李华"] for i in users:print(i) 其中i为临时变量&#xff0c;仅在循环中有效&#xff1b;users…

使用可接受gitlab参数的插件配置webhook

jenkins配置 安装Generic Webhook Trigger 配置远程触发令牌 勾选Print post content和Print contributed variables用于打印值 配置gitlab 选择新增webhook 配置webhook http://JENKINS_URL/generic-webhook-trigger/invoke,将JENKINS_URL修改成自己的jenkins地址 先保存…