使用@Controller 显示 index.html 页面 | 弹簧靴

Yur*_*yan 6 html spring spring-mvc spring-boot

显示我创建的 index.html 网页时出现问题。转到 localhost:8080 时,我一直收到的输出是字符串值“index”,而不是网页本身。可以在下面找到 /templates 目录的图像和从 localhost 给出的结果(超链接)

@Controller
public class IndexController {

        @RequestMapping("/")
        @ResponseBody
        public String index() {
            return "index";
        }
}
Run Code Online (Sandbox Code Playgroud)

template_directory 本地主机:8080_result

rie*_*pil 8

@ResponseBody从您的控制器方法 addNewBooking(...) 中删除。随着@ResponseBody你告诉Spring您的方法的结果映射到HTTP响应主体等浏览器中显示它为纯文本(你需要这个,如果你想开发RESTful API中使用Spring)。当您使用 Spring MVC 时,您想要返回一个视图,因此您不需要@ResponseBody.

编辑 1:对我所写内容的详细解释。

有了Spring Web你有两个选择来写你的应用程序:

  • 使用JSPs, Thymeleaf templates, Freemaker templates->Spring MVC模式编写服务器端呈现的应用程序
  • 为例如从 RESTful 后端获取数据的单页应用程序(如 ReactJs 或 Angular)编写一个 RESTful 后端

对于选项 1,您使用@Controller多个端点对控制器进行注释,并提供多个端点,您的 Spring 应用程序将在这些端点上使用您的服务器端渲染器模板进行响应。您的所有控制器都返回 a String,这是您要传输到浏览器的模板的名称。Spring 将采用String类似的名称index,并将返回例如呈现index.jsp给请求。一个示例可能如下所示:

@Controller
public class IndexController {

        @RequestMapping("/")
        public String index() {
            return "index";
        }
}
Run Code Online (Sandbox Code Playgroud)

对于选择 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;
        }
} 
Run Code Online (Sandbox Code Playgroud)

人物类:

public class Person {
   private String name;
   private int age;

   // getter and setter ...

}
Run Code Online (Sandbox Code Playgroud)

如果您现在访问,http://localhost:8080/persons您可以获得以下输出:

[
  {
    "name": "John Doe",
    "age": 1337
  },
  {
    "name": "Peter Parker",
    "age": 12
  }
]
Run Code Online (Sandbox Code Playgroud)

总结一下解释:如果您想提供视图(服务器端呈现的 HTML 页面),您必须使用@Controller并且您的控制器方法必须返回模板的名称。如果计划建立一个RESTful应用程序,使用@RestController或组合@Controller@ResponseBody在一起。


iMa*_*kre 5

就像其他人提到的那样,您需要做的第一件事是@ResponseBody从控制器方法中删除注释。

其次,模板目录中的静态内容应移动到
src/main/resources/static. 该templates目录用于提供需要在服务器端呈现的内容(例如 Thymeleaf)。

然后,您可以直接从控制器提供内容。

@Controller
public class IndexController {

    @RequestMapping("/")
    public String index() {
        return "index.html";
    }
}
Run Code Online (Sandbox Code Playgroud)