Thymeleaf + spring 动态替换
Thymeleaf + spring dynamic replace
是否可以在 Thymeleaf 中创建动态替换?
我有以下控制器:
@Controller
public class LoginController {
@RequestMapping("/login")
public String getLogin(Model model){
model.addAttribute("template","login");
return "index";
}
}
以及以下观点:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" >
<head></head>
<body>
<div th:replace="fragments/${template} :: ${template}"></div>
</body>
</html>
我收到以下错误:
Error resolving template "fragments/${template}", template might not exist or might not be accessible by any of the configured Template Resolvers
更新
我试着像这样预处理我的变量:
<div th:replace="fragments/${__#{${template}}__} :: ${__#{${template}}__}"></div>
怎么现在 ${template}
被替换为 login
我现在有以下错误:
Exception evaluating SpringEL expression: "??login_en_US??"
我认为在 thymeleaf 中管理此行为的适当方法是使用 layout:fragment
标签。如果我错了,请纠正我。这是我的布局页面的一个简单示例,以及 'dynamically' 加载的登录页面:
layout.html
<html xmlns:layout="http://www.w3.org/1999/xhtml" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<title layout:title-pattern="$DECORATOR_TITLE - $CONTENT_TITLE">Layout</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=Edge"/>
</head>
<body>
<div>
<div class="app-container">
<div th:fragment="content">
</div>
</div>
</div>
<div th:fragment="script"></div>
</body>
</html>
然后,当登录被加载时,它将 th:fragment
div 替换为 html 视图中关联的 div,这与控制器方法返回的字符串相匹配, 在这种情况下 login.html:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.w3.org/1999/xhtml"
layout:decorator="layout">
<head>
<title>Login</title>
</head>
<body>
<div th:fragment="content">
<form th:action="@{/login}" method="post">
<div><label> User Name : <input type="text" name="username"/> </label></div>
<div><label> Password: <input type="password" name="password"/> </label></div>
<div><input type="submit" value="Sign In"/></div>
</form>
</div>
</body>
</html>
现在,如果您想有条件地加载另一个片段,我采用的方法是添加带有 th:if 个案例的替换标签。下面是一个根据当前用户的属性显示不同问题的表单示例:
<div th:if="${foo.type)} == 'type_1'">
<div th:replace="fragments/custom-questions :: type-1-checkboxes"></div>
</div>
<div th:if="${foo.type} == 'type_2'">
<div th:replace="fragments/custom-questions :: type-2-checkboxes"></div>
</div>
然后从文件 custom-questions.html:
中加载关联的 div
<div th:fragment="type-1-checkboxes">
//stuff
</div>
<div th:fragment="type-2-checkboxes">
//stuff
</div>
尽管 Joe Essey 的解决方案同样有效,但我使用以下代码解决了问题:
<div th:replace="@{'fragments/' + ${template}} :: ${template}"></div>
我刚遇到这个问题(这是我第一次使用 thymeleaf/spring)。这就是为我解决的问题:
<div class="col-md-12" th:include="__${template}__ :: body" ...
<div th:insert=“${subpage}::fragementName”>
只需更改子页面名称,您就会在 thymeleaf 中实现动态行为
在 Thymeleaf 3.0 中,以下解决方案对我有用:
<div th:replace="('fragments/' + ${template}) :: (${template})">
(但请注意,我将它与片段的固定名称和模板的动态名称一起使用,因此 :: (${template})
周围的括号可能是可选的。)
该解决方案的灵感来自 https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#fragment-specification-syntax
中 Thymeleaf 的文档
Both templatename and selector in the above examples can be fully-featured expressions (even conditionals!) like:
<div th:insert="footer :: (${user.isAdmin}? #{footer.admin} : #{footer.normaluser})"></div>
Note again how the surrounding ~{...} envelope is optional in th:insert/th:replace
是否可以在 Thymeleaf 中创建动态替换?
我有以下控制器:
@Controller
public class LoginController {
@RequestMapping("/login")
public String getLogin(Model model){
model.addAttribute("template","login");
return "index";
}
}
以及以下观点:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" >
<head></head>
<body>
<div th:replace="fragments/${template} :: ${template}"></div>
</body>
</html>
我收到以下错误:
Error resolving template "fragments/${template}", template might not exist or might not be accessible by any of the configured Template Resolvers
更新
我试着像这样预处理我的变量:
<div th:replace="fragments/${__#{${template}}__} :: ${__#{${template}}__}"></div>
怎么现在 ${template}
被替换为 login
我现在有以下错误:
Exception evaluating SpringEL expression: "??login_en_US??"
我认为在 thymeleaf 中管理此行为的适当方法是使用 layout:fragment
标签。如果我错了,请纠正我。这是我的布局页面的一个简单示例,以及 'dynamically' 加载的登录页面:
layout.html
<html xmlns:layout="http://www.w3.org/1999/xhtml" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<title layout:title-pattern="$DECORATOR_TITLE - $CONTENT_TITLE">Layout</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=Edge"/>
</head>
<body>
<div>
<div class="app-container">
<div th:fragment="content">
</div>
</div>
</div>
<div th:fragment="script"></div>
</body>
</html>
然后,当登录被加载时,它将 th:fragment
div 替换为 html 视图中关联的 div,这与控制器方法返回的字符串相匹配, 在这种情况下 login.html:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.w3.org/1999/xhtml"
layout:decorator="layout">
<head>
<title>Login</title>
</head>
<body>
<div th:fragment="content">
<form th:action="@{/login}" method="post">
<div><label> User Name : <input type="text" name="username"/> </label></div>
<div><label> Password: <input type="password" name="password"/> </label></div>
<div><input type="submit" value="Sign In"/></div>
</form>
</div>
</body>
</html>
现在,如果您想有条件地加载另一个片段,我采用的方法是添加带有 th:if 个案例的替换标签。下面是一个根据当前用户的属性显示不同问题的表单示例:
<div th:if="${foo.type)} == 'type_1'">
<div th:replace="fragments/custom-questions :: type-1-checkboxes"></div>
</div>
<div th:if="${foo.type} == 'type_2'">
<div th:replace="fragments/custom-questions :: type-2-checkboxes"></div>
</div>
然后从文件 custom-questions.html:
中加载关联的 div<div th:fragment="type-1-checkboxes">
//stuff
</div>
<div th:fragment="type-2-checkboxes">
//stuff
</div>
尽管 Joe Essey 的解决方案同样有效,但我使用以下代码解决了问题:
<div th:replace="@{'fragments/' + ${template}} :: ${template}"></div>
我刚遇到这个问题(这是我第一次使用 thymeleaf/spring)。这就是为我解决的问题:
<div class="col-md-12" th:include="__${template}__ :: body" ...
<div th:insert=“${subpage}::fragementName”>
只需更改子页面名称,您就会在 thymeleaf 中实现动态行为
在 Thymeleaf 3.0 中,以下解决方案对我有用:
<div th:replace="('fragments/' + ${template}) :: (${template})">
(但请注意,我将它与片段的固定名称和模板的动态名称一起使用,因此 :: (${template})
周围的括号可能是可选的。)
该解决方案的灵感来自 https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#fragment-specification-syntax
中 Thymeleaf 的文档Both templatename and selector in the above examples can be fully-featured expressions (even conditionals!) like:
<div th:insert="footer :: (${user.isAdmin}? #{footer.admin} : #{footer.normaluser})"></div>
Note again how the surrounding ~{...} envelope is optional in th:insert/th:replace