Java中模板引擎的目的是啥?

Posted

技术标签:

【中文标题】Java中模板引擎的目的是啥?【英文标题】:What is the purpose of template engines in Java?Java中模板引擎的目的是什么? 【发布时间】:2020-02-27 08:07:12 【问题描述】:

我是一名 android 开发人员,大约两年了,最近我一直在考虑构建 Web 应用程序。所以我开始研究弹簧靴,一切都很好。然后,我遇到了一个叫做模板引擎 (thymeleaf) 的东西,它根据定义将您的代码与演示文稿分开。

让我困惑的是后端服务器如何拥有 html?演示文稿应该由前端的 html、css 和 javascript 处理吗?我什至看到了他们在控制器中实际输入 html 代码作为返回值的教程。

我的理解是后端服务器通过AJAX公开API供前端使用,前端将操作这些数据并将信息呈现在屏幕上,为什么后端要提供html代码?

谢谢

【问题讨论】:

可能是你错误地标记了javascript,请编辑。 你看帖子了吗? 并非每个应用程序都是 SPA - 例如,此站点不是 SPA,html 是在模板引擎中的服务器上而不是在前端呈现的。这有优点也有缺点 @BrendonCheung 这些答案都没有回答您的问题吗?它仍然在没有接受答案的问题列表中。 【参考方案1】:

我知道到目前为止这个问题已经得到了相当有效的回答,但我想加上我的两分钱,因为我经常与 Thymeleaf 一起工作。

考虑模板引擎的最简单方法是,它允许基于控制器方法传递给它的信息对 html 进行一些动态开发。这使您可以将通常不存在的逻辑放入其中,或者说如果用户可能已登录到管理员,则显示某个部分。

如果网页是房子,html 是框架,css 是墙壁,Javascript 是灯光和电力,而模板引擎几乎就是架构师在框架构建之前即时设计计划购房者的愿望(用户输入)。

【讨论】:

【参考方案2】:

让我困惑的是后端服务器如何拥有 html?

“后端”必须具有 HTML,因为这是交付给客户端并由客户端呈现的内容。

可能只是后端“服务器”只是一个交付内容的 CDN,例如 HTML/JS SPA,但仍有某些东西向浏览器交付内容。

也就是说:服务器端渲染仍然是一件事,并且最近又重新流行起来——React 应用程序可能会在服务器上完成其初始渲染,因此客户端再次获得一个使用 HTML 和相关数据渲染的页面, 然后开始表现得像一个普通的SPA。

我的理解是后端服务器通过AJAX公开API供前端使用,前端将操作这些数据并将信息呈现在屏幕上,为什么后端要提供html代码?

因为需要运行 JS 才能访问这些 API。

一些历史:

浏览器过去很糟糕。 JS 曾经是一个简洁的插件,网站是相对静态的,基本上所有的渲染都是在服务器上完成的。后端会从它获取数据的任何地方获取数据并生成完整的 HTML 页面,除了一些表单字段之外,客户端几乎没有发生任何事情,也许是一些验证,这就是它的范围。

【讨论】:

我明白了,但是前端有html css javascript,为什么还要麻烦后端发送html?我在前端的理解是向后端询问数据的具体信息,数据在屏幕上的呈现方式取决于前端 它还会从哪里来? HTML 直到它来自某个地方时才会出现在客户端上,无论该 HTML 中有什么内容。 可能会认为所有应用程序都只是调用 API 并进行所有渲染,但 Web 并不是这样开始的。所有这些客户端应用程序的东西都是相对较新的。而且,正如我所说,s-s-r 无论如何都会回来,即使它只是第一次加载。【参考方案3】:

好的,较新的应用程序和网站可能只需加载/启动/打开一次,然后通过 AJAX 请求拉取或推送数据,这很好,它可以节省流量并且速度很快。

但并非总是如此,一些框架仍然不会根据小请求构建所有内容。 Java 中的 Spring 或 php 中的 Symfony 是 MVC 框架并使用模板引擎来构建页面。这听起来可能有点过时,但仍有很多网站在使用它。

如果您为使用慢速 PC 或其他设备的客户构建 Web 应用程序并且页面内容性能很重,您可能希望在服务器上做尽可能多的工作,这样用户就不必等待很长时间.您还可以缓存呈现的页面。甚至还有反应页面的服务器端渲染,例如使初始页面加载更快...

对于 Java 和 Spring,我只是使用了 JSP,但我不知道 thymeleaf。只需使用您喜欢的,也许是最受支持/记录的。

像这样构建网站并不意味着你不能使用 AJAX,但如果你使用模板,你需要考虑什么是有意义的。

【讨论】:

【参考方案4】:

Thymeleaf 通过使用模板引擎提供 HTML 页面来替代 JSP。控制器请求 HTML 文件,Spring Boot 在使用提供的模型构建模板后提供该模板。

Thymeleaf 很棒,因为它允许您即时重建模板。例如,您在前端向用户显示指向他们的点,但点数可能会增加或减少。

您可以使用模型在后台构建模板。模型引用是 magically 提供给解析它的模板。

@RequestMapping(...)
public String request(Model model) 
    model.put("points", 5);
    return "my-template.html"

然后使用 Thymeleaf 语言将您的对象提供给 HTML 文件,以便在运行时在引擎中处理。

<html..>
    <head>...</head>

    <body>
    <h1 th:text="$points"></h1>
</html>

Spring Boots 模板引擎将在后台构建它并将其呈现给用户,但它会将实际点显示给最终用户!希望这会有所帮助。

【讨论】:

【参考方案5】:

前端将处理这些数据

什么前端?您是指 HTML 页面中的 JavaScript 代码吗?那个是从哪里来的?哦,是的,服务器

服务器向客户端提供 HTML 页面,以及任何 .js 和 .css 文件。

服务器可以提供静态页面,任何动态都由 JavaScript 处理。或者,服务器可以动态构建 HTML 页面,使用 ...你猜对了 ...模板引擎。

您通常不希望 JavaScript 最初构建页面,只是为了使用 JavaScript 来处理任何动态行为。有些页面甚至不需要任何动态行为。

当然,除非您正在考虑 single-page applications (SPA),其中只有一个根 HTML 页面,其他所有内容都是使用 JavaScript 和 AJAX 调用在客户端构建的,但大多数 Web 应用程序不是 SPA。

【讨论】:

以上是关于Java中模板引擎的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

ftl是啥格式

ajax里使用模板引擎

Java 模板引擎中 URL 的最佳实践

JS模板引擎

smarty是啥东西,主要干啥用的

springboot:Java模板引擎Thymeleaf介绍