小明:老张,我最近在做学校的服务大厅门户项目,感觉后端部分有点难搞,你有经验吗?
老张:当然有。服务大厅门户的核心就是为学生提供一个统一的入口,处理各种事务,比如选课、成绩查询、请假申请等。后端是关键,得用好技术来支撑。
小明:那后端应该用什么框架呢?我听说Spring Boot挺流行的。
老张:没错,Spring Boot非常适合做微服务架构。它能快速搭建项目,而且整合了很多工具,比如数据库连接、安全控制、REST API等。
小明:那你能给我看看具体怎么写吗?比如如何创建一个学生信息的接口?
老张:当然可以。我们先从一个简单的例子开始。假设我们要创建一个获取学生信息的接口,可以通过GET请求来实现。
小明:好的,那代码应该怎么写?
老张:首先,我们需要定义一个实体类Student,用来映射数据库中的学生表。
小明:实体类?那是什么意思?
老张:实体类就是用来表示数据库中的一条记录。比如学生表可能包含学号、姓名、专业等字段,那么实体类就可以这样写:
public class Student {
private String studentId;
private String name;
private String major;
// 构造函数、getter和setter
}
小明:明白了,那接下来是不是要写一个Controller来处理请求?
老张:对的。我们可以用@RestController注解来创建一个RESTful API。
小明:那这个Controller怎么和数据库交互呢?
老张:我们需要用Spring Data JPA来操作数据库。首先,定义一个Repository接口,继承JpaRepository。
小明:那具体的代码是怎样的?
老张:我们来看一个例子:
public interface StudentRepository extends JpaRepository {
Student findByStudentId(String studentId);
}
小明:哦,这样就能根据学号查询学生信息了。
老张:没错。然后在Controller里调用这个方法:
@RestController
@RequestMapping("/api/students")
public class StudentController {
@Autowired
private StudentRepository studentRepository;
@GetMapping("/{studentId}")
public ResponseEntity getStudentById(@PathVariable String studentId) {
Student student = studentRepository.findByStudentId(studentId);
if (student == null) {
return ResponseEntity.notFound().build();
}
return ResponseEntity.ok(student);
}
}
小明:这看起来很清晰,不过如果我要添加学生信息呢?
老张:那可以用POST方法。同样在Controller中添加一个方法:
@PostMapping("/")
public ResponseEntity createStudent(@RequestBody Student student) {
Student savedStudent = studentRepository.save(student);
return ResponseEntity.status(HttpStatus.CREATED).body(savedStudent);
}
小明:那这个@RequestBody是什么意思?
老张:它表示请求体中的数据会被自动转换成Student对象。这样我们就不用手动解析JSON了。
小明:明白了,那如果我要更新学生信息呢?
老张:可以用PUT方法,比如根据学号更新学生的专业信息:
@PutMapping("/{studentId}")
public ResponseEntity updateStudent(@PathVariable String studentId, @RequestBody Student updatedStudent) {
Student existingStudent = studentRepository.findByStudentId(studentId);
if (existingStudent == null) {
return ResponseEntity.notFound().build();
}
existingStudent.setMajor(updatedStudent.getMajor());
Student savedStudent = studentRepository.save(existingStudent);
return ResponseEntity.ok(savedStudent);
}
小明:那删除功能呢?
老张:可以用DELETE方法,比如根据学号删除学生:
@DeleteMapping("/{studentId}")
public ResponseEntity deleteStudent(@PathVariable String studentId) {
Student student = studentRepository.findByStudentId(studentId);
if (student == null) {
return ResponseEntity.notFound().build();
}
studentRepository.delete(student);
return ResponseEntity.noContent().build();
}
小明:看来后端的逻辑已经很完整了。那这些接口怎么和前端对接呢?
老张:前端通常会使用AJAX或者Fetch API来调用这些RESTful接口。例如,前端可以发送GET请求获取学生信息,或者发送POST请求添加新学生。

小明:那有没有安全方面的考虑?比如权限验证?
老张:当然有。我们可以使用Spring Security来保护这些接口。比如,设置只有登录的学生才能访问某些资源。
小明:那具体怎么实现呢?
老张:我们可以配置一个简单的基于内存的用户认证,或者连接数据库进行更复杂的权限管理。
小明:那能不能举个例子?
老张:当然可以。比如,在application.properties中配置以下内容:
spring.security.user.name=admin
spring.security.user.password=123456
spring.security.user.roles=USER
小明:这样就启用了基本认证?
老张:是的。然后在Controller上加上@PreAuthorize注解,比如只允许有USER角色的用户访问:
@PreAuthorize("hasRole('USER')")
@GetMapping("/{studentId}")
public ResponseEntity getStudentById(@PathVariable String studentId) {
...
}
小明:这样就能控制权限了,听起来很实用。
老张:没错。另外,还可以使用JWT(JSON Web Token)来实现无状态的认证,这样更适合分布式系统。
小明:那JWT是怎么工作的?
老张:JWT是一种令牌机制,用户登录后,服务器生成一个令牌并返回给客户端。客户端后续请求时带上这个令牌,服务器验证令牌的有效性。
小明:那这个过程需要哪些步骤?
老张:大致分为三步:用户登录,服务器生成JWT,客户端保存并携带令牌访问受保护的资源。
小明:那具体怎么实现呢?
老张:我们可以用Spring Security和JWT库来实现。比如,添加依赖,配置过滤器,拦截请求并验证令牌。
小明:看来后端开发确实有很多细节需要注意。
老张:是的,但只要一步步来,就能做好。服务大厅门户的后端系统虽然复杂,但只要用好Spring Boot和相关技术,就能高效地完成。
小明:谢谢你,老张,我学到了很多!
老张:不客气,有问题随时问我。
