两个@RequestMapping注释之间的差异

And*_*ili 0 java spring annotations spring-mvc request-mapping

我是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";
    } 

}
Run Code Online (Sandbox Code Playgroud)

所以这个方法处理HTTP请求到URL / users?寄存器,其中register是一个参数(因为整个类处理对/ users资源的请求).

如果使用params ="register"我使用以下的syntaxt 是同样的事情:

@Controller
public class UserController {

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

}
Run Code Online (Sandbox Code Playgroud)

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

它与第一个例子的含义相同吗?

Tun*_*aki 6

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

代码1

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

还支持"myParam"样式表达式,这些参数必须存在于请求中(允许具有任何值).

代码2

@Controller
public class UserController {

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

}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,@RequestMapping声明registerPathVariable.createForm如果在URL处发出HTTP请求,则调用该方法/users/something,无论如何something.你可以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";
} 
Run Code Online (Sandbox Code Playgroud)