我在另一篇文章中读到,如果后端框架使用 JSON 进行数据交换,则不需要模板引擎,因为模板引擎用于将检索到的数据呈现为客户端的 HTML。我从数据库中检索 JSON 对象,那么我可以将模板引擎排除在我的项目之外吗?
这部分是正确的。是的,Thymeleaf 等主要用于将数据呈现为 HTML。他们可以渲染任何文本数据,包括 JSON,但也有更适合这项工作的工具。另一方面,您如何将数据存储在数据库中或使用什么数据库并不重要。您不能只跳过渲染(序列化)响应,因此无论您如何存储它都无关紧要。重要的是您想要作为响应返回什么。对于 HTML Thymeleaf 甚至 JSP 都适合,但对于 JSON,您可能希望使用 Jackson 或 Gson。
您没有提到您将使用的技术,因此对于我的示例,我假设您打算使用 Spring Web MVC。让我们来看看“传统”控制器:
@Controller
public class GreetingController {
@GetMapping("/greeting")
public ModelAndView greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
return new ModelAndView("greeting", "greeting", new Greeting(name));
}
}
当您向“/greeting”发出 GET 请求时,Spring 将调用 greeting 并获取它返回的对象。在这种情况下,它包含模型(我们要渲染的数据)和视图(要使用的模板文件)。然后它会尝试找到一个视图(例如 greeting.html 或 greeting.jsp)并使用 Thymeleaf 之类的模板引擎(或任何其他配置)来呈现它(通常是 HTML)。
如果我们想返回 JSON 怎么办?在这种情况下,我们需要:
- 修改
greeting 以返回Greeting 实例而不是ModelAndView
- 使用
RestController 而不是Controller。这将告诉 Spring MVC 我们想要直接序列化返回为 JSON(或类似格式)的对象,而不是使用模板来执行此操作。
这是修改后的例子:
@RestController
public class GreetingController {
@GetMapping("/greeting")
public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
return new Greeting(name);
}
}
Spring MVC 仍然需要一些帮助来将 Greeting 实例序列化为 JSON。但是如果你使用 Spring Boot 和 web starter,你就不用担心了。它将包括杰克逊。
这绝不是详尽的答案。事实上,它跳过了很多细节,但我希望它仍然是有用的。如果你想使用 JSON 创建 REST API,这个Building a RESTful Web Service guide 是一个很好的起点。如果您按照从 Spring Initializr 开始的步骤进行操作,您将获得一个仅包含所需内容的项目设置(也许还有一些额外的内容,但我不会太担心)。