使用java的spring boot创建RESTful风格的服务端,并创建客户端程序。场景:用接口添加,获取所有学生姓名学号或者指定学生姓名学号,客户端添加学生信息并输出所有或指定学生信息
时间: 2023-12-18 11:02:52 浏览: 99
好的,这是一个比较常见的应用场景。下面我简单介绍一下如何使用Java的Spring Boot框架创建RESTful风格的服务端,并创建对应的客户端程序。
## 创建服务端
### 1. 创建Spring Boot项目
首先,我们需要在IDE中创建一个Spring Boot项目。可以使用Maven或Gradle构建工具,这里以Maven为例。在pom.xml文件中添加以下依赖:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 数据库相关依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
```
这里使用了Spring Boot内置的Web框架和H2数据库。如果需要使用其他Web框架或数据库,可以根据需要进行调整。
### 2. 创建实体类和数据访问接口
在src/main/java目录下创建一个名为`com.example.demo`的包,并在该包下创建一个名为`Student`的实体类:
```java
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private String number;
// 省略getter和setter方法
}
```
这里使用了JPA注解来定义实体类和数据库表之间的映射关系。`@Id`注解表示该字段为主键,`@GeneratedValue`表示主键自动生成。
接下来,在同一个包下创建一个名为`StudentRepository`的接口:
```java
public interface StudentRepository extends JpaRepository<Student, Long> {
List<Student> findByName(String name);
List<Student> findByNumber(String number);
}
```
这里使用了Spring Data JPA框架来访问数据库。`JpaRepository`是一个泛型接口,用于定义通用的CRUD操作。我们可以在该接口中定义自己的查询方法。
### 3. 创建控制器
在同一个包下创建一个名为`StudentController`的控制器类:
```java
@RestController
@RequestMapping("/students")
public class StudentController {
private final StudentRepository studentRepository;
public StudentController(StudentRepository studentRepository) {
this.studentRepository = studentRepository;
}
@PostMapping("/")
public Student create(@RequestBody Student student) {
return studentRepository.save(student);
}
@GetMapping("/")
public List<Student> getAll() {
return studentRepository.findAll();
}
@GetMapping("/name/{name}")
public List<Student> getByName(@PathVariable String name) {
return studentRepository.findByName(name);
}
@GetMapping("/number/{number}")
public List<Student> getByNumber(@PathVariable String number) {
return studentRepository.findByNumber(number);
}
}
```
这里使用了`@RestController`注解来标识该类为控制器,并使用`@RequestMapping`注解来定义路由前缀。
`@PostMapping`注解表示该方法为处理POST请求的方法,`@RequestBody`注解表示该方法接收一个JSON格式的请求体,并将其转换为`Student`对象。
`@GetMapping`注解表示该方法为处理GET请求的方法,`@PathVariable`注解表示该方法接收一个路径参数。
### 4. 配置数据库连接
在`application.properties`文件中添加以下配置:
```
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true
```
这里使用了H2内存数据库,并启用了H2控制台。
### 5. 运行服务端
运行项目,访问`http://localhost:8080/h2-console`即可打开H2控制台。可以使用以下语句创建表并插入数据:
```sql
CREATE TABLE student (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
number VARCHAR(255)
);
INSERT INTO student (name, number) VALUES ('张三', '001');
INSERT INTO student (name, number) VALUES ('李四', '002');
INSERT INTO student (name, number) VALUES ('王五', '003');
```
然后,可以使用Postman等工具测试接口是否正常工作。
## 创建客户端程序
### 1. 添加依赖
在pom.xml文件中添加以下依赖:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- JSON解析依赖 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
```
这里使用了Spring Boot内置的Web框架和Jackson库来处理JSON格式的数据。
### 2. 创建实体类
在src/main/java目录下创建一个名为`com.example.demo`的包,并在该包下创建一个名为`Student`的实体类:
```java
public class Student {
private Long id;
private String name;
private String number;
// 省略getter和setter方法
}
```
这里与服务端的实体类相同。
### 3. 创建客户端类
在同一个包下创建一个名为`StudentClient`的类:
```java
public class StudentClient {
private final RestTemplate restTemplate;
private final String baseUrl;
public StudentClient(RestTemplate restTemplate, String baseUrl) {
this.restTemplate = restTemplate;
this.baseUrl = baseUrl;
}
public List<Student> getAll() {
String url = baseUrl + "/students/";
ResponseEntity<List<Student>> response = restTemplate.exchange(url, HttpMethod.GET, null, new ParameterizedTypeReference<List<Student>>() {});
return response.getBody();
}
public List<Student> getByName(String name) {
String url = baseUrl + "/students/name/" + name;
ResponseEntity<List<Student>> response = restTemplate.exchange(url, HttpMethod.GET, null, new ParameterizedTypeReference<List<Student>>() {});
return response.getBody();
}
public List<Student> getByNumber(String number) {
String url = baseUrl + "/students/number/" + number;
ResponseEntity<List<Student>> response = restTemplate.exchange(url, HttpMethod.GET, null, new ParameterizedTypeReference<List<Student>>() {});
return response.getBody();
}
public Student create(Student student) {
String url = baseUrl + "/students/";
return restTemplate.postForObject(url, student, Student.class);
}
}
```
这里使用了`RestTemplate`来发送HTTP请求,并使用Jackson库来解析JSON格式的响应数据。需要注意的是,`exchange`方法用于处理返回类型为List的情况。
### 4. 使用客户端类
在main方法中使用`StudentClient`类来调用服务端的接口:
```java
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
RestTemplate restTemplate = new RestTemplate();
String baseUrl = "http://localhost:8080";
StudentClient studentClient = new StudentClient(restTemplate, baseUrl);
// 添加学生信息
Student student1 = new Student();
student1.setName("张三");
student1.setNumber("001");
studentClient.create(student1);
Student student2 = new Student();
student2.setName("李四");
student2.setNumber("002");
studentClient.create(student2);
Student student3 = new Student();
student3.setName("王五");
student3.setNumber("003");
studentClient.create(student3);
// 获取所有学生信息
List<Student> students1 = studentClient.getAll();
System.out.println(students1);
// 获取指定姓名的学生信息
List<Student> students2 = studentClient.getByName("张三");
System.out.println(students2);
// 获取指定学号的学生信息
List<Student> students3 = studentClient.getByNumber("002");
System.out.println(students3);
}
}
```
运行程序,即可测试客户端与服务端的交互是否正常。
阅读全文