学习目标
第9~10章完成了功能的改造升级工作(如果没有了解可以去我主页看看 第一至十章的内容来学习)本章将继续对用户管理模块的其他功能进行改造,帮助同学们学习并掌握Spring MVC框架的文件上传功能,了解REST风格及JSR 303 数据验证框架等技术。
11.1 系统增、查、改功能
增加、查询、删除(本章不涉及)、修改是Web项目的基本功能,也是开发人员涉及最多的工作。本节使用SpringMVC框架对用户模块进行升级改造。
11.1.1改造添加功能
从用户添加功能入手,主要工作是替换控制层的实现技术,Spring MVC框架提供了接收对象入参的功能,可以直接把前端传入的参数封装到对应对象中,非常方便。
改造Java代码以添加新功能通常涉及几个关键步骤,包括需求分析、设计、编码、测试和部署。这里,我将给出一个简化的示例,说明如何在一个现有的Java类中添加一个新功能。
假设的场景
假设我们有一个简单的Calculator类,它目前支持加法和减法操作。我们的任务是给它添加一个新的功能:乘法。
现有的Calculator类
public class Calculator {
// 加法
public int add(int a, int b) {
return a + b;
}
// 减法
public int subtract(int a, int b) {
return a - b;
}
// 这里我们将添加乘法
}
添加乘法功能
- 分析需求: 需要添加一个方法,该方法接受两个整数参数并返回它们的乘积。
- 设计: 在Calculator类中增加一个名为multiply的方法。
- 编码:
public class Calculator {
// 加法
public int add(int a, int b) {
return a + b;
}
// 减法
public int subtract(int a, int b) {
return a - b;
}
// 新增乘法
public int multiply(int a, int b) {
return a * b;
}
// 可以在这里继续添加其他功能
}
- 测试: 编写单元测试来验证新添加的multiply方法是否按预期工作。
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class CalculatorTest {
@Test
public void testMultiply() {
Calculator calc = new Calculator();
assertEquals(6, calc.multiply(2, 3), "2 * 3 should be 6");
}
// 可以添加更多测试来验证其他方法
}
- 将修改后的代码部署到生产环境(对于小型项目或学习项目,这可能意味着简单地重新编译并运行你的程序)。
注意事项
- 代码审查: 在提交更改之前,请确保进行代码审查,以确保新添加的功能符合项目标准和最佳实践。
- 文档更新: 更新相关的开发文档和用户文档,以反映新的功能。
- 版本控制: 使用版本控制系统(如Git)跟踪你的更改,并确保你的更改被正确提交到存储库。
- 测试覆盖率: 尽量为新的和现有的功能编写足够的测试用例,以确保代码的稳定性和可靠性。
通过遵循上述步骤,你可以有效地在Java项目中添加新功能。
11.1.2 改造查询功能(REST 风格)
用户添加功能改造完成之后,接着改造查询详情功能。在此之前,先来了解一个比较流行的API开发规范——REST。
改造REST风格的查询功能通常意味着你正在开发一个基于RESTful API的Web服务,并且需要更新或优化该服务中的查询功能。RESTful API通过HTTP请求(如GET、POST、PUT、DELETE)来操作资源,并使用无状态通信,即每个请求都应该包含执行该请求所需的所有信息。
以下是一个简化的例子,说明如何改造一个基于Spring Boot的RESTful API中的查询功能。我们将从一个简单的Book资源开始,然后添加或修改一个查询Book的端点。
假设的Book资源
首先,我们有一个Book实体类和一个BookRepository接口(使用Spring Data JPA):
// Book.java
@Entity
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String author;
// 省略getter和setter
}
// BookRepository.java
public interface BookRepository extends JpaRepository<Book, Long> {
// 这里可以添加一些特定查询,例如根据作者查询
List<Book> findByAuthor(String author);
}
原始的REST Controller
我们可能已经有了一个基础的REST Controller来处理对Book资源的请求:
// BookController.java
@RestController
@RequestMapping("/books")
public class BookController {
@Autowired
private BookRepository bookRepository;
// 获取所有书籍
@GetMapping
public List<Book> getAllBooks() {
return bookRepository.findAll();
}
// 添加改造的查询功能
// ...
}
改造查询功能
现在,我们要在BookController中添加一个新的端点,以便可以通过作者名来查询书籍。我们将使用@GetMapping注解来定义这个新的端点,并使用查询参数来传递作者名。
// 在BookController.java中添加
// 根据作者名查询书籍
@GetMapping("/by-author")
public List<Book> getBooksByAuthor(@RequestParam String author) {
return bookRepository.findByAuthor(author);
}
这个新的端点/books/by-author将接受一个名为author的查询参数,并使用BookRepository中的findByAuthor方法来查询和返回具有该作者名的所有书籍。
测试改造后的查询功能
为了确保新的查询功能按预期工作,你应该编写单元测试或集成测试。然而,在这个简单的示例中,我们可以通过发送HTTP GET请求到/books/by-author?author=某作者名来手动测试它。
注意事项
- 安全性: 在生产环境中,你可能需要确保这个查询功能是安全的,例如通过验证用户身份、限制可查询的作者等。
- 分页和排序: