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