【Spring-Controller 整理研究】@RequestMapping略解
本文以纯后端的角度,去研究Spring Controller在各种情况的行为,及各种属性的作用。
实验准备
利用https://start.spring.io/快速生成一个开箱即用的小巧spring boot项目,无需进行复杂配置,非常适合进行研究实验使用。
若以下例子未说明,结果为下述代码所示。
@Controller
@RequestMapping(value = "/terra")
public class TestController {
// 放置实验的Controller
}
端口号在application.properties设置为9000
server.port=9000
server.contextPath=/
server.tomcat.uri-encoding=UTF-8
@RequestMapping
@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。(抄)
一. value
value不设置和设置为""的情况下会产生冲突,编译会报错。
@RequestMapping()
public String voidController1() {
return "voidController1";
} @RequestMapping(value = "")
public String voidController2() {
return "voidController2";
}
两者可以看做等价,但是又存在区别。
value不设置的情况下,认为是默认控制器,此时不能令返回值=void,否则会在请求时报错
// TODO 需要翻源码了解为何报错
Circular view path [second]: would dispatch back to the current handler URL [/second] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)
但是可以跳转到其他类下的路径,而value = "" 时则不会有这些问题.
@Controller
@RequestMapping(value = "/second")
public class SecondPageController { @RequestMapping()
public String defaultController() {
// 报错
// return "/terra";
return "/terra/test";
}
}
于是乎可以做到类似以下的杂技般有趣但又没多大意义的跳转,需要注意的是默认控制器无法直接使用本类下的子路径,原因不明。
@Controller
@RequestMapping(value = "/terra")
public class TestController { @RequestMapping(value = "test")
public String testController() {
System.out.println("测试请求");
return "/terra";
} @RequestMapping()
public String defaultController() {
System.out.println("请求跳转到了默认请求控制器");
// 无法跳转
// return "/jump";
return "/terra/jump";
} @RequestMapping(value = "jump")
public String jumpController() {
System.out.println("请求跳转到了jump");
return "void";
} @RequestMapping(value = "void")
public void voidController() {
System.out.println("请求跳转到了void,终止");
} }
localhost:9000/terra/test 或者localhost:9000/second 请求控制台输出:
测试请求
请求跳转到了默认请求控制器
请求跳转到了jump
请求跳转到了void,终止
顺带一提value支持中文,猜想支持的范围=String.equal,但是一般不会有猿们这么用吧
@Controller
@RequestMapping(value = "/中文")
public class ZnTestController { @RequestMapping(value = "测试")
public void testController() {
System.out.println("测试请求");
}
}
想写下一个内容的过程发现 value值中带不带“/”是等价的,下面两个test会报错,且用无斜杠与有斜杠的路径没有区别
@Controller
@RequestMapping("value")
public class ValueBindController { @RequestMapping(value = "/test")
public void hasSlash() {
System.out.println("有斜杠");
} @RequestMapping(value = "test")
public void noneSlash() {
System.out.println("无斜杠");
}
}
路径貌似不支持其他特殊字符,如#value或/#value时无法与localhost:/#value/test进行匹配
......好吧正题
value支持使用占位符对url进行值绑定到参数上,如下列形式,这种即是REST风格的入参形式
@Controller
@RequestMapping("value")
public class ValueBindController { @RequestMapping(value = "printValue/{value}")
public void printValue(@PathVariable String value) {
// localhost:9000/value/printValue/1
System.out.println(value);
} @RequestMapping(value = "printPrintValue/{value}")
public void printPrintValue(@PathVariable("value") String printValue) {
// localhost:9000/value/printPrintValue/1
System.out.println(printValue);
} @RequestMapping(value = "printValues/{value1}/{value2}")
public void printValues(@PathVariable String value1, @PathVariable Integer value2) {
// localhost:9000/value/printValues/1/2
System.out.println(value1 + "/" + value2);
} @RequestMapping(value = "printMap/{value1}/{value2}")
public void printValues(@PathVariable Map<String, String> map) {
// localhost:9000/value/printValues/1/2
System.out.println(map.get("value1") + "/" + map.get("value2"));
} @RequestMapping(value = "printList/{list}")
public void printValues(@PathVariable List<String> list) {
// localhost:9000/value/printList/1,2,3
list.stream().forEach(k -> System.out.print(k + " "));
System.out.println();
}
}
博客上有人提到过使用@PathVariable会产生截断问题,即value/{value},若输入为1.jpg,value =1。但是测试时发现非常非常的正常,版本问题么?
value支持多路径,如下,这种形式还可以解决当参数参数非必传时的问题
@Controller
@RequestMapping(value = "mul")
public class MulValueController { @RequestMapping(value = {"one", "two", "three"})
public void test() {
// localhost:9000/mul/one
// localhost:9000/mul/two
// localhost:9000/mul/three
System.out.println("多路径匹配");
} @RequestMapping(value = {"value/{value1}", "value/{value1}/{value2}"})
public void printValues(@PathVariable String value1, @PathVariable(required = false) String value2) {
// localhost:9000/value/1
// localhost:9000/value/1/2
System.out.println(value1 + "/" + value2);
}
}
value亦支持正则表达式
@Controller
@RequestMapping(value = "regex")
public class RegexController { @RequestMapping(value = "tel/{number:^18[0-9]\\d{8}$}")
public void telPhone(@PathVariable String number) {
// 匹配以18开头的手机号码
// localhost:9000/regex/tel/18123456890
System.out.println(number);
}
}
但是复杂一些的正则会出一些莫名其妙的错误,原因不明,比如
^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$
会报下面这个异常。
The number of capturing groups in the pattern segment (^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\d{8}$) does not match the number of URI template variables it defines, which can occur if capturing groups are used in a URI template regex. Use non-capturing groups instead.
二. method
method用于指定请求类型,如GET,POST
路径相同类型不同的方法可以共存(value =value , method != method) ,
如下GET请求会到getController,POST请求会执行postController,其余类型的请求会执行allController
@RequestMapping(method = RequestMethod.GET)
public String getController() {
return "Get请求";
} @RequestMapping(method = RequestMethod.POST)
public String postController() {
return "Post请求";
} @RequestMapping()
public String allController() {
return "任意请求";
}
method支持多参数,这里用GET还是用POST都会调用这个方法
@RequestMapping(method = {RequestMethod.GET, RequestMethod.POST})
public String getPostController() {
return "GetOrPost请求";
}
待续
【Spring-Controller 整理研究】@RequestMapping略解的更多相关文章
- Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解
一.控制器定义 控制器提供访问应用程序的行为,通常通过服务接口定义或注解定义两种方法实现. 控制器解析用户的请求并将其转换为一个模型.在Spring MVC中一个控制器可以包含多个Action(动作. ...
- Spring MVC 学习)——控制器与@RequestMapping详解
Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解 一.控制器定义 控制器提供访问应用程序的行为,通常通过服务接口定义或注解定义两种方法实现. 控制器解析用户的请求 ...
- SpringMVC RequestMapping 详解
SpringMVC RequestMapping 详解 RequestMapping这个注解在SpringMVC扮演着非常重要的角色,可以说是随处可见.它的知识点很简单.今天我们就一起学习Spring ...
- Spring Boot 之使用 Json 详解
Spring Boot 之使用 Json 详解 简介 Spring Boot 支持的 Json 库 Spring Web 中的序列化.反序列化 指定类的 Json 序列化.反序列化 @JsonTest ...
- Spring boot注解(annotation)含义详解
Spring boot注解(annotation)含义详解 @Service用于标注业务层组件@Controller用于标注控制层组件(如struts中的action)@Repository用于标注数 ...
- Spring学习 6- Spring MVC (Spring MVC原理及配置详解)
百度的面试官问:Web容器,Servlet容器,SpringMVC容器的区别: 我还写了个文章,说明web容器与servlet容器的联系,参考:servlet单实例多线程模式 这个文章有web容器与s ...
- 利用Intellij+MAVEN搭建Spring+Mybatis+MySql+SpringMVC项目详解
http://blog.csdn.net/noaman_wgs/article/details/53893948 利用Intellij+MAVEN搭建Spring+Mybatis+MySql+Spri ...
- Spring第三天,详解Bean的生命周期,学会后让面试官无话可说!
点击下方链接回顾往期 不要再说不会Spring了!Spring第一天,学会进大厂! Spring第二天,你必须知道容器注册组件的几种方式!学废它吊打面试官! 今天讲解Spring中Bean的生命周期. ...
- springMVC(1)---@RequestMapping详解
@RequestMapping详解 RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径.这句话,太熟悉了. ...
随机推荐
- Centos 7 上使用nginx为Node.js配置反向代理时错误:(13: Permission denied) while connecting to upstream
错误来源:Centos 7 上使用nginx为Node.js配置反向代理时产生(13: Permission denied) while connecting to upstream的错误 nginx ...
- springBoot使用@Value标签读取*.properties文件的中文乱码问题
上次我碰到获取properties文件中的中文出现乱码问题. 查了下资料,原来properties默认的字符编码格式为asci码,所以我们要对字符编码进行转换成UTF-8格式 原先代码:@Proper ...
- 一次php访问sql server 2008的API接口的采坑
2018年6月21日17:17:09,注意:不是详细文档,新手可能会看不懂 windows下安装 项目是sql server 2008的k3,php连接数据库写的API,因为是买的时候是别人的程序,测 ...
- SQL之NULL值的几种处理方式
1.创建测试表: drop table if exists tab_null_operator; create table tab_null_operator as select 1 as id,'c ...
- 在Fastreport里使用的CRC函数
如标题, 是在Fastreport的脚本里运行的CRC计算函数, 包括CRC-16/CRC-32 基本是从网上找的代码, 然后改出来的 至于为什么要在FR的脚本里运行....呵呵 不要在意这些细节(找 ...
- P1368 工艺 SA/最小表示法
正解:SA/最小表示法 解题报告: 传送门! 听说正解是最小表示法,,,O(n)然后常数还挺小的,,, 但是我不会QAQ! 所以先写下SA的做法趴,,,等get了最小表示法再来写正解QAQ 就这种题算 ...
- CJSON在项目中的应用
无需编译,只需将 cJSON.c.cJSON.h 添加到项目中即可使用
- VisualVM监控远程服务器JVM
VisualVM是JDK自带的一款全能型性能监控和故障分析工具,包括对CPU使用.JVM堆内存消耗.线程.类加载的实时监控,内存dump文件分析,垃圾回收运行情况的可视化分析等,对故障排查和性能调优很 ...
- 完整工程,deeplab v3+(tensorflow)代码全理解及其运行过程,长期更新
前提:ubuntu+tensorflow-gpu+python3.6 各种环境提前配好 1.下载工程源码 网址:https://github.com/tensorflow/models 下载时会遇到速 ...
- 北京大学Cousera学习笔记--7-计算导论与C语言基础--基本数据类型&变量&常量
1.整形数据 1.基本型(int 4B).短整型(short 2B).长整型(long 4B) VC环境下 sizeof运算符用于计算某种类型的对象在内存中所占的字节数 ,用法:size(int) ...