在 Spring 引导中访问静态 HTML 时找不到 404

404 Not Found when accessing static HTML in Spring Boot

我一直在尝试参考 Spring 的指南(这对没有经验的我来说并没有太大用处,无法完整完成此特定任务)来创建一个简单的玩具示例:处理表单作为 POST 请求提交并显示结果。

更新:添加了ViewConfiguration class - 请参阅问题底部以获取更多信息。

这是我的项目结构:

src
 |  main
 |   |  java
 |   |   |  controllers
 |   |   |   |  BasicController.java
 |   |   |   |  RestfulController.java
 |   |   |  Application.java
 |   |   |  ViewConfiguration.java
 |   |  resources
 |   |   |  static
 |   |   |   |  form.html

我的代码如下:

@SpringBootApplication
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}

@Controller
public class BasicController {
  @RequestMapping("/")
  public String greeting() {
    return "form";
  }
}

@RestController
public class RestfulController {
  @RequestMapping(value="/result", method=RequestMethod.POST)
  public String parseForm(@RequestParam String name) {
    return name;
  }
}

@Configuration
public class ViewConfiguration extends WebMvcConfigurerAdapter {
  @Bean
  public UrlBasedViewResolver urlBasedViewResolver() {
    UrlBasedViewResolver resolver = new urlBasedViewResolver();
    resolver.setPrefix("/static");
    resolver.setSuffix(".html");
    resolver.setCache(false);
    return resolver;
  }
}

对于form.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Form</title>
  </head>
  <body>
    <form action="result" method="post">
      Name: <input type="text" name="name">
      <br><br>
      <input type="submit" value="Submit">
    </form>
  </body>
</html>

当我在 Eclipse 中 运行 作为 Java 应用程序时, URL http://localhost:8080/ 仅产生 HTTP 404 Not Found 错误。我已经为 greeting() 尝试了以下所有 return 值但没有成功:

我有一个预先存在的应用程序,当我提交硬编码 URL 时,它可以正确处理 GET 请求。但是,我需要改用 POST 。据我所知,这无法通过硬编码 URL 进行测试 - 它必须通过表单提交来完成。到目前为止,我无法复制我在 GET 版本上取得的早期成功。

更新:按照下面答案中的建议,我添加了一个视图解析器,但没有使用像百里香这样的第三方视图解析器,而是创建了一个基本的自定义视图解析器,如上所示.

目前,我收到了IllegalArgumentException: Property 'viewClass' is required

我能找到的所有在线教程都使用 resolver.setViewClass(JstlView.class);,但由于我几乎所有的视图都是静态 .html 页面,我不确定我是否应该使用 JstlView。从上面也很清楚,我也不能把它留空。

我应该将 viewClass 设置为什么?目前我的代码中还有其他错误吗?最终,我该如何让它发挥作用?

由于您没有指定任何其他 ViewResolver,因此没有人会检查 /src/resources/... 中的观看次数。 要做到这一点,你应该指定一个 ViewResolver,或者让 Spring Boot 来注册它。为此,您只需将 Spring Boot Starter Thymeleaf 包含到您的项目中即可。此启动器具有 ViewResolver 定义,用于检查资源目录中的视图。

也尝试在 /resources/templates/ 目录中添加一个视图。

最终发现主要问题是由于我的项目class路径(在 Eclipse 中设置为 /src/)与大多数在线教程中使用的路径不同(/src/main/ ).所以最终结果如下:

src
 |  main
 |   |  java
 |   |   |  controllers
 |   |   |   |  BasicController.java
 |   |   |   |  RestfulController.java
 |   |   |  Application.java
 |  META-INF
 |   |  resources
 |   |   |  form.html

@Controller
public class BasicController {
  @RequestMapping("/")
  public String greeting() {
    return "form.html";
  }
}

@RestController
public class RestfulController {
  @PostMapping("/result")
  public String parseForm(@RequestParam String name) {
    return name;
  }
}

ViewConfiguration class 是不必要的,因此被删除。