Spring Web MVC————入门(1)

今天开始正式带大家学习Spring部分的内容了,大家尝试去弄个专业版嗷,学习起来爽一点

在idea中下载这个插件就行了

我们之后开始创建Spring项目,

蓝色 部分自己起名,type选Maven,其他的默认就好了,之后next,

勾选完点击next,就创建好了;

看下项目结构,蓝色java包中的就是我们写代码的地方,之间javaSE怎么写现在就怎么写,

resources是写前端代码的地方,或者可以存放静态资源,test中可以测试代码;

这个东东是启动类,跟以往的main函数不同,这个类一但运行就不会停止的,我们是服务器开发,服务器哪有停下来的道理;准备工作完毕,开始无聊的理论;

1,什么是Spring Web MVC

Spring Web MVC是基于servlet API构建的原始框架,servlet是一种实现动态界面技术,反正Spring Web MVC就是一套Web开发框架,我们可以简称为Spring MVC;

1)什么是MVC

model view controller的缩写,是一种软件架构设计模式,分别为模型,视图,控制器,

模型:就是我们的程序,怎么来处理业务逻辑,怎么处理数据

视图:指应用程序专门用来与浏览器交互的部分

控制器:选择处理模型,选择视图

2)什么是Spring MVC

Spring MVC就是实现了MVC模式的Web框架,有同学可能会有疑问,我们创建的不是Spring Boot项目吗,为啥变成MVC项目了,可以这么理解,Spring Boot只是实现SpringMVC的一种方式,Spring Boot可以添加不同的依赖来实现不同的功能,添加MVC就能实现MVC的功能了;

2,学习MVC 

我们学习MVC主要学习通过浏览器和用户交互的程序,主要分三个方面

建立连接:讲用户(浏览器)和java程序连接起来,就是访问一个地址能调用我们的Spring程序

请求:用户访问会携带一些参数,在程序中我们要想办法获取到参数

响应:我们根据获取到的参数,执行业务逻辑,并返回程序运行的结果

1,建立连接

我们这里就要使用到注解了,

我们刚才看到的这个就是启动类的注解,

那么我们如何通过注解建立连接呢,创建一个类,

之后再类的上面写RequestMapping("/hello"),这样就能实现URL路由映射,达到浏览器连接程序的效果;

路由映射的意思就是用户访问URL之后,就会请求到应用程序某个类的某个方法中;

@RequestMapping("Hello")
@RestController
public class HelloController {@RequestMapping("m1")public static String m1(){return "Hello yaoyu";}
}

这个RestController,可以起到序列化数据的作用,把它变成json和xml格式,并且我们创建的这个类可能和Spring内置的重名,我们Spring项目中那么多的类,我们不可能每次启动程序来把所有东西扫描一变来获得我们要的类,所以加上这个控制器,就可以就扫描带有控制器的类,启动项目更快; 

第一个Hello是类路径,第二个m1是方式路径

类路径+方法路径合起来就是我们要的资源路径了;

我们去浏览器来访问程序:

我们输入http://127.0.0.1:8080/Hello/m1

就能看到你好yaoyu了;

我们这里的RequestMapping是啥请求呢,我们之前学过,get,post,put,delete,我们使用html,form表单来请求一下;前端代码我们放到

这个static下面,前端代码:

<form action="http://127.0.0.1:8080/Hello/m1" method="post"><input type="submit" value="yaoyu">

 后端代码:

@RequestMapping("Hello")
@RestController
public class HelloController {@RequestMapping("m1")public static String m1(){return "Hello yaoyu";}
}

启动程序,看效果:

我们点击它,

就跳转到我们的程序了;这里为啥用127.0.0.1:8080,因为是我们同一台电脑上写服务器并且测试,就先用127.0.0.1就行;我们这里使用的post请求,浏览器发送的请求是get,所以这个RequestMapping是支持很多请求的;

但是我们可以指定方法

    @RequestMapping(value = "/m2",method = RequestMethod.GET)public static String m2(){return "我是get请求";}

来用postman访问 

啥都不传的get请求,看看效果:

得到结果了,那么我们使用post请求访问会有问题吗?

不行的,405是客户端出错,我们设定成get,客户端使用post就会发生错误;

都是ok的,除此之外,我们还有专门的postMapping和getMapping来接收请求:
 

    @GetMapping("a1")public static String a1(){return "我是get请求";}@PostMapping("a2")public static String a2(){return "我是post请求";}

2,工具使用

那我们每次都要写前端代码好麻烦呀,我们后端程序员往后不就会更多的前端代码了吗,莫得事,我们有工具,我们可以使用postman,来构建请求;

下载好后打开,点击那个create Collection,之后点击蓝色的Add,自己给自己的请求起名字,

接下来就能使用我们的工具了,

3,传递参数

1,普通传参

就是查询字符串传参;

这个Params,下面以键值对的方式放到URL中

2,form-data

可以提交文件和图片等 

4,form表单

5,raw

这些都是我们之前说的请求正文的内容;对应content-type大家还记得不; 

4,请求传参

接下来我们重点来学习用postman传递参数并且用在后端中接收参数

1,传递单个参数

    @RequestMapping("/r1")public static String r1(String s){return "接收参数为" + s;}

来发请求, 

这里查询字符串中的key就是s一定要和我们资源路径里面方法参数的名字是一样的,不然的话就找不到的;

再来看两个代码:

    @RequestMapping("/r2")public static Integer r2(Integer s){return s;}@RequestMapping("/r3")public static int r3(int s){return s;}

这俩有啥区别呢,一个使用包装类型,一个是基本类型,我们使用基本类型的时候参数是必须传的,因为基本类型不能为null,

传递是成功的,现在我们不传参数:

 不可以因为int a不能为null,我们再试试Integer, 

 可以的,要是类型不匹配会发生400错误;

2,传递多个参数

    @RequestMapping("/r4")public static String r4(String s1,String s2){return "第一个参数" + s1 + ",第二个参数" + s2;}

3,传递对象

先创建一个对象:

public class User {private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
}
    @RequestMapping("/r5")public static String r5(User user) {return user.toString();}

传递对象的时候就对对象内部的元素挨个赋值就行了,对象中有name和age,我们来传递 

 

4,参数绑定

 参数绑定,又叫参数重命名,参数映射,就是前端可能对参数进行加密,可能名字起的非常奇怪啊,那我们还要记一个小纸上吗,显然是不应该的,这里我们就使用参数绑定,对于前段加密复杂的参数我们让他绑定一个易懂的参数名,我们使用RequestParam

    @RequestMapping("/r6")public static String r6(@RequestParam(value = "p",required = false) String s){return "接收的参数为"+ s;}

这里的required说明是不是必须传的,我们默认是必须传递的,我们加一个false就可以不传递;

我们改成true

 我们在改回来:

ok了; 

5,传递数组

    @RequestMapping("/r7")public static String r7(String[] s){return Arrays.toString(s);}

这里可以有两种方式来传递:

 可以用逗号分隔:

还可以

6,传递集合

传递集合的话我们得使用参数绑定,因为默认传的是数组,

    @RequestMapping("/r8")public static String r8(@RequestParam List<Integer> list){return list.toString();}

7,传递json

这里我们要使用RequestBody,可以把传递来的json转变为对象,

    @RequestMapping("/r9")public static String r9(@RequestBody User user){return user.toString();}

来个json的语法:

JSON的语法: 1. 数据在 键值对 (Key/Value) 中 2. 数据由逗号 , 分隔 3. 对象⽤ {} 表⽰ 4. 数组⽤ [] 表⽰ 5. 值可以为对象,也可以为数组,数组中可以包含多个对象 JSON的两种结构 1. 对象:⼤括号 {} 保存的对象是⼀个⽆序的 键值对集合.⼀个对象以左括号 { 开始,右括号 } 结束。每个"键"后跟⼀个冒号 : ,键值对使⽤逗号 , 分隔 2. 数组:中括号 [] 保存的数组是值(value)的有序集合.⼀个数组以左中括号 [ 开始,右中括 号 ] 结束,值之间使⽤逗号 , 分隔; 

8,从URL中获取参数

    @RequestMapping("/r10/{id}/{type}")public static String r10(@PathVariable Integer id,@PathVariable("type") Integer newType){return "获取文章id"+id+",获取文章类型"+newType;}

 PathVariable是路径变量,可能有网站会把参数设置到路径上,我们就要从路径上拿参数,第一个id对应路径上的id第二个我们把type这个参数名绑定为newtype

来看效果:

9,上传文件

使用RequestPart注解:

    @RequestMapping("/r11")public static String r12(@RequestPart("file1") MultipartFile file) throws IOException {System.out.println(file.getOriginalFilename());file.transferTo(new File("C:/cctalk/java代码容易犯错的知识点/"+file.getOriginalFilename()));return "文还上传成功";}

这个file1是我们前端传入的参数我们把它绑定为file,我们要使用MultipartFile file,我们使用transferTo来快速上传文件,这里跟我们之前学的文件操作是一样的,就是进行了封装,更好用了,

    @RequestMapping("/r11")public static String r12(@RequestPart("file1") MultipartFile file) throws IOException {System.out.println(file.getOriginalFilename());file.transferTo(new File("C:/cctalk/java代码容易犯错的知识点/"+file.getOriginalFilename()));return "文还上传成功";}

 

 

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

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

相关文章

Vue3 中用 canvas 封装抽奖转盘组件:设定中奖概率及奖项图标和名称

在 Web 应用开发中&#xff0c;抽奖功能是提升用户参与度的常用手段。使用 Vue3 结合 canvas 技术&#xff0c;我们可以轻松实现一个高度自定义的抽奖转盘组件&#xff0c;不仅能设定中奖概率&#xff0c;还能灵活配置奖项图标和名称。本文将详细介绍该组件的实现原理、步骤&am…

Linux 硬盘和光驱系统管理

一、硬盘与目录的容量 [rootwww ~]# df [-ahikHTm] [目录或档名] 选项与参数&#xff1a; -a &#xff1a;列出所有的档案系统&#xff0c;包括系统特有的 /proc 等档案系统&#xff1b; -k &#xff1a;以 KBytes 的容量显示各档案系统&#xff1b; -m &#xff1a;以 MByt…

2.Spring Boot中集成Guava Cache或者Caffeine

一、在Spring Boot(1.x版本)中集成Guava Cache 注意&#xff1a; Spring Boot 2.x用户&#xff1a;优先使用Caffeine&#xff0c;性能更优且维护活跃。 1. 添加依赖 在pom.xml中添加Guava依赖&#xff1a; <dependency><groupId>com.google.guava</groupId&…

黑马点评day02(缓存)

2、商户查询缓存 2.1 什么是缓存? 前言:什么是缓存? 就像自行车,越野车的避震器 举个例子:越野车,山地自行车,都拥有"避震器",防止车体加速后因惯性,在酷似"U"字母的地形上飞跃,硬着陆导致的损害,像个弹簧一样; 同样,实际开发中,系统也需要"避震…

头歌禁止复制怎么解除(简单版)

被头歌数据库作业禁止复制整神之后&#xff0c;主啵尝试网上各种解除方法&#xff0c;最后发现一个最简单且最快速的解除方法。 在浏览器中搜索万能复制插件 下载完成之后就可以随便复制粘贴啦 超简单 下载只需几秒

【无基础】小白解决Docker pull时报错:https://registry-1.docker.io/v2/

Docker Compose 启动失败问题解决方案 错误描述 执行 docker compose up -d 时出现以下错误&#xff1a; [] Running 9/9✘ api Error context canceled …

【数据结构】二叉树、堆

文章目录 二叉树的概念及结构定义特殊的二叉树核心性质存储方式 二叉树的链式存储前序遍历中序遍历后序遍历层序遍历 二叉树的顺序存储父子关系的推导堆&#xff08;heap&#xff09;堆的概念向上调整算法和向下调整算法向上调整算法向下调整算法 堆的创建堆的插入堆的删除 堆的…

Vue3响应式原理那些事

文章目录 1 响应式基础:Proxy 与 Reflect1.1 Proxy 代理拦截1.2 Reflect 确保 `this` 指向正确1.2.1 修正 `this` 指向问题1.2.2 统一的操作返回值1.3 与 Vue2 的对比2 依赖收集与触发机制2.1 全局依赖存储结构:WeakMap → Map → Set2.2 依赖收集触发时机2.3 依赖收集核心实…

精选10个好用的WordPress免费主题

10个好用的WordPress免费主题 1. Astra Astra 是全球最受欢迎的WordPress免费主题。它功能丰富&#xff0c;易于使用&#xff0c;SEO友好&#xff0c;是第一个安装量突破100万的非默认主题&#xff0c;并获得了5000多个五星好评。 它完美集成了Elementor、Beaver&#xff0c;…

【SaaS多租架构】数据隔离与性能平衡

SaaS多租户架构:数据隔离与性能平衡 一、技术背景及发展二、技术特点:数据隔离与性能优化的双核心三、技术细节:实现路径与关键技术四、实际案例分析五、未来发展趋势结语一、技术背景及发展 多租户架构是云计算与SaaS(软件即服务)模式的核心技术,其核心目标是通过共享基…

部署GM DC Monitor 一体化监控预警平台

1&#xff09;首先在官网下载镜像文件 广目&#xff08;北京&#xff09;软件有限公司广目&#xff08;北京&#xff09;软件有限公司https://www.gm-monitor.com/col.jsp?id1142&#xff09;其次进行部署安装&#xff0c;教程如下&#xff1a; 1. 基础环境要求 1) 系统&…

Webug4.0靶场通关笔记15- 第19关文件上传(畸形文件)

目录 第19关 文件上传(畸形文件) 1.打开靶场 2.源码分析 &#xff08;1&#xff09;客户端源码 &#xff08;2&#xff09;服务器源码 3.渗透实战 &#xff08;1&#xff09;构造脚本 &#xff08;2&#xff09;双写绕过 &#xff08;3&#xff09;访问脚本 本文通过《…

架构思维:构建高并发读服务_热点数据查询的架构设计与性能调优

文章目录 一、引言二、热点查询定义与场景三、主从复制——垂直扩容四、应用内前置缓存4.1 容量上限与淘汰策略4.2 延迟刷新&#xff1a;定期 vs. 实时4.3 逃逸流量控制4.4 热点发现&#xff1a;被动 vs. 主动 五、降级与限流兜底六、前端&#xff0f;接入层其他应对七、模拟压…

宝塔面板运行docker的jenkins

1.在宝塔面板装docker&#xff0c;以及jenkins 2.ip:端口访问jenkins 3.获取密钥&#xff08;点击日志&#xff09; 4.配置容器内的jdk和maven环境&#xff08;直接把jdk和maven文件夹放到jenkins容器映射的data文件下&#xff09; 点击容器-->管理-->数据存储卷--.把相…

C语言 ——— 函数

目录 函数是什么 库函数 学习使用 strcpy 库函数 自定义函数 写一个函数能找出两个整数中的最大值 写一个函数交换两个整型变量的内容 牛刀小试 写一个函数判断一个整数是否是素数 写一个函数判断某一年是否是闰年 写一个函数&#xff0c;实现一个整型有序数组的二分…

笔记本电脑升级计划(2017———2025)

ThinkPad T470 (2017) vs ThinkBook 16 (2025) 完整性能对比报告 一、核心硬件性能对比 1. CPU性能对比&#xff08;i5-7200U vs Ultra9-285H&#xff09; 参数i5-7200U (2017)Ultra9-285H (2025)提升百分比核心架构2核4线程 (Skylake)16核16线程 (6P8E2LPE)700%核心数制程工…

具身系列——PPO算法实现CartPole游戏(强化学习)

完整代码参考&#xff1a; https://gitee.com/chencib/ailib/blob/master/rl/ppo_cartpole.py 执行结果&#xff1a; 部分训练得分&#xff1a; (sd) D:\Dev\traditional_nn\feiai\test\rl>python ppo_cartpole_v2_succeed.py Ep: 0 | Reward: 23.0 | Running: 2…

Python项目源码60:电影院选票系统1.0(tkinter)

1.功能特点&#xff1a;通常选票系统应该允许用户选择电影、场次、座位&#xff0c;然后显示总价和生成票据。好的&#xff0c;我得先规划一下界面布局。 首先&#xff0c;应该有一个电影选择的列表&#xff0c;可能用下拉菜单Combobox来实现。然后场次时间&#xff0c;可能用…

【全队项目】智能学术海报生成系统PosterGenius--图片布局生成模型LayoutPrompt(2)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;大模型实战训练营_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前…

Linux的时间同步服务器(附加详细实验案例)

一、计时方式的发展 1.古代计时方式​ 公元前约 2000 年&#xff1a;古埃及人利用光线留下的影子计时&#xff0c;他们修建高耸的大型方尖碑&#xff0c;通过追踪方尖碑影子的移动判断时间&#xff0c;这是早期利用自然现象计时的典型方式 。​商朝时期&#xff1a;人们开发并…