从控制器方法 addNewBooking(...) 中删除 @ResponseBody。使用@ResponseBody,您告诉 Spring 将您的方法的结果映射到 HTTP 响应正文,因此您的浏览器将其显示为纯文本(如果您想使用 Spring 开发 RESTful API,则需要这个)。当您使用 Spring MVC 时,您希望返回一个视图,因此您不需要 @ResponseBody。
编辑 1:详细解释我写的内容。
使用Spring Web,您有两种选择来编写您的应用程序:
- 使用
JSPs、Thymeleaf templates、Freemaker templates -> Spring MVC 模式编写一个服务器端呈现的应用程序
- 编写一个 RESTful 后端,例如从 RESTful 后端获取数据的单页应用程序(如 ReactJs 或 Angular)
对于选择 1,您使用 @Controller 注释您的控制器并提供多个端点,您的 Spring 应用程序将使用您的服务器端渲染器模板进行响应。您的所有控制器都返回一个String,这是您要传输到浏览器的模板的名称。 Spring 将采用 String 名称,如 index 并将返回例如呈现给请求的index.jsp。一个示例可能如下所示:
@Controller
public class IndexController {
@RequestMapping("/")
public String index() {
return "index";
}
}
对于选项 2,您使用 @RestController OR 将 @Controller 和 @ResponseBody 一起注释您的控制器(技术上 @RestController 只是 @Controller 和`@ResponseBody 的组合)。通过这个设置,你告诉 Spring 使用你的控制器方法返回类型并解析它,例如将 Jackson 转换为 JSON,并将其放入 HTTP 正文中。如果您在浏览器中访问这样的端点,您会得到
对象的 JSON 表示。看下面的例子:
@RestController
public class IndexController {
@RequestMapping("/persons")
public List<Person> getPersons() {
// ... some service calls/database access to get all persons
return personList;
}
}
Person 类:
public class Person {
private String name;
private int age;
// getter and setter ...
}
如果您现在访问http://localhost:8080/persons,您可以获得以下输出:
[
{
"name": "John Doe",
"age": 1337
},
{
"name": "Peter Parker",
"age": 12
}
]
总结一下解释:如果您想提供视图(服务器端呈现的 HTML 页面),您必须使用 @Controller 并且您的控制器方法必须返回模板的名称。如果计划构建 RESTful 应用程序,请使用 @RestController 或 @Controller 和 @ResponseBodytogether 的组合。