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…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...