如何访问Thymeleaf中包含点的Spring MVC模型属性名称

时间:2017-01-06 16:25:50

标签: spring spring-mvc spring-boot thymeleaf

好吧,由于Spring Boot框架推荐使用Thymeleaf模板引擎,因此我创建了一个使用http://start.spring.io选择了WebThymeleaf依赖项的简单项目。

以下HomeControllerhome/about.html模板正常运行。

这是HomeController

的java源代码
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。

3 个答案:

答案 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')}" />