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

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 结果:

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

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SpringMVC获取请求参数的方式有多种,最常用的是通过注解@RequestParam获取请求参数。例如,@RequestParam("username") String username表示获取名为username的请求参数,并将其赋值给String类型的变量username。另外,还可以通过HttpServletRequest对象获取请求参数,例如HttpServletRequest.getParameter("username")。此外,还可以使用@PathVariable注解获取URL路径的参数,例如@RequestMapping("/user/{id}"),其{id}表示获取路径的id参数。 ### 回答2: SpringMVC是一种基于Java的web框架,用于开发web应用程序。通过SpringMVC框架,可以很方便地获取请求参数。 在SpringMVC获取请求参数有多种方式。其,最常用的方式是通过方法的参数来获取请求参数。在控制器方法定义参数,参数名与请求参数名一致,SpringMVC会自动将请求参数的值绑定到对应的参数上。例如,如果请求有一个参数名为"username"的参数,可以在控制器方法定义一个同名的String类型的参数来接收该参数的值。 除了通过方法参数获取请求参数,还可以使用@RequestParam注解。该注解可以用于方法参数上,指定请求参数的名称,以及是否为必需的参数。例如,@RequestParam("id") int userId,表示要获取名为"id"的请求参数,并将其转换为int类型的userId参数。可以通过设置required属性来指定该参数是否必需,默认为true,如果请求没有该参数,会抛出异常。 另外,还可以使用@PathVariable注解获取路径参数。路径参数是在URL定义的参数,可以通过在控制器方法的路径使用占位符来表示。例如,@RequestMapping("/user/{id}"),可以通过@PathVariable("id")来获取路径的参数值。 除了以上方式,还可以通过HttpServletRequest对象来获取请求参数。在控制器方法,可以将HttpServletRequest对象作为方法参数传入,然后通过该对象的getParameter方法来获取请求参数的值。 总之,SpringMVC提供了多种简便的方式来获取请求参数。无论是通过方法参数、@RequestParam注解、@PathVariable注解,还是使用HttpServletRequest对象,都可以方便地获取请求参数的值,便于进行后续的业务逻辑处理。 ### 回答3: SpringMVC是基于Java的一种MVC(Model-View-Controller)框架,用于构建Web应用程序。在SpringMVC获取请求参数是非常常见的任务并且非常容易。 首先,要使用SpringMVC获取请求参数,你需要定义一个处理请求的控制器类,并在类的方法上添加@RequestMapping注解来指定请求URL映射。 在控制器方法,你可以使用@RequestParam注解获取请求参数。该注解有几个属性可以使用,最常用的是value属性,用于指定请求参数的名称。例如,你可以使用@RequestParam("name")来获取名为name的请求参数。如果请求参数的名称与方法参数的名称相同,你也可以省略value属性,只使用@RequestParam注解。 @RequestParam注解也支持一些其他属性,例如required属性用于指示请求参数是否是必需的,默认为true,即必须提供该参数。你还可以使用defaultValue属性来指定请求参数的默认值。 除了@RequestParam注解,你还可以使用@PathVariable注解获取URL路径的参数。该注解URL占位符与方法参数进行映射。例如,如果URL有一部分为"/users/{id}",你可以在方法参数使用@PathVariable("id")来获取路径的id参数。 另外,SpringMVC还支持通过@RequestParamMap注解获取所有的请求参数,并以Map的形式进行处理。这对于处理不确定数量的请求参数非常有用。 总而言之,SpringMVC提供了多种方法来获取请求参数。你可以使用@RequestParam注解获取单个请求参数,使用@PathVariable注解获取URL路径的参数,或者使用@RequestParamMap注解获取所有的请求参数。这些功能使得处理请求参数变得非常方便和灵活。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值