@RequestMapping
注解可以将HTTP请求映射给controller
来处理,包括返回视图页面的controller和Rest
服务的controller。
@RequestMapping
可以添加到类或者方法上。
@Controller
@RequestMapping(value = "/", method = RequestMethod.GET)
public class ContactController {
@RequestMapping(value = "/", method = RequestMethod.GET)
public String redirectToContactPage() {
return "redirect:contact";
}
@RequestMapping(value = "/admin", method = RequestMethod.GET)
public String toAdminPage() {
return "admin";
}
@RequestMapping(value = "/contact", method = RequestMethod.GET)
public String toContactForOhersPage() {
return "contact";
}
}
在上面的例子中,@RequestMapping
加在了类和方法上:
- 访问
/
的请求会被ContactController
的redirectToContactPage()
方法处理 - 访问
/admin
的请求会被ContactController
的toAdminPage()
方法处理
@RequestMapping
映射多个URL
@Controller
@RequestMapping("/")
public class ContactController {
@RequestMapping(value={"", "/page", "page*","view/*"})
String multipleMapping(){
return "Hello";
}
}
访问下列地址都会被ContactController
的multipleMapping
方法处理:
localhost:8080/
localhost:8080/page
localhost:8080/pagehello
localhost:8080/view/
localhost:8080/view/view1
@RequestParam
请求参数
使用@RequestParam
可以将HTTP请求参数绑定到controller中方法的参数上,例如
@Controller
@RequestMapping("/")
public class ContactController {
@RequestMapping(value=/hello)
String sayHelloToUser(@RequestParam("username") String username){
return "Hello " + username;
}
@RequestMapping(value=/hi)
String sayHiToUser(@RequestParam String username){
return "Hello " + username;
}
}
- 当访问
localhost:8080/hello?username=ted
时,值ted
会绑定到参数username
上,结果是Hello ted
。 - 当HTTP请求参数和controller方法的参数名称相同时,可以省略,如
sayHiToUser
方法 -
@RequestParam
默认要求参数是必要的,通过设置@RequestParam(value = "username", required = false)
设为可选,这样HTTP请求不带username
参数也是可以访问到指定的方法。 - 当HTTP请求不带
username
参数时,还可以设置它的默认值,如@RequestParam(value = "username", defaultValue = "mattie")
指定HTTP请求类型
HTTP请求有GET
, POST
, PUT
, DELETE
等,@RequestMapping
可以处理特定的请求类型。相当于如下注解:
GetMapping
PostMapping
PutMapping
DeleteMapping
@Controller
@RequestMapping("/")
public class ContactController {
@RequestMapping(value=/hello, method = RequestMethod.GET)
String sayHelloToUser(@RequestParam("username") String username){
return "Hello " + username;
}
@PostMapping(value=/hello)
String login(@RequestParam("password") String password){
return "Login Success!";
}
}
上面的例子中login
方法处理POST
类型的请求。
@RequestMapping
处理动态URL
和注解@PathVariable
联合使用,可以解析HTTP请求中的动态URL。
@Controller
@RequestMapping("/")
public class ContactController {
@RequestMapping(value = "/contacts/{contactname}", method = RequestMethod.GET)
String getContactName(@PathVariable("contactname") String name){
return "Contact name is " + name;
}
}
上面的例子中,访问localhost:8080/contacts/ted
和localhost:8080/contacts/mattie
都会被ContactController
的getContactName
方法处理,结果分别是Contact name is ted
和Contact name is mattie
。
动态URL也可以使用正则来匹配:
@Controller
@RequestMapping("/")
public class ShopController {
@RequestMapping(value = "/{id:[a-z]+}/{productname}", method = RequestMethod.GET)
String getProductName(@PathVariable("productname") String productName){
return "Product name is " + productName;
}
}
- 上面的例子中,访问
localhost:8080/wears/shoes
和localhost:8080/foods/bread
都会被ShopController
的getProductName
方法处理 - 但是访问
localhost:8080/101/fun
不会被处理。
注意
@RequestParam
和@PathVariable
的区别:@RequestParam
解析URL中特定的请求参数的值;而@PathVariable
用来匹配URL路径的规则和模式。