The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:
一年前,我试图解释如何在Web应用程序中通过XML和XSL的帮助有效地将数据及其呈现分离。简而言之,我们不再使用模板引擎(如JSP、Velocity、FreeMarker等)和将数据注入到HTML中,而是以XML文档的形式组合它们,然后使用XSL样式表将其转换为HTML。以下是一个简单的示例,展示了如何与Takes框架一起使用所有这些内容。
首先,让我们同意模板引擎本身就是一个坏主意。是的,我是这个意思。整个JSP的设计都是错误的,对其创建者表示敬意。下面是它的工作原理:假设我的网站需要从数据库获取当前欧元汇率并在首页上显示。这是我的index.jsp
的样子:
为了创建HTML,JSP引擎将需要在对象rates
上调用get()
方法,并通过toString()
方法呈现返回的内容。这是一个糟糕的设计,有几个原因。首先,视图与模型紧密耦合。其次,渲染的灵活性非常有限。第三,渲染的结果不可重用,而且视图不能堆叠。还有许多其他原因…更多关于它们的内容将在下一篇文章中详细介绍。
让我们看看如何正确地完成这个任务。首先,我们让模型以XML格式生成输出,例如:
这就是模型将生成的内容,它对视图一无所知。然后,我们创建视图作为一个XSL样式表,它将把XML转换为HTML。
正如您所见,视图在实现方面对模型一无所知。它只知道模型生成的XML数据输出的格式。以下是您如何在Takes框架中设计它。让我们从一个简单的例子开始:
这是一个简单的网络应用程序,它启动一个网页服务器并且永不停止(它在守护模式下等待连接)。为了使其工作,我们应该创建一个名为TkApp
的简单的“接收”(take)函数。
这个“take”总是返回相同的XML响应,但尚未进行任何XSL转换。我们需要将RsXSLT
类添加到图中。
请原谅我使用字符串拼接,这是一种不好的做法;仅仅是为了简单起见,我才这样做。
正如你所见,我还在 XML 中添加了一个 XML 样式表处理指令。RsXSLT
将理解并尝试在类路径上找到 /xsl/index.xsl
资源。你可以在上面看到该文件的内容。
其实并不是这样。从字符串构建XML并不是一个好主意。在Takes框架中我们有更好的工具。我们使用Xembly,它是一种简单的命令式语言,用于构建和修改XML文档。更多关于它的信息可以在这里找到:Xembly, 一个用于XML的汇编语言。
这是我们的TkApp
的样子:
这里最重要的类是RsXembly
。这个想法是让模型类通过Xembly “指令”来暴露它们的数据,这些指令将由RsXembly
应用于DOM结构。
最后,此代码将与我之前使用字符串连接创建的XML文档完全相同。
这种方法的美妙之处在于数据生成、XML构建和XML与HTML之间的转换完全解耦。它是完全可重用和“可堆叠”的。我们可以多次将数据转换为XML格式,对每个数据应用不同的XSL样式表。我们甚至可以将它们转换为JSON,而无需更改模型类中的任何代码。
此外,我们可以使用功能强大的XSLT 2.0工具以不同的格式进行格式化。XSLT本身是一种功能强大且纯函数的语言,可以实现任何可能的数据操作。没有任何模板引擎能够与其媲美。
例如,在Rultor的RsPage
类中,可以看一下它是如何工作的。
Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-18 at 05:10