java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring MVC映射HTTP到Controller

Spring MVC映射HTTP请求到Controller的处理方法

作者:冰糖心书房

我们来详细分析一下如何在 Spring MVC 中将 HTTP 请求映射到 Controller 的处理方法(Handler Methods)上,以及 @RequestMapping 注解的使用方法,需要的朋友可以参考下

请求映射的核心:@RequestMapping 注解

@RequestMapping 是 Spring MVC 中最核心、最通用的映射注解。它可以用于类级别(Class-level)和方法级别(Method-level)。

  1. 类级别映射 (Class-level Mapping):

    • 当 @RequestMapping 应用在类上时,它定义了Controller 处理所有请求的基类URL 路径。
    • 这样可以避免在每个方法上添加重复相同的路径前缀。
  2. 方法级别映射 (Method-level Mapping):

    • 当 @RequestMapping 应用在方法上时,它指定了该方法具体处理哪个(或哪些)URL 路径的请求。
    • 这个路径是相对于类级别路径的(如果存在的话)。

@RequestMapping 的主要属性:

示例:使用 @RequestMapping

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.http.MediaType;

@Controller
@RequestMapping("/users") // 类级别映射,所有方法都在 /users 路径下
public class UserController {

    // 映射 GET /users/{id}
    @RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody // 如果用 @Controller 需要加这个来返回数据
    public User getUser(@PathVariable Long id) {
        // ... 获取用户逻辑 ...
        return new User(id, "Example User");
    }

    // 映射 POST /users
    @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public String createUser(@RequestBody User newUser) {
        // ... 创建用户逻辑 ...
        return "User created";
    }

    // 映射 GET /users?admin=true (需要 admin 参数)
    @RequestMapping(method = RequestMethod.GET, params = "admin=true")
    @ResponseBody
    public String getAdminUsers() {
        // ... 获取管理员用户列表 ...
        return "List of Admin Users";
    }

    // 映射 GET /users (只接受 JSON 请求)
    @RequestMapping(method = RequestMethod.GET, headers = "Accept=application/json")
    @ResponseBody
    public String getUsersAcceptingJson() {
        // ... 获取用户列表 ...
        return "List of Users (JSON requested)";
    }
}

@RequestMapping 的变体 (快捷方式注解)

为了提高代码的可读性和简洁性,Spring 提供了针对特定 HTTP 方法的快捷方式注解。它们本质上是 @RequestMapping 预设了 method 属性的别名。

这些快捷注解也支持 @RequestMapping 的 value/pathparamsheadersconsumesproduces 属性。

使用快捷方式注解的优点:

示例:使用快捷方式注解 (@RestController 简化)

import org.springframework.web.bind.annotation.*;
import org.springframework.http.MediaType;

@RestController // 使用 @RestController,无需在每个方法上加 @ResponseBody
@RequestMapping("/api/items") // 类级别映射
public class ItemController {

    // 映射 GET /api/items/{itemId}
    // produces 也可直接写字符串
    @GetMapping(value = "/{itemId}", produces = MediaType.APPLICATION_JSON_VALUE)
    public Item getItem(@PathVariable String itemId) {
        // ... 获取物品逻辑 ...
        return new Item(itemId, "Sample Item");
    }

    // 映射 POST /api/items
    // consumes 可以指定多个
    @PostMapping(consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE})
    public String createItem(@RequestBody Item newItem) {
        // ... 创建物品逻辑 ...
        return "Item created: " + newItem.getName();
    }

    // 映射 PUT /api/items/{itemId}
    @PutMapping("/{itemId}")
    public Item updateItem(@PathVariable String itemId, @RequestBody Item updatedItem) {
        // ... 更新物品逻辑 ...
        updatedItem.setId(itemId); // 假设更新成功
        return updatedItem;
    }

    // 映射 DELETE /api/items/{itemId}
    @DeleteMapping("/{itemId}")
    public String deleteItem(@PathVariable String itemId) {
        // ... 删除物品逻辑 ...
        return "Item deleted: " + itemId;
    }

    // 映射 GET /api/items?type=gadget
    @GetMapping(params = "type=gadget")
    public String getGadgets() {
        return "List of Gadgets";
    }

    // 映射 GET /api/items (需要特定 Header)
    @GetMapping(headers = "X-API-Version=2")
    public String getItemsV2() {
        return "List of Items (API V2)";
    }
}

// 示例 Pojo
class Item {
    private String id;
    private String name;
    // constructors, getters, setters...
    public Item(String id, String name) { this.id = id; this.name = name; }
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
}

class User {
    private Long id;
    private String username;
    // constructors, getters, setters...
    public User(Long id, String username) { this.id = id; this.username = username; }
    public Long getId() { return id; }
    public String getUsername() { return username; }
}

总结

以上就是Spring MVC映射HTTP请求到Controller的处理方法的详细内容,更多关于Spring MVC映射HTTP到Controller的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文