使用 Spring Boot 映射 html 资源

Posted

技术标签:

【中文标题】使用 Spring Boot 映射 html 资源【英文标题】:Mapping html resources using Spring Boot 【发布时间】:2017-03-10 14:01:25 【问题描述】:

我正在使用 Spring Boot 为我正在创建的站点创建 REST API。目前,要访问静态内容,我只需转到资源名称。例如,/index.html/dashboard.html。由于我使用的是 REST 控制器,因此无法将页面映射到某些 URL 结尾,并且由于我使用的是 Spring Boot,因此没有 web.xml 文件。 (例如,我想让/dashboard 显示dashboard.html 文件。)

我应该使用标准的 MVC @Controller 控制器来控制我的页面映射还是有更好的方法来做到这一点?

编辑

我目前可以通过在 URL 中输入文件名来访问静态内容。 (例如/index.html 将打开索引。)

我想知道的是如何重新映射静态内容。例如,如果我希望 /dashboard 显示 dashboard.html 或者如果我希望 /error 显示 /error.html 等等......它会让用户更容易/更轻松地直接转到 www.mydomain.com/dashboard 而不是必须添加 .html 结尾。

有没有办法用 Spring Boot 重新映射这样的页面?

编辑 2

我希望负责生成放置在客户端系统上的每个页面的视图。换句话说,我不希望服务器生成每个页面。我希望本质上拥有“模板”,然后通过 AngularJS 控制器使用的 REST API 将其转换为包含信息的有用页面。

【问题讨论】:

【参考方案1】:

您可以使用Thymeleaf 框架来提供 HTML 网页内容:

首先,添加依赖:

build.gradle

    dependencies 
    compile("org.springframework.boot:spring-boot-starter-thymeleaf")

然后,创建一个控制器:

GreetingController.java

@Controller
public class GreetingController 

    @RequestMapping("/greeting")
    public String greeting(@RequestParam(value="name", required=false, defaultValue="World") String name, Model model) 
        model.addAttribute("name", name);
        return "greeting";
    


然后创建一个模板:

name.html 文件的名称必须与控制器中返回的字符串完全匹配,在这种情况下为 "greeting"

src/main/resources/templates/greeting.html

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Serving HTML Web Content</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <p>HEY THERE!</p>
</body>
</html>

然后您可以通过导航到本地访问该页面:

http://localhost:8080/greeting

【讨论】:

所以本质上,我创建了一个 HTML 模板,在调用映射的 URL 时将模板提供给用户,然后提供模板,然后 AngularJS 控制器利用 REST API 填充内容?所以换句话说,服务器不会用百里香生成“视图”?我想减轻服务器的负担,让 javascript 控制器利用 REST API 来填充模板。 Thymeleaf 更像是一个模板引擎,而不是像 JSP 那样动态生成的网页。如果您愿意,您确实可以访问 Spring Expression 语言,但如果适合您的用例,您可以只提供准系统 HTML5。但是,如果您确实选择使用 thymeleaf 属性来生成或填充元素,则会有一些服务器端处理。 您是否正在尝试实现单页架构? B/c 在这种情况下,百里香叶不是绝对完美的选择。如果是这种情况,您可以结帐jhipster.github.io。 JHipster 使用 angularJS/Twitter Bootstrap 和 Spring Boot REST API 后端生成单页应用程序。 是的,该应用程序将是一个单页应用程序。如果可能的话,我正在尝试维护一个 RESTful 架构。我来看看 JHipster。【参考方案2】:

如果你想使用 Angular,不要实现 Thymeleaf(Thymeleaf 不是 RESTful)。然后你可以做的是使用 $routeProvider 来指定哪个静态资源服务于哪个 URI。如果您的静态目录中有index.html,Spring Boot 将自动将其用作默认页面,然后您在 Angular 中使用的其他静态 URI 将相对于索引页面。

https://docs.angularjs.org/api/ngRoute/provider/$routeProvider

【讨论】:

那么我应该简单地使用 Angular 来删除最后的 .html 标签吗?没有优雅的方式来使用 Spring 以 RESTful 方式做到这一点?如果没有,那我就走这条路。谢谢 实际上,有很多方法可以做到这一点。 Spring 只是公开了一个 RESTful 服务,如何接收它取决于您。删除 .html 标签是什么意思? 如,如果我在浏览器中访问 /dashboard,它会出现 404 not found。我必须输入 /dashboard.html 这很丑陋。我想知道是否有办法在服务器端摆脱这种情况,同时保持 REST 原则。 @JakeMiller .. 你必须从某个地方提供 index.html 和 angular.js 或 bootstrap.js(嗯,你明白了),对吧?由于您没有提到 nginx/http 或前端节点代理,我假设您的 spring boot 必须为它服务。即使您不认为从 Spring Boot 中提供静态内容是“安静的”,您也没有太多选择。或者只是使用 nginx/httpd 来提供你所有的静态文件。那么你的 Spring Boot 将只剩下 RESTful 服务。【参考方案3】:
    我实际上会移动所有静态文件 - index.html、angular.js 或 bootstrap.js 和你所有的 angular template.html 到一个节点前面 结束代理并通过它代理你所有的spring boot服务调用 (这将帮助我避免为 CORS 改装 spring boot 服务)。 或者至少我会使用 nginx/httpd 来提供所有静态文件 并将所有服务调用代理到 ​​Spring Boot 应用程序。

【讨论】:

以上是关于使用 Spring Boot 映射 html 资源的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot自定义静态资源映射

spring boot 静态资源的映射规则 替他资源映射

spring boot 静态资源的映射规则 webjars 资源映射

spring boot 静态资源映射

Spring Boot对静态资源的映射规则

如何使用 Spring Boot 2.0 指定 Hibernate 映射?