这一节虽然简单,但是很繁琐,可以先了解 @RequestMapping 的使用,不是很明白也没有关系,先继续往下学习,等你回头再看一遍的时候,你会发现 @RequestMapping 竟然是如此的简单! @RequestMapping可以在控制器类上或者控制器方法上使用。 在类的级别上的注解会将一个特定请求或者请求模式映射到一个控制器之上。之后你还可以另外添加方法级别的注解来进一步指定到处理方法的映射关系。 基础用法: 下面的 @RequestMapping("/index") 等同于 @RequestMapping(value = "/index")
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
package com.pudding.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping("/index") public class HelloWorldController { @RequestMapping(value = "/hello", method = RequestMethod.GET) public String hello() { return "/WEB-INF/views/success.jsp"; } @RequestMapping(value = "/world", method = RequestMethod.POST) public String world() { return "/WEB-INF/views/success.jsp"; } } |
method 参数支持:GET, PUT, POST, DELETE 以及 PATCH。使用 method 可以限制接受的请求类型。 hello() 方法将只接受请求方式为 GET 方式,请求地址为:/index/hello 的请求。 world() 方法将只接受请求方式为 POST 方式,请求地址为:/index/world 的请求。 @GetMapping("/hello") 等同于 @RequestMapping(value="/hello", method=RequestMethod.GET) @PostMapping("/world") 等同于 @RequestMapping(value="/world", method=RequestMethod.POST) 映射多个地址: @RequestMapping 还可以将多个请求映射到一个方法上,只需要给 value 来指定一个包含多个路径的列表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package com.pudding.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/index") public class HelloWorldController { @RequestMapping(value = {"/hello", "/world", "/helloworld"}) public String hello() { return "/WEB-INF/views/success.jsp"; } } |
URI模板: URI模板可以为快速访问 @RequestMapping 中指定的URL的一个特定的部分提供很大的便利。 使用 @PathVariable 可以获取到 {name} 的值,并在控制台进行输出。比如请求地址为:http://localhost:8080/SpringMVC/hello/jack 那么控制台上将会把 jack 进行输出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package com.pudding.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HelloWorldController { @RequestMapping("/hello/{name}") public String hello(@PathVariable String name) { System.out.println(name); return "/WEB-INF/views/success.jsp"; } } |
如果路径中的URI变量和方法中的参数名不一样的话,那么需要在 @PathVariable 中显示的绑定参数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package com.pudding.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HelloWorldController { @RequestMapping("/hello/{name}") public String hello(@PathVariable("name") String username) { System.out.println(username); return "/WEB-INF/views/success.jsp"; } } |
一个方法可以拥有任意数量的 @PathVariable 注解:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package com.pudding.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HelloWorldController { @RequestMapping("/hello/{name}/age/{age}") public String hello(@PathVariable String name, @PathVariable int age) { System.out.println("name:" + name + ",age:" + age); return "/WEB-INF/views/success.jsp"; } } |
@PathVariable 可以被应用于所有 简单类型 的参数上,比如 int、long、Date 等类型。Spring会自动地帮你把参数转化成合适的类型,如果转换失败,就抛出一个 TypeMismatchException。如果你需要处理其他数据类型的转换,也可以注册自己的类。 带正则表达式的URI模板: 你可以使用正则表达式来准确的描述可以接受的请求路径:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package com.pudding.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HelloWorldController { @RequestMapping("/hello/{name:[a-z]+}/age/{age}") public String hello(@PathVariable String name, @PathVariable int age) { System.out.println("name:" + name + ",age:" + age); return "/WEB-INF/views/success.jsp"; } } |
Ant风格的路径模式: 除了URI模板外,@RequestMapping注解还支持Ant风格的路径模式(如/hello/*.do等)。不仅如此,还可以把URI模板变量和Ant风格的glob组合起来使用(比如/hello/*/user/{userId}这样的用法等)。其中*则表示任意字符串。但是遇到 / 那么就会认为是下一部分的URI,所以 * 中不能有 / 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package com.pudding.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HelloWorldController { // 匹配的地址:http://localhost:8080/SpringMVC/hello/jack/user/18 @RequestMapping("/hello/*/user/{userId}") public String hello(@PathVariable String userId) { System.out.println(userId); return "/WEB-INF/views/success.jsp"; } } |
那么想要匹配带 / 的路径那该怎么办?可以使用 ** 来进行匹配。例如 /hello/**/user/{userId} 则会匹配 /hello/ 和 /user/{userId} 之间的部分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package com.pudding.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HelloWorldController { // 匹配的地址:http://localhost:8080/SpringMVC/hello/jack/tom/cat/user/18 @RequestMapping("/hello/**/user/{userId}") public String hello(@PathVariable String userId) { System.out.println(userId); return "/WEB-INF/views/success.jsp"; } } |
路径样式的匹配(Path Pattern Comparison): 当一个URL同时匹配多个模板(pattern)时,我们将需要一个算法来决定其中最匹配的一个。 URI模板变量的数目和通配符数量的总和最少的那个路径模板更准确。举个例子,/hotels/{hotel}/*这个路径拥有一个URI变量和一个通配符,而/hotels/{hotel}/**这个路径则拥有一个URI变量和两个通配符,因此,我们认为前者是更准确的路径模板。 如果两个模板的URI模板数量和通配符数量总和一致,则路径更长的那个模板更准确。举个例子,/foo/bar*就被认为比/foo/*更准确,因为前者的路径更长。 如果两个模板的数量和长度均一致,则那个具有更少通配符的模板是更加准确的。比如,/hotels/{hotel}就比/hotels/*更精确。 […]
View Details经过两周的角逐,2021 年度 OSC 中国开源项目评选第一轮投票已结束。 本次评选对「组织」和「个人」的开源项目进行了区分,并针对「组织」通道的项目设置了 7 大分类:基础软件、云原生、大前端、DevOps、开发框架与工具、AI & 大数据、IoT & 5G 。 第一轮投票根据票数选出「组织」项目 7 大分类中每个分类的 TOP 5,以及「个人」项目的 TOP 15,总共 50 个项目获得「OSCHINA 人气指数 TOP 50 开源项目」称号。 「组织」通道获奖项目(35 个) 「个人」通道获奖项目(15 个) 恭喜以上项目获得「OSCHINA 人气指数 TOP 50 开源项目」称号,它们将继续参与第二轮投票环节以争夺「最受欢迎项目」奖项,欢迎大家前来投票支持 ↓↓↓ https://www.oschina.net/project/top_cn_2021 from:https://www.oschina.net/question/2918182_2324736
View Details