Skip to content

使用并展示变量

现在我们给首页添加更多内容。比如,我们想在欢迎语下方显示当前日期,效果如下:

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 属性值支持的表达式类型非常丰富:消息表达式、变量表达式……还有更多类型。下一章会详细介绍所有可用的表达式类型。

核心语法解释

  1. 上下文变量的添加与使用
    • 控制器中通过 ctx.setVariable("变量名", 变量值) 向上下文添加数据;
    • 模板中通过 ${变量名} 读取上下文变量,完成动态数据渲染。
  2. #{...} vs ${...} 核心区别
    表达式类型语法用途数据来源
    消息表达式#{key}读取外部化的多语言文本.properties 配置文件
    变量表达式${name}读取上下文传入的动态业务数据控制器通过 ctx 设置的变量
  3. OGNL 表达式的基础能力: 支持对象属性访问(${user.name})、方法调用(${user.getName()})、集合操作等,能灵活解析上下文对象的属性和方法。
  4. 默认文本的作用<span> 标签内的 13 February 2011 是静态原型文本,直接打开 HTML 文件时显示,经 Thymeleaf 处理后会被 ${today} 的值替换。

总结

  1. 控制器通过 ctx.setVariable() 向上下文传递动态数据,模板通过 ${变量名} 变量表达式读取并展示数据。
  2. #{...} 用于国际化文本,${...} 用于动态业务数据,是 Thymeleaf 最核心的两种表达式。
  3. ${...} 基于 OGNL 语法,支持简单变量读取和复杂的对象属性/方法访问,后续章节会展开讲解更多用法。