好吧,由于Spring Boot框架推荐使用Thymeleaf模板引擎,因此我创建了一个使用http://start.spring.io选择了Web
和Thymeleaf
依赖项的简单项目。
以下HomeController
和home/about.html
模板正常运行。
这是HomeController
:
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HomeController {
@RequestMapping("/home/about")
public String about(Model model) {
model.addAttribute("title", "About");
return "home/about";
}
}
这是home/about.html
的html源代码:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"/>
<title>Test for dot!</title>
</head>
<body>
<h1 th:text="${title}">H1Title</h1>
</body>
</html>
我将模型属性名称更改为点{/ strong>,如home.about.title
,其完整代码如下所示:
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HomeController {
@RequestMapping("/home/about")
public String about(Model model) {
model.addAttribute("home.about.title", "About");
return "home/about";
}
}
html代码变为:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"/>
<title>Test for dot!</title>
</head>
<body>
<h1 th:text="${home.about.title}">H1Title</h1>
</body>
</html>
嗯,发生了一些错误,这令人困惑!
那么,模型属性名称中的点有什么问题?它是保留用法的特殊字符吗?以及如何使它有效?
我在StackOverflow中搜索并找到了类似的问题How to access a Spring MVC model attribute name that contain a dot in Freemarker?,但该问题的答案不适用于Thymeleaf。
答案 0 :(得分:1)
点用于指代对象的属性/方法。当您使用表达式${home.about.title}
时,它会尝试查找模型对象home
并调用home.getAbout().getTitle()
。通过做这样的事情,我已经能够绕过这个
<!-- thymeleaf 2 -->
<span th:text="${#vars.get('home.about.title')}" />
<!-- thymeleaf 3 -->
<span th:text="${#vars.getVariable('home.about.title')}" />
但我不推荐它。你应该远离在模型属性中使用点字符。
答案 1 :(得分:0)
使用像这样的国际化消息并不是一个好习惯。
对于Spring Boot项目,在 src / main / resources /
中创建文件messages.properties(messages_cs.properties等)src / main / resources / messages.properties 的内容将是
home.about.title=About
然后在Thymeleaf你将使用hashtag而不是dollar。
<h1 th:text="#{home.about.title}">H1Title</h1>
答案 2 :(得分:0)
如果这些不是&#34;消息&#34;需要国际化,或者你不能遵循标准约定,我认为最好的方法是创建一个包含你想要的属性的类。例如,Properties类是内置的(因为我相信JDK 7)。
在您的控制器中:
Properties props = new Properties();
props.setProperty("my.key", "my.value");
model.add(props, "Properties");
然后,在您的模板中:
<span th:text="${Properties.getProperty('my.key')}" />
当然,您可以创建自己的包装器类并更改方法名称以使访问更方便,因此最终结果可能更像:
<span th:text="${Store.get('my.key')}" />