两个@RequestMapping注释之间的差异

时间:2015-08-30 16:13:26

标签: java spring spring-mvc annotations 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";
    } 

}

因此,此方法处理针对网址 / users?register 的HTTP请求,其中注册是一个参数(因为整个类处理对 / users 资源)。

如果使用 params =“register”,我使用以下语法合成是否相同:

@Controller
public class UserController {

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

}

我已删除了班级级别的映射,并使用 @RequestMapping(“/ users / {register}”)

第一个例子的含义是否相同?

1 个答案:

答案 0 :(得分: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";
    } 

}

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

  

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

代码2

@Controller
public class UserController {

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

}

在这种情况下,@RequestMappingregister声明为PathVariable。如果在网址createForm处发出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";
}