gpt4 book ai didi

java - 如何在 Thymeleaf 3 中向片段添加其他内容

转载 作者:行者123 更新时间:2023-11-30 06:51:37 26 4
gpt4 key购买 nike

我想使用 Thymeleaf 3 layouts 向片段添加额外的内容,但无法弄清楚如何去做。例如,我想要一个名为 layout 的片段,如下所示:

<head th:fragment="head(title)">
<title th:include="${title}">My App: </title>
</head>

然后有一个使用上面片段的模板:

<head th:include="layout :: head(title=~{::title})">
<title>Please Login</title>
</head>

内容呈现如下:

<head>
<title>Please Login</title>
</head>

但是,我想修改模板,使其呈现如下所示,并将 My App: 放在 layout 模板中(我不想让复制它)。

<head>
<title>My App: Please Login</title>
</head>

我可以使用以下方法让它工作:

<head th:fragment="head(title)">
<title th:include="${title}">My App: <th:block th:include="${title}"></th:block></title>
</head>

但是,Thymeleaf 不鼓励使用 th:includeFrom the reference :

And what is the difference between th:insert and th:replace (and th:include, not recommended since 3.0)?

谁能告诉我如何使用最佳实践修复我的模板,使其呈现如上所示(如前所述,引用暗示这意味着不使用 th:include)?

最佳答案

这里的复杂性来自于你不想要你的 <title>标记直接进入您的片段(使用 ~{::title} 和片段的 th:replace 标记处的 <title> 很容易)。相反,正如您所解释的那样,您实际上是在丰富您片段的 <title>包含来自包含模板的文本内容。

这里的关键是使用 /text()标记选择器中的修饰符,表示“选择此标记的文本内容”,例如:

<head th:include="layout :: head(title=~{::title/text()})">
<title>Please Login</title>
</head>

(有关标记选择器语法的完整引用,请参阅 http://www.attoparser.org/apidocs/attoparser/2.0.0.RELEASE/org/attoparser/select/package-summary.html)

这将使您的 title变量包含 Fragment由单个节点/事件组成的对象,一个 IText包含文本 "Please Login" .

如您所说,th:include现在不鼓励(在 3.1 中弃用),取而代之的是 th:insertth:replace是首选。原因是th:include的机制似乎不是完全直接的,并且通常会引起误解(基本上,很多人认为它做了现在 th:insert 做的事情,这要简单得多)。此外,th:include添加了一些不需要的计算复杂性。

th:replace与 2.1 中的完全相同,即实际上用片段替换主机标记。 th:insert会将片段插入到主机标记的正文中。一组更简单的选项,恕我直言。

回到您的代码,因此我会将其发展为使用 th:replace :

<head th:replace="layout :: head(title=~{::title/text()})">
<title>Please Login</title>
</head>

至于你的片段,在你的情况下我会选择内联,这可能是这里最简单的选择:

<head th:fragment="head(title)">
<title>My App: [[${title}]]</title>
</head>

请注意,在本例中我们使用的是 Fragment (即 片段表达式 的结果,在本例中为 ~{::title/text()} ),我们只是通过 内联 (相当于 th:text )输出它,就好像而不是一个片段 title变量仅包含 String .但这是 v3.0 中新片段表达式的灵 active 的一部分。

如果你不喜欢内联,你可以选择类似的东西:

<head th:fragment="head(title)">
<title th:text="|My App: ${title}|">My App</title>
</head>

如果有可能 including 模板没有<title>标签,你想检查这种可能性,只需使用 My App文本作为标题如果没有标题被发送到片段,你可以使用新的 no-op 标记(_):

<head th:fragment="head(title)">
<title th:text="${title} ? |My App: ${title}| : _">My App</title>
</head>

免责声明,根据 StackOverflow 规则:我是 Thymeleaf 的项目负责人。

关于java - 如何在 Thymeleaf 3 中向片段添加其他内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40031739/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com