Spring引导如何与静态内容一起使用?

时间:2017-01-15 12:19:05

标签: angularjs spring spring-mvc spring-boot

我有简单的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文件和页面加载。我无法理解弹簧启动如何与静态内容一起解释?

3 个答案:

答案 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)并且不想使用散列位置路由(#),这通常是您想要的。