3、SpringMVC之RequestMapping注解
3.1、环境搭建
创建名为spring_mvc_demo的新module,过程参考2.1节
3.1.1、创建SpringMVC的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--在指定的包中,扫描控制层组件-->
<context:component-scan base-package="org.rain.controller"></context:component-scan>
<!-- 配置Thymeleaf视图解析器 -->
<bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
<property name="order" value="1"/>
<property name="characterEncoding" value="UTF-8"/>
<property name="templateEngine">
<bean class="org.thymeleaf.spring5.SpringTemplateEngine">
<property name="templateResolver">
<bean
class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
<!-- 视图前缀 -->
<property name="prefix" value="/WEB-INF/templates/"/>
<!-- 视图后缀 -->
<property name="suffix" value=".html"/>
<property name="templateMode" value="HTML5"/>
<property name="characterEncoding" value="UTF-8" />
</bean>
</property>
</bean>
</property>
</bean>
</beans>
3.1.2、配置web.xml

<!--配置SpringMVC的前端控制器DispatcherServlet,对浏览器发送的请求统一进行处理-->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--通过初始化参数指定SpringMVC配置文件的位置和名称-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--将DispatcherServlet的初始化时间提前到服务器启动时-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
3.1.3、创建请求控制器

package org.rain.controller;
import org.springframework.stereotype.Controller;
/**
* @author liaojy
* @date 2023/9/21 - 8:47
*/
@Controller
public class TestRequestMappingController {
}

package org.rain.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author liaojy
* @date 2023/9/21 - 8:49
*/
@Controller
public class PortalController {
@RequestMapping("/")
public String portal(){
return "index";
}
}
3.1.4、创建静态资源目录及页面

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>index.html</h1>
</body>
</html>

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>成功</title>
</head>
<body>
<h1>success.html</h1>
</body>
</html>
3.1.5、配置tomcat


细节请参考2.6节
3.2、注解的功能
从注解名称上可以看出,@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系;
SpringMVC 的前端控制器(DispatcherServlet)接收到请求后,就会在映射关系中找到对应的控制器方法来处理这个请求;
3.3、注解的位置
3.3.1、源码定义

从源码可知,@RequestMapping注解既可以标识在类上,也可以标识在方法上
3.3.2、控制器示例
@RequestMapping标识在类上:设置映射请求的基础信息
@RequestMapping标识在方法上:设置映射请求的具体信息

@Controller
@RequestMapping("/test")
public class TestRequestMappingController {
// 此时控制器方法所匹配的请求的请求路径为:/test/hello
@RequestMapping("/hello")
public String hello(){
return "success";
}
}
3.3.3、请求示例

注意html要引入thymeleaf的约束:xmlns:th="http://www.thymeleaf.org"
<a th:href="@{/hello}">测试/hello请求</a>
<a th:href="@{/test/hello}">测试/test/hello请求</a>
3.3.4、测试效果




3.3.5、双重位置的作用
可以根据业务需要划分模块,在请求路径中就可以体现出请求的是哪个模块的资源
3.4、注解的value属性
@RequestMapping注解的value属性必须设置,其作用是根据请求路径来匹配请求
3.4.1、源码定义

value属性的别名是path,所以用path属性代替也可以;
value属性是字符串数组类型,所以可以设置多个值;
3.4.2、匹配多个请求的控制器示例

普通的servlet,也可以在web.xml的<servlet-mapping>标签中,设置多个<url-pattern>子标签,从而实现同样的效果
@RequestMapping({"/hello","/hi"})

<a th:href="@{/test/hi}">测试/test/hi请求</a>
3.4.3、测试效果




3.5、注解的method属性
@RequestMapping注解的method属性的作用是,根据请求方式(get或post)匹配请求
若当前请求的请求地址满足value属性,但是请求方式不满足method属性,
则浏览器报错 405:Request method '请求方式' not supported
3.5.1、源码定义

method属性是RequestMethod数组类型,所以可以设置多个值;

RequestMethod是枚举类型,有固定的可选值
3.5.2、控制器示例

@RequestMapping(value = {"/hello","/hi"},method = {RequestMethod.GET,RequestMethod.POST})
3.5.3、请求示例

<!--除了form表单和Ajax设置为post请求之外,其他诸如超链接、直接浏览器地址栏访问等均为get请求-->
<a th:href="@{/test/hello}">测试/test/hello请求</a>
<!--表单默认为get请求,使用post请求须显式设置-->
<form th:action="@{/test/hello}" method="post">
<input type="submit" value="测试@RequestMapping注解的method属性的post请求">
</form>
3.5.4、测试效果


++++++++++++++++++++++++++分割线++++++++++++++++++++++++++


3.5.5、结合请求方式的派生注解
对于处理指定请求方式的控制器方法,SpringMVC中提供了@RequestMapping的派生注解
处理get请求的派生注解-->@GetMapping
处理post请求的派生注解-->@PostMapping
处理put请求的派生注解-->@PutMapping
处理delete请求的派生注解-->@DeleteMapping

// 只处理post请求方式的请求
@PostMapping("/hello")


++++++++++++++++++++++++++分割线++++++++++++++++++++++++++


3.6、注解的params属性(了解)
@RequestMapping注解的params属性的作用是,根据请求参数匹配请求
浏览器发送的请求的请求参数,必须满足params属性的设置(如果有的话)
否则报错:HTTP状态 400 - 错误的请求
3.6.1、源码定义

params属性是字符串数组类型,所以可以设置多个值;
注意:请求必须满足params属性所有值的要求。
3.6.2、params属性的四种表达式
"param":表示所匹配的请求的请求参数中,必须携带param参数
"!param":表示所匹配的请求的请求参数中,必须不能携带param参数
"param=value":表示所匹配的请求的请求参数中,必须携带param参数,且值必须为value
"param!=value":表示所匹配的请求的请求参数中,可以不携带param参数;若携带param参数,其值必须不能为value
3.6.3、控制器示例

@RequestMapping(
value = {"/hello","/hi"},
method = {RequestMethod.GET,RequestMethod.POST},
params = {"username","!password","age=18","gender!=女"}
)
3.6.4、请求示例

<!--使用传统的?分隔符传参,虽然是有效果的,但thymeleaf语法会有错误提示-->
<a th:href="@{/test/hello?username=admin&age=18}">测试@RequestMapping注解的params属性(传统?传参)</a>
<br><br>
<!--thymeleaf语法的标准传参方式,注意字符串要用单引号-->
<a th:href="@{/test/hello(username='admin',age=18)}">测试@RequestMapping注解的params属性(thymeleaf语法传参)</a>
3.6.5、测试效果


++++++++++++++++++++++++++分割线++++++++++++++++++++++++++


++++++++++++++++++++++++++分割线++++++++++++++++++++++++++


3.7、注解的headers属性(了解)
@RequestMapping注解的headers属性的作用是,根据请求头信息匹配请求
浏览器发送的请求的请求头信息,必须满足headers属性的设置(如果有的话)
否则报错:HTTP状态 404 - 未找到
3.7.1、源码定义

headers属性是字符串数组类型,所以可以设置多个值;
注意:请求必须满足headers属性所有值的要求。
3.7.2、headers属性的四种表达式
"header":表示所匹配的请求,必须携带header请求头信息
"!header":表示所匹配的请求,必须不能携带header请求头信息
"header=value":表示所匹配的请求,必须携带header请求头信息,且值必须为value
"header!=value":表示所匹配的请求,可以不携带header请求头信息;若携带header请求头信息,其值必须不能为value
3.7.3、控制器示例

注意:请求头信息的键不区分大小写,但其值区分大小写
@RequestMapping(
value = {"/hello","/hi"},
method = {RequestMethod.GET,RequestMethod.POST},
params = {"username","!password","age=18","gender!=女"},
headers = {"referer"}
)
3.7.4、请求示例


Referer请求头表示请求的来源,本例的请求来源为http://localhost:8080/spring_mvc_demo/

如果是通过浏览器地址栏直接访问,是没有Referer(请求来源)的
3.8、ant风格的路径
3.8.1、通配符
? :表示任意的单个字符(不包括 ? 和 / ,因为它们是分隔符)
* :表示任意个数的任意字符(不包括 ? 和 / )
** :表示任意层数的任意目录(其用法是 /**/xxx 的方式)
3.8.2、? 通配符示例

@RequestMapping("/a?a")
public String testAnt(){
return "success";
}



3.8.3、* 通配符示例

@RequestMapping("/a*a")
public String testAnt(){
return "success";
}



3.8.4、** 通配符示例

@RequestMapping("/**/aa")
public String testAnt(){
return "success";
}


3.9、路径中的占位符(重点)
原始风格的请求(?分隔符前面是路径,后面是参数):/deleteUser?id=1
RESTful 风格的请求(参数是路径的一部分):/user/delete/1
SpringMVC 路径中的占位符常用于RESTful风格中;
在@RequestMapping注解的value属性中,通过占位符{xxx}表示路径中传输的数据;
再通过@PathVariable注解,将占位符所表示的数据赋值给控制器方法的形参。
3.9.1、控制器示例

对于占位符的数据类型,@PathVariable注解会自动转换赋值给控制器方法的形参
@RequestMapping("/rest/{restfulId}/{restfulUsername}")
public String testRestful(@PathVariable("restfulId") Integer id,@PathVariable("restfulUsername") String username){
System.out.println("id:"+id);
System.out.println("username:"+username);
return "success";
}
3.9.2、请求示例

<a th:href="@{/test/rest/12345/zhangsan}">测试@RequestMapping注解的value属性中的占位符</a>
3.9.3、测试效果



3、SpringMVC之RequestMapping注解的更多相关文章
- 【SpringMVC】@RequestMapping注解
@RequestMapping注解的源码 @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNT ...
- springmvc 中RequestMapping注解的使用
1.RequestMapping注解既可以修饰方法,又可以修饰类型,类型指定的url相对于web跟路径,而方法修饰的url相对于类url: 2.RequestMapping的几个属性: value:用 ...
- SpringMVC(三) RequestMapping修饰类
SpringMVC使用@RequestMapping 注解为控制器指定可以处理哪些URL请求. 可以用于类定义以及方法定义: 类定义:提供初步的请求映射信息.相对于WEB应用的根目录. 方法处:提供进 ...
- @RequestMapping注解的属性,将请求约束精细化
package com.atguigu.controller; import org.springframework.stereotype.Controller; import org.springf ...
- SpringMVC的常用注解、参数绑定、转发与重定向
SpringMvc的常用注解 @RequestMapping() SpringMvc通过@RequestMapping注解将URL请求与业务的方法进行映射,在控制器的类定义处定义方法处都可以添加@Re ...
- SpringMVC源码解读 - RequestMapping注解实现解读 - RequestMappingInfo
使用@RequestMapping注解时,配置的信息最后都设置到了RequestMappingInfo中. RequestMappingInfo封装了PatternsRequestCondition, ...
- SpringMVC源码解读 - RequestMapping注解实现解读 - RequestCondition体系
一般我们开发时,使用最多的还是@RequestMapping注解方式. @RequestMapping(value = "/", param = "role=guest& ...
- (转)SpringMVC学习(六)——SpringMVC高级参数绑定与@RequestMapping注解
http://blog.csdn.net/yerenyuan_pku/article/details/72511749 高级参数绑定 现在进入SpringMVC高级参数绑定的学习,本文所有案例代码的编 ...
- SpringMVC详解一、@RequestMapping注解与Controller接收参数
SpringMVC详解一.@RequestMapping注解与Controller接收参数 https://blog.csdn.net/mxcsdn/article/details/80719258 ...
- 【SpringMVC】---RequestMapping、Ant 路径、PathVariable 注解、HiddenHttpMethodFilter 过滤器、用 POJO 作为参数
一.web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=&qu ...
随机推荐
- 如何在Spring Boot中配置MySQL数据库连接数
1.如何在Spring Boot中配置MySQL数据库的连接数 1.1主要配置 在Spring Boot中配置MySQL数据库连接数通常涉及到两个主要的配置: (1)数据源配置:这通常是在applic ...
- RabbbitMQ RabbitListener使用IP动态队列 Attribute value must be constant
在RabbitMQ消息队列使用 @RabbitListener 接收消息,队列名称使用常量命名,但是如果使用动态队列名称,比如根据系统 ip 命名队列名称. 获取服务器 IP /** * 获取服务器i ...
- 瑞数456vmp逆向分析
声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 目标网站 aHR0cHM6 ...
- 获取URL中查询参数 URL中动态参数
通过 req.query 对象,可以访问到客户端通过查询字符串的形式发送到服务器的参数 app.get('/',(req,res)=>{ console.log(req.query) }) .U ...
- 直播预告|把握转型浪潮下的机会,甄知科技教你保姆级IT服务管理
近年来,5G.云计算.大数据.物联网.区块链.人工智能等新兴技术不断在企业中协同发展应用,推动着企业的数字化程度逐步加深.自新冠疫情发生以来,企业的远程服务.服务自助等服务需求激增,企业数字化转型需求 ...
- Wireshark抓包分析理解DHCP协议及工作流程
一.DHCP简介 DHCP(Dynamic Host Configuration Protocol)动态主机配置协议,前身是BOOTP协议.在大型局域网中,需要给很多主机配置地址信息,如果采用传统 ...
- hive第三课:Hive函数学习
Hive函数学习 目录 Hive函数学习 SQL练习 Hive 常用函数 关系运算 数值计算 条件函数(主要使用场景是数据清洗的过程中使用,有些构建表的过程也是需要的) 日期函数重点!!! 字符串函数 ...
- 韦东山freeRTOS系列教程之【第五章】队列(queue)
目录 系列教程总目录 概述 5.1 队列的特性 5.1.1 常规操作 5.1.2 传输数据的两种方法 5.1.3 队列的阻塞访问 5.2 队列函数 5.2.1 创建 5.2.2 复位 5.2.3 删除 ...
- Centos7安装MySQL详细步骤(配置开机自启)
MySQL 检查系统是否安装过mysql //检查系统中有无安装过mysql rpm -qa|grep mysql //查询所有mysql 对应的文件夹,全部删除 whereis mysql find ...
- C#winform软件移植上linux的秘密,用GTK开发System.Windows.Forms
国产系统大势所趋,如果你公司的winform界面软件需要在linux上运行,如果软件是用C#开发的,现在我有一个好的快速解决方案. 世界第一的微软的Microsoft Visual Studio,确实 ...