8.springmvc中的URL请求路径——获取占位符数据@PathVariable、@RequestMapping路径问题

本文深入探讨Spring MVC中各种URL映射方式,包括普通URL路径映射、URI模板变量风格映射、Ant风格URL映射及正则表达式风格映射。详细解析不同映射方式的特点与使用场景,帮助开发者掌握更灵活的路由配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>Insert title here</title>
	</head>
	<body>
		<h1>test</h1>
		<h1>${name }</h1>
	</body>
</html>

1.普通URL路径映射

理论:

1.注解中只出现一个参数且参数名为value的话,可以将参数名去掉
如:
	@RequestMapping("/test1")
	实际上是省略了参数名
	@RequestMapping(value="/test1")
2.当有多个URL路径可以映射到同一个处理器的功能处理方法
如:
	@RequestMapping(value= {"test1","myTest1","youTest1"})
	也可以将参数名省略掉
	@RequestMapping({"test1","myTest1","youTest1"})

代码:(4选1)

@RequestMapping("/url")
@Controller
public class RequestUrlController {
	/*@RequestMapping({"test1","myTest1","youTest1"})  //集合形式,也可以省略value
	@RequestMapping(value= {"test1","myTest1","youTest1"})  //集合形式
	@RequestMapping(value= "test1")*/
	
	@RequestMapping("/test1") //通常情况下单个的路径映射是省略了value
	public String test1() {
		System.out.println("RequestUrlController test1()......");
		return "test";	//跳转到test.jsp
	}
}

2.URI模板变量风格模式映射{xxx}

理论:

@RequestMapping(value="/users/{name}")
	{XXX}一个占位符, 浏览器中请求的URL可以是"/users/tom"或"/users/jack",
	之后可以通过@PathVariable可以提取URI模板模式中的{XXX}中的值
@RequestMapping(value="/users/{name}/create") 
	这样也是可以的,请求的URL可以是"/users/tom/create"
@RequestMapping(value="/users/{name}/topics/{Id}")
	这样也是可以的,请求的URL可以是"/users/jack/topics/1"

2.1不获取占位符的值

代码:

@RequestMapping("/url")
@Controller
public class RequestUrlController {
	@RequestMapping("/test2/{name}")
	public String test2() {  
		System.out.println("RequestUrlController test2()......");
		return "test";	//跳转到test.jsp
	}
}

在这里插入图片描述

2.2通过@PathVariable获取占位符的值

通过@PathVariable可以提取URI模板模式中的{XXX}中的值
代码:

@RequestMapping("/url")
@Controller
public class RequestUrlController {
	@RequestMapping("/test2/{name}")
	public String test2(@PathVariable String name) {  //可以拿到占位符里面的传进来的name值
		System.out.println("RequestUrlController test2()......");
		System.out.println("name="+name);
		return "test";	//跳转到test.jsp
	}
}

在这里插入图片描述
在这里插入图片描述

2.3通过@PathVariable获取中间占位符或者多个占位符的值

代码:

@RequestMapping("/url")
@Controller
public class RequestUrlController {
	//中间使用占位符
	@RequestMapping("/test3/{id}/create") 
	public String test3(@PathVariable int id) {  //int类型的值也可以拿到
		System.out.println("RequestUrlController test3()......");
		System.out.println("id="+id);
		return "test";	//跳转到test.jsp
	}

	//多个占位符
	@RequestMapping("/test4/{group}/{username}")
	public String test4(@PathVariable String group,@PathVariable String username) { //多个 @PathVariable
		System.out.println("RequestUrlController test4()......");
		System.out.println("group="+group+",username="+username);
		return "test";	//跳转到test.jsp
	}
}

中间占位符的结果:
在这里插入图片描述
在这里插入图片描述
多个占位符的结果:
在这里插入图片描述
在这里插入图片描述

3.Ant风格的URL路径映射(*,**,?)

理论:

@RequestMapping("/test5/*")
	*代表可以匹配一个路径的占位符  0~n个字符 
	如:../test5/bf
@RequestMapping(value="/product*")
	可匹配"/productabc""/product",但不匹配"/productabc/abc";
	*代表0~n个字符
@RequestMapping(value="/product/*")
	可匹配"/product/abc",但不匹配"/productabc";
		
@RequestMapping(value="/test5/**")
	**代表可以匹配多重子目录结构     
	如:../test5/a/b/c/d...
	
@RequestMapping(value="/test6/?")
	?代表有且只有一个字符
	可匹配"/test6/1""/test6/a",但不匹配"/test6""/test6/aa";

@RequestMapping(value="/products/**/{productId}")
	可匹配"/products/abc/abc/123""/products/123",也就是Ant风格和URI模板变量风格可混用;
	**代表所有的子路径

3.1单个*,0~n个字符

代码:

@RequestMapping("/url")
@Controller
public class RequestUrlController {
	//Ant风格的URL路径映射
	@RequestMapping("/test5/*")  //单个*代表一个路径的占位符  0~n个字符 如:../url/test5/bf
	public String test5() { 
		System.out.println("RequestUrlController test5()......");
		return "test";	//跳转到test.jsp
	}
}

3.2两个*,多重子目录结构

代码:

@RequestMapping("/url")
@Controller
public class RequestUrlController {
	@RequestMapping("/test5/**")  //两个**代表多重子目录结构      如:../url/test5/a/b/c/d...
	public String test5() { 
		System.out.println("RequestUrlController test5()......");
		return "test";	//跳转到test.jsp
	}
}

3.3单个?,有且只有一个字符

代码:

@RequestMapping("/url")
@Controller
public class RequestUrlController {
	//Ant风格的URL路径映射
	@RequestMapping("/test6/?")  //单个*代表一个路径的占位符  0~n个字符 如:../url/test5/bf
	public String test6() { 
		System.out.println("RequestUrlController test6()......");
		return "test";	//跳转到test.jsp
	}
}

3.4Ant风格和URI模板变量风格混合使用

代码:

@RequestMapping("/url")
@Controller
public class RequestUrlController {
	@RequestMapping("/test7/?/{name}")   //如:../url/test7/s/tom
	public String test7(@PathVariable String name) { 
		System.out.println("RequestUrlController test7()......");
		System.out.println("name="+name);  //name=tom
		return "test";	//跳转到test.jsp
	}
	
	@RequestMapping("/test8/**/{name}")   //如:../url/test8/ds/dd/ee/dd/jack
	public String test8(@PathVariable String name) { 
		System.out.println("RequestUrlController test8()......");
		System.out.println("name="+name); //name=jack
		return "test";	//跳转到test.jsp
	}
}

4.正则表达式风格的URL路径映射

理论:

从Spring3.0 开始支持正则表达式风格的URL路径映射,格式为{变量名:正则表达式},
之后通过@PathVariable可以提取{XXX:正则表达式匹配的值}中的XXX这个变量的值。

@RequestMapping(value="/products/{categoryCode:\\d+}-{pageNumber:\\d+}")
	可以匹配"/products/123-1",但不能匹配"/products/abc-1",这样可以设计更加严格的规则。
@RequestMapping(value="/user/{userId:^\\d{4}-[a-z]{2}$}")
	可以匹配"/user/1234-ab"

注意:\d表示数字,但是\在java的字符串中是特殊字符,所以需要再加一个\进行转义即可
(参照之前js的学习文档,和java的正则几乎一致,js正则中的一个/变为java中的俩个/即可)
	括号:
		[abc] 	查找方括号之间的任何字符。
		[^abc] 	查找任何不在方括号之间的字符。
		[0-9] 	查找任何从 0 至 9 的数字。
		[a-z] 	查找任何从小写 a 到小写 z 的字符。
		[A-Z] 	查找任何从大写 A 到大写 Z 的字符。
		[A-z] 	查找任何从大写 A 到小写 z 的字符。
		(red|blue|green) 	查找任何指定的选项。
	
	元字符:
		. 	查找单个任意字符,除了换行和行结束符.如果要表示.这个字符,需要转义
		\w 	查找单词字符。     字母 数字 _
		\W 	查找非单词字符。非 字母 数字 _
		\d 	查找数字。
		\D 	查找非数字字符。
		\s 	查找空白字符。
		\S 	查找非空白字符。
		\b 	匹配单词边界。
		\B 	匹配非单词边界。
		\0 	查找 NUL 字符。
		\n 	查找换行符。
		\f 	查找换页符。
		\r 	查找回车符。
		\t 	查找制表符。
		\v 	查找垂直制表符。

	量词:
		n+ 		匹配任何包含至少一个 n 的字符串。
		n* 		匹配任何包含零个或多个 n 的字符串。
		n? 		匹配任何包含零个或一个 n 的字符串。
		n{X} 	匹配包含 X 个 n 的序列的字符串。
		n{X,Y} 	匹配包含 X 到 Y 个 n 的序列的字符串。
		n{X,} 	匹配包含至少 X 个 n 的序列的字符串。
		n$ 		匹配任何结尾为 n 的字符串。
		^n 		匹配任何开头为 n 的字符串。
		?=n 	匹配任何其后紧接指定字符串 n 的字符串。
		?!n 	匹配任何其后没有紧接指定字符串 n 的字符串。


正则表达式风格的URL路径映射是一种特殊的URI模板模式映射
URI模板模式映射不能指定模板变量的数据类型,如是数字还是字符串;
正则表达式风格的URL路径映射,可以指定模板变量的数据类型,可以将规则写的相当复杂。

代码:

@RequestMapping("/url")
@Controller
public class RequestUrlController {
	//正则表达式风格的URL路径映射
	//@RequestMapping("/test9/{id:\\d+}")   //如:../url/test9/74 只能是数字
	@RequestMapping("/test9/{id:\\d{5}}")   //如:../url/test9/12345   5个数字
	public String test9(@PathVariable int id) { 
		System.out.println("RequestUrlController test9()......");
		System.out.println("id="+id);   //id=74   id=71111
		return "test";	//跳转到test.jsp
	}
	@RequestMapping("/test10/{msg:^\\d{3}-[a-z]{2}$}")  //如:123-ab
	public String test10(@PathVariable String msg) { 
		System.out.println("RequestUrlController test10()......");
		System.out.println("msg="+msg);   
		return "test";	//跳转到test.jsp
	}
}

@RequestMapping("/test9/{id:\d+}")
//如:…/url/test9/12 只能是数字
结果:
在这里插入图片描述


@RequestMapping("/test9/{id:\d{5}}")
//如:…/url/test9/12345 只能是5个数字,1个2个的都不行
结果:
在这里插入图片描述


@RequestMapping("/test10/{msg:^\\d{3}-[a-z]{2}$}") 如:123-ab 结果:

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值