两个@RequestMapping注解的区别

Difference between two @RequestMapping annotations

我是 Spring MVC 的新手,我有以下疑问。

在控制器中,我有一个这样注释的方法:

@Controller
@RequestMapping(value = "/users")
public class UserController {

    @RequestMapping(params = "register")
    public String createForm(Model model) {
        model.addAttribute("user", new Customer());
        return "user/register";
    } 

}

所以这个方法处理指向 URL /users?register 的 HTTP 请求,其中 register 是一个参数(因为整个 class 处理对 /users 资源的请求。

如果不是使用 params = "register" 我使用以下语法,这是否是一回事:

@Controller
public class UserController {

    @RequestMapping("/users/{register}")
    public String createForm(Model model) {
        model.addAttribute("user", new Customer());
        return "user/register";
    } 

}

我已经删除了 class 级别的映射,我使用 @RequestMapping("/users/{register}").

是不是和第一个例子一样的意思?

不,它们是完全不同的构造:

代码 1

@Controller
@RequestMapping(value = "/users")
public class UserController {

    @RequestMapping(params = "register")
    public String createForm(Model model) {
        model.addAttribute("user", new Customer());
        return "user/register";
    } 

}

在这种情况下,当在 URL /users?register 发出 HTTP 请求时,将调用 createForm 方法。引用 Spring Javadoc,这意味着无论 register HTTP 参数的值是什么,都会调用此方法;它必须存在。

"myParam" style expressions are also supported, with such parameters having to be present in the request (allowed to have any value).

代码 2

@Controller
public class UserController {

    @RequestMapping("/users/{register}")
    public String createForm(Model model) {
        model.addAttribute("user", new Customer());
        return "user/register";
    } 

}

在这种情况下,@RequestMappingregister 声明为 PathVariable。如果在 URL /users/something 发出 HTTP 请求,无论 something 是什么,都会调用方法 createForm。你实际上可以像这样检索这个 something

@RequestMapping("/users/{register}")
public String createForm(@PathVariable("register") String register, Model model) {
    // here "register" will have value "something".
    model.addAttribute("user", new Customer());
    return "user/register";
}