SpringMVC系列二: 请求方式介绍
@RequestMapping
- 💞基本使用
- 💞@RequestMapping注解其它使用方式
- 可以修饰类和方法
- 可以指定请求方式
- 可以指定params和headers支持简单表达式
- 支持Ant 风格资源地址
- 配合@PathVariable 映射 URL 绑定的占位符
- 注意事项和使用细节
- 课后作业
上一讲, 我们学习的是SpringMVC系列一: 初识SpringMVC
现在打开springmvc项目
💞基本使用
●RequestMapping
注解可以指定控制器/处理器的某个方法的请求的url.
💞@RequestMapping注解其它使用方式
可以修饰类和方法
1.说明: @RequestMapping
注解可以修饰方法, 还可以修饰类. 当同时修饰类和方法时, 请求的url 就是组合 /类请求值/方法请求值
案例
1.com.zzw.web
包下 新建UserHandler
@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器, 会注入到容器
public class UserHandler {/*** 1.method=RequestMethod.POST: 表示请求buy目标方法必须是 post* 2.RequestMethod 四个常用选项 POST, GET, PUT, DELETE[后面会详解]* 3.SpringMVC 控制器默认支持GET和POST两种方式** buy()方法请求的url: http://ip:port/工程路径/user/buy* @return*/@RequestMapping(value = "/buy", method = RequestMethod.POST)public String buy() {System.out.println("购买.");return "success";}
}
2.web路径/WEB-INF/pages目录
新建success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>操作成功</title>
</head>
<body>
<h1>恭喜, 操作成功~</h1>
</body>
</html>
3.web路径
下 新建request.jsp
, 测试
<body>
<%--解读
1. action="user/buy" 对应 url http://localhost:8080/工程路径/user/buy
--%>
<form action="user/buy" method="post">购买人: <input type="text" name="username"/><br/>购买量: <input type="password" name="nums"/><br/><input type="submit" value="购买">
</form>
</body>
4.访问成功
可以指定请求方式
1.说明: @RequestMapping
可以指定请求方式(post/get/put/delete..
), 请求的方式要和指定的一样, 否则报错.
2.SpringMVC
控制器默认支持GET
和POST
两种方式, 也就是你不指定method
, 可以接收GET
和POST
请求
3.应用案例
4.当你明确指定了method
, 则需要按指定方式请求, 否则会报错.
可以指定params和headers支持简单表达式
1.param1:
表示请求必须包含名为param1
的请求参数. 比如 params = "bookId"
2.!param1:
表示请求不能包含名为param1
的请求参数. 比如 params = "!bookId"
3.param1 = value1:
表示请求包含名为param1
的请求参数, 且其值必须为value1
. 比如 params = "bookId=100"
4.param1 != value1:
表示请求包含名为param1
的请求参数, 但其值不能为value1
. 比如 params = "bookId!=100"
5.{"param1=value1", "param2"}:
请求必须包含名为param1
, param2
的两个请求参数, 且param1
参数的值必须为value1
. 比如params = {"bookId=100", "price"}
案例
1.修改UserHandler.java
增加方法search
@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器, 会注入到容器
public class UserHandler {/*** 解读* 1. params="bookId" 表示请求该目标方法时, 必须给一个bookId参数, 值没有限定* 2. search(String bookId) 表示请求目标方法时, 携带的bookId=100, 就会将请求携带的 bookId* 对应的值, 赋给 String bookId* @param bookId* @return*/@RequestMapping(value = "/find", params = "bookId", method = RequestMethod.GET)public String search(String bookId) {System.out.println("查询书籍 bookId=" + bookId);return "success";}
}
2.修改request.jsp
<body>
<h1>演示params的使用</h1>
<a href="user/find?bookId=100">查询书籍</a>
</body>
3.操作成功
如果bookId
改为bookIdx
, 报错
细节1:
如果需要有bookId
参数, 并且值为100
. 否则报错.
@RequestMapping(value = "/find", params = "bookId=100", method = RequestMethod.GET)
修改request.jsp
<body>
<h1>演示params的使用</h1>
<a href="user/find?bookId=200">查询书籍</a>
</body>
报错
细节2:
需要有bookId参数, 并且值不为100. 否则报错.
@RequestMapping(value = "/find", params = "bookId!=100", method = RequestMethod.GET)
修改request.jsp
<body>
<h1>演示params的使用</h1>
<a href="user/find?bookId=100">查询书籍</a>
</body>
报错
支持Ant 风格资源地址
1.?: 匹配文件名中的一个字符
2.*: 匹配文件名中的任意字符
3.**: 匹配多层路径
4.举例
/user/*/createUser:
匹配/user/aaa/createUser, /user/bbb/createUser
等 URL
/user/**/createUser:
匹配/user/createUser, /user/aaa/bbb/createUser
等 URL
/user/createUser??:
匹配/user/createUseraa, /user/createUserbb
等 URL
案例
1.修改UserHandler.java
增加方法im
@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器, 会注入到容器
public class UserHandler {/*** 要求: 可以配置 /user/message/aa, /user/message/aa/bb/cc* @RequestMapping(value="/message/**") 表示可以匹配多层路径*/@RequestMapping(value = "/message/**")public String im() {System.out.println("发送消息");return "success";}
}
2.修改request.jsp
<body>
<hr><h1>演示Ant风格的请求资源方式</h1>
<a href="user/message/aa">发送消息1</a>
<a href="user/message/aa/bb/cc">发送消息2</a>
</body>
3.测试成功…
配合@PathVariable 映射 URL 绑定的占位符
1.@RequestMapping
可以配合@PathVariable
映射URL
绑定的占位符
2.这样就不需要在url
地址上带参数名了, 更加的简洁明了.
案例
1.修改UserHandler.java
增加方法register
@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器, 会注入到容器
public class UserHandler {/*** 前端页面: <a href="user/reg/Kristina/300">占位符的演示</a>* (value="/reg/{username}/{userId}"): 表示Kristina=>{username} 300=>{userId}** @return*/@RequestMapping(value = "/reg/{username}/{userId}")public String register(@PathVariable("username") String name,@PathVariable("userId") int id) {System.out.println("接收到参数--" + "username=" + name + "--" + "userId=" + id);return "success";}
}
2.修改request.jsp
<body>
<hr/><h1>占位符的演示</h1>
<a href="user/reg/Kristina/300">占位符的演示</a>
</body>
3.测试成功…
注意事项和使用细节
1.映射的URL
, 不能重复
@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器, 会注入到容器
public class UserHandler {@RequestMapping(value = "/hi")public String hi() {System.out.println("hi");return "success";}@RequestMapping(value = "/hi")public String hi2() {System.out.println("hi");return "success";}
}
启动或重新发布时, 会报错. to { [/user/hi]}: There is already 'userHandler' bean method
2.各种简写的方式
@RequestMapping(value=“/buy”,method=RequestMethod.POST) 等价 @PostMapping(value=“/buy”)
简写方式一览: @GetMapping @PostMapping @PutMapping @DeleteMapping
案例
@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器, 会注入到容器
public class UserHandler {/*** 5.@PostMapping(value="/buy") 等价 @Request(value="/buy", method=RequestMapping.POST)* @return*///@RequestMapping(value = "/buy", method = RequestMethod.POST)@PostMapping(value = "/buy")public String buy() {System.out.println("购买.");return "success";}
}
测试request.jsp
<body>
<form action="user/buy" method="get">购买人: <input type="text" name="username"/><br/>购买量: <input type="password" name="nums"/><br/><input type="submit" value="购买">
</form>
</body>
报错
3.如果我们确定表单或者超链接会提交某个字段数据比如email
, 要求提交的参数名和目标方法的参数名保持一致.
案例
1.修改UserHandler.java
增加方法hello3
@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器, 会注入到容器
public class UserHandler {/*** hello3(String email) 表示如果我们的请求参数有 email=xx, 就会将传递的值, 赋给String email* , 要求名称保持一致, 如果不一致, 那么接收不到数据, 而是null* @param email* @return*/@RequestMapping(value = "/hello3")public String hello3(String email) {System.out.println("email=" + email);return "success";}
}
2.测试 浏览器地址栏 输入http://localhost:8080/springmvc/user/hello3?email=978964140@qq.com
, 一定要注意提交参数名和后台方法的形参名保持一致, 否则后端接收不到参数
3.如果输入一个错误的参数名, 那么后端接收不到数据
课后作业
1.熟悉SpringMVC
的执行流程图
2.熟悉@RequestMapping
注解的使用方式
3.编写一个表单, 以Post
的方式提交Computer
信息, 后端编写ComputerHandler
, 可以接收到信息.
代码实现
1.修改request.jsp
<body>
<h1>电脑信息</h1>
<form action="?" method="post">品牌:<input type="text" name="brand"/><br/>价格:<input type="text" name="price"/><br/>数量:<input type="text" name="nums"/><br/><input type="submit" value="提交">
</form>
</body>
2.com.zzw.web
包下 新建ComputerHandler
@RequestMapping(value = "/computer")
@Controller
public class ComputerHandler {//这里一定要注意, info方法的形参名需要和请求的参数名保持一致@PostMapping(value = "/info", params = {"brand", "price", "nums"})public String info(String brand, String price, String nums) {System.out.println("电脑信息--brand=" + brand+ "--price=" + price + "--nums" + nums);return "success";}
}
3.配置页面访问路径
<form action="computer/info" method="post">
4.测试成功…
下一讲, 我们学习SpringMVC系列三: Postman(接口测试工具)
相关文章:

SpringMVC系列二: 请求方式介绍
RequestMapping 💞基本使用💞RequestMapping注解其它使用方式可以修饰类和方法可以指定请求方式可以指定params和headers支持简单表达式支持Ant 风格资源地址配合PathVariable 映射 URL 绑定的占位符注意事项和使用细节课后作业 上一讲, 我们学习的是Spr…...

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展
今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语…...
C# 关于通讯观察线程(1) -- 开启通讯线程
通讯观察线程是个有意思,又是非常实用的功能。 具体怎么实现呢,我们来看看主要过程的伪代码。对于高手这也许很简单,但是要用好也是需要实践到通讯的流程正确,同时应对好网络故障等。 先在合适的地方启动观察线程: …...

15.树形虚拟列表实现(支持10000+以上的数据)el-tree(1万+数据页面卡死)
1.问题使用el-tree渲染的树形结构,当数据超过一万条以上的时候页面卡死 2.解决方法: 使用vue-easy-tree来实现树形虚拟列表,注意:vue-easy-tree需要设置高度 3.代码如下 <template><div class"ve-tree" st…...

【服务器07】之【GitHub项目管理】及【Unity异步加载场景】
登录GitHub官网 GitHub: Let’s build from here GitHub 注册账号 登录账号 输入一个自定义名字,点击创建存储库就可以了 现在我们下载Fork Fork - a fast and friendly git client for Mac and Windows (git-fork.com) 免费的 下载完成之后点击File下的Clone …...
ansible提权之become_method与become_flags详解
目录 常见become_methodbecome_flagssu 常见选项总结sudo 常见选项总结pbrun 常见选项总结pfexec 常见选项总结doas 常见选项总结示例使用 sudo 的示例:使用 pbrun 的示例:使用 pfexec 的示例:使用 doas 的示例: 配置方式1. 配置文…...
elementui的el-dialog组件与el-tabs同时用导致浏览器卡死的原因解决
在el-dialog弹出框中,如果使用el-tabs,点击弹框的关闭按钮时,会导致弹出框无法关闭,且浏览器卡死。 解决方式(一): 在el-talbs的面板中不放任何内容: <el-tab-pane label"…...

基于图扑 HT for Web 实现拓扑关系图
拓扑结构在计算机网络设计和通信领域中非常重要,因为它描述了网络中的设备(即“点”)如何相互连接(即通过“线”)。这种结构不仅涉及物理布局,即物理拓扑,还可以涉及逻辑或虚拟的连接方式&#…...

linux笔记10--编辑器之神VIM
文章目录 1. 简单介绍① 为什么叫vim② linux常见的编辑器③ 注意事项④ 其它 2. 操作模式的划分① 两种 -- 国际上普通模式(命令操作模式)插入模式 ② 三种 -- 国内普通模式如何进入与退出界面 插入模式如何进入与退出界面 命令模式如何进入与退出界面常见的命令模式 ③ 区别④…...
安全管理中心-集中管控(6点)
记忆内容: 应划分出特定的管理区域,对分布在网络中的安全设备或安全组件进行管控。(三级新增) 应能够建立一条安全的信息传输路径,对网络中的安全设备或安全组件进行管理。(三级新增) 应对网络…...
使用electron打包Vue前端项目的详细流程
使用electron打包Vue前端项目的详细流程 需要更改的东西 路由模式的修改 # 修改前:url不带#mode: history# 修改后:url带#mode: hash全局修改Cookies为localStorage 由于打包成exe或deb这类可执行文件后,本地是没有 Cookies 全局搜索Cooki…...

《计算机英语》 Unit 4 Information Management 信息管理
Section A Information Storage 信息存储 1. The importance of Information信息的重要性 词汇 reside vi属于,驻留 tablet n平板电脑 laptop n笔记本电脑 repository n仓库 claim n索赔 regulatory n法规 contractua…...

如何打包数据库文件
使用 mysqldump 命令: mysqldump -u username -p database_name > output_file.sql username 是数据库的用户名。database_name 是要导出的数据库名称。output_file.sql 是导出的 SQL 文件名,可以自定义。 示例: mysqldump -u root -p…...

iOS抓包指南 正则过滤爬取
解读iOS抓包 抓包 (packet capture)就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作,也用来检查网络安全。抓包也经常被用来进行数据截取等。 什么是正则表达式? 正则表达式(regular expression)是用来描述…...

FLASH仿真EEPROM---基于智芯Z20K11XM
一、介绍 电可擦和可编程只读存储器(EEPROM)可以对字节或字编程和擦除。EEPROM中的数据即使断电也能保持,但Z20K1xx芯片不含EEPROM。然而,闪存可以通过EEPROM仿真软件来模拟EEPROM。Z20K1xx包含两个flash阵列。编程和擦除操作可以在一个数组上进行&#…...

阿里云PAI大模型评测最佳实践
作者:施晨、之用、南茵、求伯、一耘、临在 背景信息 内容简介 在大模型时代,随着模型效果的显著提升,模型评测的重要性日益凸显。科学、高效的模型评测,不仅能帮助开发者有效地衡量和对比不同模型的性能,更能指导他…...

应用图扑 HT for Web 搭建拓扑关系图
拓扑结构在计算机网络设计和通信领域中非常重要,因为它描述了网络中的设备(即“点”)如何相互连接(即通过“线”)。这种结构不仅涉及物理布局,即物理拓扑,还可以涉及逻辑或虚拟的连接方式&#…...
Django Aggregation 使用指南
Django Aggregation 使用指南 在构建Django应用时,我们经常需要对数据库中的数据进行汇总或聚合操作。例如,计算某个字段的平均值、最大值或最小值。这篇文章将详细介绍如何在Django中使用聚合查询,并结合实例进行说明。 聚合查询简介 Dja…...
嵌入式学习——Linux操作系统——文件编程练习
1.使用fread和fwrite方式完成任意普通文件的拷贝功能。 模拟 文件下载 #include <stdio.h>void do_copy(FILE *fp_s,FILE *fp_d) {char buf[100] {0};int ret;while (ret fread(buf,sizeof(char),sizeof(buf),fp_s))fwrite(buf,sizeof(char),ret,fp_d); }//./a.out sr…...

用JavaScript实现了一个简单的图像坐标点标注工具
这段代码实现了一个简单的图像标注工具,允许用户在加载的图像上进行点选标注,并且通过右键确认一个点序列来形成一个多边形。 标注效果如下 实现代码如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"U…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...

宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...