在 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 值但没有成功:
- 表格
- form.html
- /表格
- /form.html
- /static/form
- /static/form.html
- /资源/static/form
- /资源/static/form.html
我有一个预先存在的应用程序,当我提交硬编码 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 是不必要的,因此被删除。
我一直在尝试参考 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 值但没有成功:
- 表格
- form.html
- /表格
- /form.html
- /static/form
- /static/form.html
- /资源/static/form
- /资源/static/form.html
我有一个预先存在的应用程序,当我提交硬编码 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 是不必要的,因此被删除。