之前的例子里有演示过,控制器(Controller)里的方法加上@GetMapping注解,就可以处理对应路径上的GET请求了。除了它,还有对应的@PostMapping、@PatchMapping、@PutMapping和@DeleteMapping等等。这些注解都来源于一个更通用的注解@RequestMapping,字面意思就是请求映射。我们来看看它的用法:
图中有一个名为method的注解参数,指明了@RequestMapping处理的是GET请求。如果把这个method注解删掉,那么home方法就会处理发送到”/”路径的所有请求。如果你无意在一个方法里处理多种请求的话,我建议你在注解参数里写明需要处理的HTTP请求类型,或者使用更方便的@GetMapping或者@PostMapping等。
@RequestMapping不仅可以加到方法上,也可以加到类上。加到类上的时候,类中方法所指定的路径都是相对的。
一个链接的某个部分可能是动态的,所以你可能需要通过路径变量来获取。@PathVariable就是用来获取路径变量的,路径中的占位符需要用花括号{}包围:
可以看到@GetMapping的路径参数里有占位符“userId”,为了获取到它的值,可以给show方法添加一个参数,并且加上@PathVariable注解,我们可以看到int变量的名字是userId,这样他就会去和路径中的userId占位符匹配。当你像上图那样在浏览器输入地址后,userId变量就获的了值23。23只是我为了演示随便写的数字,他可以是任何数字,只要int存的下。不过要是放个字符串,会提示出错的。
如果你不想让int变量名和占位符名称一样,可以给@PathVariable添加注解参数,这样你的int变量就可以随意重构了,如下。
网页链接后面是有可能跟上查询参数(Query Parameter)的,这时需要使用@RequestParam注解,他的用法@PathVariable的用法有些类似,都需要给请求处理方法增加参数。
如果变量名和查询参数的名称一样的话,@RequestParam的注解参数可以省略。图中展示了省略和不省略两种情况。在浏览器中你如果忘了传递userId参数或者传递的不是数字,会报错的。
如果用户忘了传参数,好说,给他个默认值就行:
你也可以使用Optional对象来接受参数,通过isPresent方法判断有没有参数传递过来。注意此时@RequestParam的required参数要设为false。