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控制器默认支持GETPOST两种方式, 也就是你不指定method, 可以接收GETPOST请求

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/createUserURL
/user/**/createUser:匹配/user/createUser, /user/aaa/bbb/createUserURL
/user/createUser??:匹配/user/createUseraa, /user/createUserbbURL

案例
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(接口测试工具)

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

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

相关文章

植物大战僵尸杂交版2024最新手机版下载!功能全面升级,战斗更刺激!

植物大战僵尸杂交版2024——让游戏更加有趣&#xff01; 嘿&#xff0c;各位游戏爱好者们&#xff01;&#x1f31f;今天我要给你们介绍的是一个全新版本的植物大战僵尸——植物大战僵尸杂交版2024。这款游戏不仅保留了原版的经典元素&#xff0c;还增加了许多新的特性和玩法&a…

操作系统 大作业

1、现有成绩文件按“姓名 学校 年级 班级 分数”五列组成&#xff0c;编写Shell脚本&#xff0c;将某目录下所有成绩文件&#xff08;≥3个&#xff09;合并为一个&#xff0c;形成“姓名 班级 分数”三列&#xff0c;并按成绩排序&#xff0c;输出年级排名前十。同时输出60以下…

实现一个渐进优化的 Linux cp 命令

1&#xff0c;第1版 copy 先写个轮廓 selfcp.c &#xff1a; #include <stdio.h>int main() {FILE *source, *destination;char ch;source fopen("H222.txt", "r");if (source NULL) {printf("Error opening source file!\n");retur…

8.华为两台交换机的三种连接方式access 、trunk、undo portswitch

目的&#xff1a;两台三层交换机的三种连接方式 1.access 2.trunk 3.undo portswitch 模拟机不支持此配置&#xff0c;实体机支持 第一种access CE1配置 [~HUAWEI]vlan batch 10 [~HUAWEI]int Vlanif 10 [~HUAWEI-Vlanif10]ip add 10.10.10.1 24 [~HUAWEI]int g1/0/0 [~HUAWE…

Web前端连接Redis:深入探索、实践挑战与未来展望

Web前端连接Redis&#xff1a;深入探索、实践挑战与未来展望 在当今日益复杂且多变的网络环境中&#xff0c;Web前端与后端数据库的交互方式正在经历着前所未有的变革。其中&#xff0c;Redis作为一种高性能、开源的键值存储系统&#xff0c;逐渐成为了前端开发者的新宠。然而…

小马识途营销顾问谈小红书平台运营推广策略

近年来&#xff0c;互联网平台层出不穷&#xff0c;小红书作为大多数年轻女性比较喜欢使用的软件之一&#xff0c;拥有很高的流量&#xff0c;目前已经成为网络推广渠道中商品的一个重要营销阵地。很多的品牌开始利用小红书平台做推广&#xff0c;那么如何运营小红书?是否投放…

卫士通电科网安安全IpSec网关Ukey开发对接

官方公开的开发文档&#xff0c;有几个坑&#xff0c;着重说一下踩坑的记录过程。 1、通过官方的客户端接口模拟程序获取前端参数&#xff1a;随机数和token 2、java程序调用官方sdk&#xff0c;postman请求测试&#xff1a; 3、贴出关键的java集成类&#xff1a; import cn.h…

shell脚本 函数

函数 shell的函数 定义&#xff1a;将命令序列按照格式写在一起。格式指的是函数的固定格式。两种格式。 for i in {} do 命令序列 done if [ ] then 命令序列 fi 作用&#xff1a;方便重复使用。函数库&#xff0c;集中在一起&#xff0c;随时可以传参调用。大的工…

Spring延迟Bean的初始化

在Spring中&#xff0c;ApplicationContext默认会在容器初始化时创建并配置所有定义为单例&#xff08;Singleton&#xff09;的Bean。这有助于在应用程序启动时立即发现任何配置错误或依赖问题。然而&#xff0c;在某些情况下&#xff0c;你可能希望延迟Bean的初始化&#xff…

pause 容器

概述 通过容器资源隔离的原理中知道容器之间是通过 NameSpace 和 cgroups 隔离开的&#xff0c;但是 pod 中的网络和存储却是共享的. kubernetes 为了解决网络共享问题&#xff0c;引入了 pause 容器&#xff0c;又叫Infra容器&#xff0c;在kubelet的配置中有KUBELET_POD_IN…

Vim和Nano简介

**Vim**&#xff1a; - Vim 是一个文本编辑器&#xff0c;它是 Vi 编辑器的一个改进版本&#xff0c;Vi 编辑器最初由 Bill Joy 在1976年为 BSD Unix 开发。 - Vim 由 Bram Moolenaar 开发&#xff0c;其第一个版本在1991年发布。Vim 的设计理念是“持继改进”&#xff0c;它的…

SpringMVC系列五: SpringMVC映射请求数据

SpringMVC映射请求数据 &#x1f49e;获取参数值说明应用实例 &#x1f49e;获取http请求消息头&#x1f49e;获取JavaBean对象使用场景说明应用实例注意事项和细节 &#x1f49e;获取servlet api说明应用实例注意事项和细节 上一讲, 我们学习的是SpringMVC系列四: Rest-优雅的…

VUE 项目用 Docker+Nginx进行打包部署

一、Docker Docker 是一个容器化平台&#xff0c;允许你将应用程序及其依赖项打包在容器中。使用 Docker&#xff0c;你可以创建一个包含 Vue.js 应用程序的容器镜像&#xff0c;并在任何支持 Docker 的环境中运行该镜像。 二、Nginx Nginx 是一个高性能的 HTTP 服务器和反向…

Eureka 学习笔记(1)

一 、contextInitialized() eureka-core里面&#xff0c;监听器的执行初始化的方法&#xff0c;是contextInitialized()方法&#xff0c;这个方法就是整个eureka-server启动初始化的一个入口。 Overridepublic void contextInitialized(ServletContextEvent event) {try {init…

React useRef 组件内及组件传参使用

保存变量&#xff0c; 改变不引起渲染 import { useRef} from react; const dataRef useRef(null) ... dataRef.current setTimeout(()>console.log(...),1000)绑定dom const inputRef useRef(null) <input ref {inputRef} />绑定dom列表 - ref 回调 const ite…

无声短视频:成都柏煜文化传媒有限公司

无声短视频&#xff1a;视觉艺术的独特魅力 在数字化时代的浪潮中&#xff0c;短视频以其简短、直观、易于传播的特点迅速崛起&#xff0c;成为当下最热门的媒体形式之一。而在众多的短视频类型中&#xff0c;无声短视频以其独特的视觉表达方式&#xff0c;逐渐吸引了越来越多…

mysql竖表变横表不含聚合

文章目录 前言一、vertical_table二、转换1.要将其转换为横表形式&#xff0c;例如&#xff1a;2.sql 总结 前言 在MySQL中将竖表转换为横表&#xff08;也称为行转列操作&#xff09;&#xff0c;不涉及聚合函数&#xff0c;通常可以通过使用条件判断和自连接来实现。假设有一…

Intelij IDEA中Mapper.xml无法构建到资源目录的问题

问题场景&#xff1a; 在尝试把原本在eclipse上的Java Web项目转移至Intelij idea上时&#xff0c;在配置文件均与eclipse一致的情况下出现了如下报错&#xff1a; org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.umbrella.crm_core.…

leetcode118 杨辉三角

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1 输出: [[1]] public List…

信创服务器操作系统的适配迁移分析

浅谈信创服务器操作系统的适配迁移 01 服务器操作系统迁移适配流程复杂 随着CentOS停服临近和红帽RHEL源码权限受限&#xff0c;服务器操作系统安全漏洞风险加剧。国内众多企业面临CentOS、REHL等系统升级替换的挑战。同时&#xff0c;出于安全、功能升级和合规需求&#xff0…