使用@Controller 显示 index.html 页面 |弹簧靴
Posted
技术标签:
【中文标题】使用@Controller 显示 index.html 页面 |弹簧靴【英文标题】:Displaying index.html page using @Controller | Spring Boot 【发布时间】:2018-07-12 12:49:19 【问题描述】:在显示我创建的 index.html 网页时遇到问题。我在前往 localhost:8080 时不断收到的输出是字符串值“index”,而不是网页本身。 /templates 目录的图像和来自 localhost 的结果可以在下面找到(超链接)
@Controller
public class IndexController
@RequestMapping("/")
@ResponseBody
public String index()
return "index";
template_directory localhost:8080_result
【问题讨论】:
尝试注释掉响应正文 【参考方案1】:如果您不使用 thyemleaf 之类的模板引擎,则必须将 ui 文件放入名为 /public
、/static
或 /resources
的 /src/main/resources
的子文件夹中。你的index.html
放入/src/main/resources/public/index.html
控制器:
@Controller
public class IndexController
@RequestMapping("/")
public String index()
return "index.html";
【讨论】:
【参考方案2】:从控制器方法 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
和 @ResponseBody
together 的组合。
【讨论】:
您能举例说明您的意思吗? @YuriKhechoyan 我更新了我的答案。我希望它可以帮助您了解差异【参考方案3】: @RequestMapping("/")
@ResponseBody
public String index()
return "index";
删除@ResponseBody。
@RequestBody 和@ResponseBody 注解用于将HTTP 请求/响应主体与方法参数或返回类型中的对象绑定。
@ResponseBody : Spring 会将返回值绑定到传出的 HTTP 响应体。
例子
@RequestMapping(value = "/checkuser",
method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE )
@ResponseBody
public Boolean checkValidateUser(@RequestParam Map<String, String>
requestParams)
String userName = requestParams.get("username");
String password = requestParams.get("password");
return
userBL.checkValidateUser(userName.trim().toUpperCase(),password.trim());
图片在 src/main/resources/static/assets/images/ src/main/resources/templates中的html页面
@Controller
public class IndexController
@RequestMapping("/")
public String index()
return "index.html";
【讨论】:
【参考方案4】:就像其他人提到的那样,您需要做的第一件事是从控制器方法中删除 @ResponseBody
注释。
其次,将模板目录中的静态内容移至src/main/resources/static
。 templates
目录用于提供需要在服务器端呈现的内容(例如 Thymeleaf)。
然后,您可以直接从控制器提供内容。
@Controller
public class IndexController
@RequestMapping("/")
public String index()
return "index.html";
【讨论】:
以上是关于使用@Controller 显示 index.html 页面 |弹簧靴的主要内容,如果未能解决你的问题,请参考以下文章
使用相同的 View Controller 进行添加、显示和编辑
Activity View Controller 在新行中显示 URL
Xcode Table View Controller with Nav Controller 不显示表格单元格,而是处理单元格中的数据