使用 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 资源的主要内容,如果未能解决你的问题,请参考以下文章