进入正文
1.文件目录
1. Chapter21Application.java
地址:chapter2-1/src/main/java/com/didispace/chapter21/Chapter21Application.java
package com.didispace.chapter21;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Chapter21Application {
public static void main(String[] args) {
SpringApplication.run(Chapter21Application.class, args);
}
}
2. User.java
地址:chapter2-1/src/main/java/com/didispace/chapter21/User.java
package com.didispace.chapter21;
import lombok.Data;
@Data
public class User {
private Long id;
private String name;
private int age;
public User(Long id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
// Getter and Setter methods
// 略...
}
这段代码是一个简单的 Java 类定义,使用了 Lombok 库中的 @Data
注解,用于自动生成 getter、setter 和 toString
等方法。这个类定义了一个 User
类,包含了三个字段:id
、name
和 age
,分别表示用户的唯一标识、姓名和年龄。
在 Java 中,通常需要为类的每个字段手动编写 getter 和 setter 方法以及 toString
方法来实现类的基本功能,但是使用 Lombok 的 @Data
注解可以自动帮助生成这些方法,从而简化了代码编写过程。
下面是这段代码的详细解释:
-
package com.didispace.chapter21;
:这行代码定义了类的包路径,即User
类所属的包名为com.didispace.chapter21
。包路径用于组织类,以便在不同的类之间进行引用和管理。 -
import lombok.Data;
:这行代码导入了 Lombok 库中的@Data
注解。通过导入该注解,我们可以在User
类上使用@Data
注解来自动生成 getter、setter 和toString
方法。 -
@Data
:这个注解是 Lombok 提供的,用于在编译时自动生成 getter、setter、equals、hashCode 和toString
等方法。在User
类上添加了@Data
注解后,就不需要手动编写这些方法了,Lombok 会在编译时自动生成。 -
public class User {
:这行代码定义了一个公共的User
类。在 Java 中,类通常被定义为公共的(即public
),以便在其他包中可以访问到该类。 -
private Long id;
、private String name;
、private Integer age;
:这三行代码定义了User
类的三个私有字段,分别是id
、name
和age
。这些字段被声明为私有的(即private
),意味着它们只能在User
类的内部访问,外部无法直接访问这些字段。 -
}
:这行代码表示类定义的结束。
总的来说,这段代码定义了一个简单的 Java 类 User
,通过使用 Lombok 的 @Data
注解简化了 getter、setter 和 toString
方法的编写,使得代码更加简洁和易读。
3. UserController.java
地址:chapter2-1/src/main/java/com/didispace/chapter21/UserController.java
package com.didispace.chapter21;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@RestController
@RequestMapping(value = "/users") // 通过这里配置使下面的映射都在/users下
public class UserController {
// 创建线程安全的Map,模拟users信息的存储
static Map<Long, User> users = Collections.synchronizedMap(new HashMap<Long, User>());
static {
User user1 = new User(1566L, "Alice", 25);
User user2 = new User(2L, "Bob", 30);
User user3 = new User(3L, "Charlie", 35);
users.put(user1.getId(), user1);
users.put(user2.getId(), user2);
users.put(user3.getId(), user3);
}
/**
* 处理"/users/"的GET请求,用来获取用户列表
*
* @return
*/
@GetMapping("/")
public List<User> getUserList() {
// 还可以通过@RequestParam从页面中传递参数来进行查询条件或者翻页信息的传递
List<User> r = new ArrayList<User>(users.values());
return r;
}
/**
* 处理"/users/"的POST请求,用来创建User
*
* @param user
* @return
*/
@PostMapping("/")
public String postUser(@RequestBody User user) {
// @RequestBody注解用来绑定通过http请求中application/json类型上传的数据
users.put(user.getId(), user);
return "success";
}
/**
* 处理"/users/{id}"的GET请求,用来获取url中id值的User信息
*
* @param id
* @return
*/
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
// url中的id可通过@PathVariable绑定到函数的参数中
return users.get(id);
}
/**
* 处理"/users/{id}"的PUT请求,用来更新User信息
*
* @param id
* @param user
* @return
*/
@PutMapping("/{id}")
public String putUser(@PathVariable Long id, @RequestBody User user) {
User u = users.get(id);
u.setName(user.getName());
u.setAge(user.getAge());
users.put(id, u);
return "success";
}
/**
* 处理"/users/{id}"的DELETE请求,用来删除User
*
* @param id
* @return
*/
@DeleteMapping("/{id}")
public String deleteUser(@PathVariable Long id) {
users.remove(id);
return "success";
}
}
解释:
这段代码是一个基于Spring框架的RESTful风格的API示例,用于管理用户信息。让我逐步解释每个部分的功能和作用:
-
package com.didispace.chapter21;
:这行代码定义了类的包路径,即UserController
类所属的包名为com.didispace.chapter21
。包路径用于组织类,以便在不同的类之间进行引用和管理。 -
import org.springframework.web.bind.annotation.*;
:这行代码导入了Spring框架中用于处理HTTP请求的注解,包括@RestController
、@RequestMapping
、@GetMapping
、@PostMapping
、@PutMapping
和@DeleteMapping
。这些注解用于定义RESTful API的请求映射和处理方法。 -
@RestController
:这个注解标注在类上,表示该类是一个RESTful风格的控制器,可以处理HTTP请求并返回RESTful风格的响应。 -
@RequestMapping(value = "/users")
:这个注解用于映射HTTP请求的URL路径,指定了处理该控制器的请求路径为/users
。因为在类级别上使用了这个注解,所以下面所有的请求映射路径都相对于/users
。 -
public class UserController {
:这行代码定义了一个公共的UserController
类。在Spring框架中,控制器类通常被定义为公共的(即public
),以便可以被其他类和组件引用。 -
static Map<Long, User> users = Collections.synchronizedMap(new HashMap<Long, User>());
:这行代码定义了一个静态的Map
对象users
,用于存储用户信息。这里使用了Collections.synchronizedMap
方法创建了一个线程安全的Map
,以确保在多线程环境下对用户信息的操作是安全的。
接下来是几个请求处理方法,它们分别处理不同的HTTP请求:
-
@GetMapping("/")
:处理GET请求,用来获取用户列表。使用@GetMapping
注解将该方法映射到处理/users/
路径的GET请求,并通过List<User>
类型的返回值返回用户列表。 -
@PostMapping("/")
:处理POST请求,用来创建新用户。使用@PostMapping
注解将该方法映射到处理/users/
路径的POST请求,并通过@RequestBody
注解从请求体中获取用户信息,并将用户信息添加到users
Map 中。 -
@GetMapping("/{id}")
:处理GET请求,用来获取指定ID用户的信息。使用@GetMapping
注解将该方法映射到处理/users/{id}
路径的GET请求,并通过@PathVariable
注解将URL中的id
参数绑定到方法的参数中,然后根据id
从users
Map 中获取对应的用户信息并返回。 -
@PutMapping("/{id}")
:处理PUT请求,用来更新指定ID用户的信息。使用@PutMapping
注解将该方法映射到处理/users/{id}
路径的PUT请求,并通过@PathVariable
注解将URL中的id
参数绑定到方法的参数中,通过@RequestBody
注解从请求体中获取新的用户信息,并更新users
Map 中对应ID的用户信息。 -
@DeleteMapping("/{id}")
:处理DELETE请求,用来删除指定ID用户。使用@DeleteMapping
注解将该方法映射到处理/users/{id}
路径的DELETE请求,并通过@PathVariable
注解将URL中的id
参数绑定到方法的参数中,然后从users
Map 中删除对应ID的用户信息。
总的来说,这段代码实现了一个简单的用户管理系统,通过HTTP请求来实现对用户信息的增删改查操作,符合RESTful风格的API设计原则。