我有简单的AngularJS单页面应用程序和后端的Spring Boot。我需要在不同的网址上返回index.html
。我创建了这种控制器:
@Controller
public class WebResourcesController {
@RequestMapping(value = "/sample")
public String sample() {
return "index";
}
}
但 localhost:8080/sample
的请求会返回 404 状态。当我将控制器更改为return "index.html";
时,我得到了正确的html文件和页面加载。我无法理解弹簧启动如何与静态内容一起解释?
答案 0 :(得分:1)
参考this discussion Spring Boot 文章,您可以看到您的内容是否位于任何提及的(文章中)目录结构中,它将自动加载。但正如你所说index
给出了神圣的 404
因为;
期望它由某些ViewResolver
处理,因为它只是一个 String
,它需要一个解析器告诉Spring容器每当资源是从特定的目录结构加载它应该作为一个View页面处理它并在浏览器上呈现它。
编码示例:
基于Java:
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
registry.viewResolver(viewResolver);
}
在扩展WebMvcConfigurerAdapter
的Config类中,并使用@Configuration
进行注释,因此它告诉Spring Container处理该String视图名称。
XML配置:
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix" value ="/WEB-INF/views/" />
<property name="suffix" value =".jsp" />
</bean>
希望,你很清楚。
答案 1 :(得分:1)
您还可以在application.properties
中简单地设置以下属性#spring.mvc.view.prefix=/html //folder where html files resides
spring.mvc.view.suffix=.html
答案 2 :(得分:1)
如果您想在控制器中提供视图,则必须确保 index.html 页面位于 src / main / resources / templates 文件夹中而不是在公共或静态文件夹中(用于提供静态HTML页面)。
现在你可以使用这样的映射制作一个控制器:
@RequestMapping("/**")
public String sample() {
return "index";
}
确保您的类路径中有 spring-boot-starter-thymeleaf 。这将确保视图引擎正确解析您的视图(在本例中为Thymeleaf)。
默认情况下,Thymeleaf以 HTML5 模式运行,因此应该没有问题,但是,它也希望标签也能正常关闭。如果您想拥有更多自由(例如,人们通常不会关闭<meta>
标签),您应该添加 nekohtml 依赖关系:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
</dependency>
您还应配置spring.thymeleaf.mode
:
spring.thymeleaf.mode=LEGACYHTML5
如果你这么做,你可以去任何路径,它会显示index.html页面。如果您编写单页应用程序(SPA)并且不想使用散列位置路由(#
),这通常是您想要的。