@RequestMapping注解是Spring框架中常用的注解之一,用于将HTTP请求映射到相应的处理方法上。它可以用在控制器类或控制器方法上,并可以定义一系列属性来指定请求的路径、HTTP方法、请求参数等。

类级别上的@RequestMapping注解:

  • 用于指定类中所有处理请求的方法的公共URL前缀。
  • 可以用于定义模块或控制器的URL路径。
  • 可以和方法级别上的@RequestMapping注解一起使用,形成完整的URL路径。

方法级别上的@RequestMapping注解:

  • 用于指定处理请求的方法的URL路径。
  • 可以指定请求的HTTP方法(GET、POST、PUT、DELETE等)。
  • 可以指定请求的参数、请求头、请求体等条件。
  • 可以指定请求的响应类型、响应头等

常用的属性包括:

  • value:指定请求的URI路径,可以是一个字符串数组,支持Ant风格的路径模式匹配。
  • method:指定请求的HTTP方法,可指定多个方法,如GET、POST、PUT等,默认为不限制。
  • params:指定请求的参数条件,可以通过请求参数的存在、值等进行判断。支持简单的比较操作,如"paramName"、“!paramName”、"paramName=paramValue"等。
  • headers:指定请求的HTTP头部信息条件,可以通过头部信息的存在、值等进行判断。
  • consumes:指定HTTP请求的Content-Type,限制请求的媒体类型,可指定多个值。
  • produces:指定HTTP响应的Content-Type,限制响应的媒体类型,可指定多个值。
  • path:与value属性作用相同,显式地指定请求的URI路径。
  • name:指定请求的名称,用于嵌套在Java 8的类定义中时。

例如,下面的示例代码展示了如何使用@RequestMapping注解:

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping(value = "/list", method = RequestMethod.GET)
    public String listUsers(Model model) {
        // 处理逻辑
        return "user-list";
    }

    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public String addUser(User user, Model model) {
        // 处理逻辑
        return "redirect:/user/list";
    }

}

在上面的代码中,@Controller注解标记UserController类为控制器类,@RequestMapping注解指定了该控制器类的根路径为"/user"。接着,在listUsers方法上使用@RequestMapping注解,指定了该方法处理以"/user/list"路径发起的GET请求;在addUser方法上使用@RequestMapping注解,指定了该方法处理以"/user/add"路径发起的POST请求。

关于带斜杠和不带斜杠的区别,一般来说,@RequestMapping中的路径值如果以斜杠开头,表示该路径为绝对路径,即以Web应用程序的根目录为基础路径。例如:

@RequestMapping("/user")
public String getUser() {
    // ...
}

以上代码中,如果Web应用的根目录为 http://localhost:8080/myapp/,则请求 http://localhost:8080/myapp/user 可以被映射到 getUser() 方法上。如果请求 http://localhost:8080/user,则无法匹配成功。

如果 @RequestMapping 中的路径值不以斜杠开头,则表示该路径为相对路径,即以当前请求路径为基础路径。例如:

@RequestMapping("user")
public String getUser() {
    // ...
}

以上代码中,如果请求 http://localhost:8080/myapp/user,则可以被映射到 getUser() 方法上。如果请求 http://localhost:8080/myapp/user/abc,同样可以映射成功。这是因为 /myapp/user/abc 是相对于 /myapp/user 的。

需要注意的是,如果使用了Web容器的默认servlet处理静态资源,比如图片、CSS、JavaScript文件等,那么在有些情况下会出现带斜杠和不带斜杠的差异。一般来说,带斜杠的路径会被解释为请求DispatcherServlet中的控制器,而不带斜杠的路径会被解释为请求默认servlet中的静态资源。这种行为可以通过修改Servlet容器的配置来改变。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐