深色模式
使用并展示变量
现在我们给首页添加更多内容。比如,我们想在欢迎语下方显示当前日期,效果如下:
Welcome to our fantastic grocery store!
Today is: 12 july 2010首先需要修改控制器,将日期作为上下文变量添加进去:
java
public void process(
final IWebExchange webExchange,
final ITemplateEngine templateEngine,
final Writer writer)
throws Exception {
SimpleDateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy");
Calendar cal = Calendar.getInstance();
WebContext ctx = new WebContext(webExchange, webExchange.getLocale());
// 向上下文添加名为 today 的字符串变量,值为格式化后的当前日期
ctx.setVariable("today", dateFormat.format(cal.getTime()));
templateEngine.process("home", ctx, writer);
}我们已经在上下文中添加了名为 today 的字符串变量,接下来就可以在模板中展示它了:
html
<body>
<p th:utext="#{home.welcome}">Welcome to our grocery store!</p>
<p>Today is: <span th:text="${today}">13 February 2011</span></p>
</body>可以看到,我们依然使用 th:text 属性来完成这个任务(这是正确的,因为我们需要替换标签的文本内容),但这次的语法略有不同:不再使用 #{...} 消息表达式,而是用了 ${...} 变量表达式。 这种表达式基于 OGNL(对象图导航语言,Object-Graph Navigation Language)编写,会在我们之前提到的“上下文变量映射表”中执行。
${today} 表达式的含义很简单:“获取名为 today 的变量”,但这类表达式可以更复杂(比如 ${user.name} 表示“获取名为 user 的变量,并调用其 getName() 方法”)。
Thymeleaf 属性值支持的表达式类型非常丰富:消息表达式、变量表达式……还有更多类型。下一章会详细介绍所有可用的表达式类型。
核心语法解释
- 上下文变量的添加与使用:
- 控制器中通过
ctx.setVariable("变量名", 变量值)向上下文添加数据; - 模板中通过
${变量名}读取上下文变量,完成动态数据渲染。
- 控制器中通过
#{...}vs${...}核心区别:表达式类型 语法 用途 数据来源 消息表达式 #{key}读取外部化的多语言文本 .properties配置文件变量表达式 ${name}读取上下文传入的动态业务数据 控制器通过 ctx设置的变量- OGNL 表达式的基础能力: 支持对象属性访问(
${user.name})、方法调用(${user.getName()})、集合操作等,能灵活解析上下文对象的属性和方法。 - 默认文本的作用:
<span>标签内的13 February 2011是静态原型文本,直接打开 HTML 文件时显示,经 Thymeleaf 处理后会被${today}的值替换。
总结
- 控制器通过
ctx.setVariable()向上下文传递动态数据,模板通过${变量名}变量表达式读取并展示数据。 #{...}用于国际化文本,${...}用于动态业务数据,是 Thymeleaf 最核心的两种表达式。${...}基于 OGNL 语法,支持简单变量读取和复杂的对象属性/方法访问,后续章节会展开讲解更多用法。
