Skip to content

上下文(Contexts)

要处理模板,我们需要创建一个 HomeController 类,它实现了前文提到的 IGTVGController 接口:

java
public class HomeController implements IGTVGController {

    public void process(
            final IWebExchange webExchange, 
            final ITemplateEngine templateEngine,
            final Writer writer)
            throws Exception {
        
        WebContext ctx = new WebContext(webExchange, webExchange.getLocale());
        
        templateEngine.process("home", ctx, writer);
        
    }

}

首先要关注的是上下文(Context) 的创建。Thymeleaf 上下文是实现了 org.thymeleaf.context.IContext 接口的对象,它需要包含模板引擎执行所需的所有数据(存储在变量映射中),同时还要指定处理外部化消息时使用的语言环境(Locale)

IContext 核心接口定义

java
public interface IContext {

    public Locale getLocale(); // 获取语言环境
    public boolean containsVariable(final String name); // 判断是否包含指定变量
    public Set<String> getVariableNames(); // 获取所有变量名
    public Object getVariable(final String name); // 获取指定变量的值
    
}

该接口有一个面向 Web 应用的专用扩展:org.thymeleaf.context.IWebContext

java
public interface IWebContext extends IContext {
    
    public IWebExchange getExchange(); // 获取 Web 交互对象(封装请求/响应)
    
}

Thymeleaf 核心库为这两个接口提供了默认实现:

  • org.thymeleaf.context.Context:实现 IContext,适用于非 Web 环境;
  • org.thymeleaf.context.WebContext:实现 IWebContext,适用于 Web 环境。

正如控制器代码中所示,我们使用的是 WebContext——实际上也必须使用它,因为 WebApplicationTemplateResolver(Web 应用模板解析器)要求上下文必须实现 IWebContext 接口。

java
WebContext ctx = new WebContext(webExchange, webExchange.getLocale());

WebContext 的构造函数需要 IWebExchange 抽象对象中的信息(该对象在过滤器中创建,封装了请求和响应)。如果未指定语言环境,会使用系统默认Locale(但实际项目中绝不能依赖这个默认值)。

在模板中,我们可以通过一些专用表达式从 WebContext 中获取请求参数、请求/会话/应用属性:

表达式含义
${x}获取 Thymeleaf 上下文变量 x,或交换对象中的属性(对应 Servlet 的“请求属性”)
${param.x}获取名为 x 的请求参数(可能是多值的)
${session.x}获取名为 x 的会话属性
${application.x}获取名为 x 的应用属性(对应 Servlet 的“ServletContext 属性”)

核心概念解释

  1. Context 的核心作用
    • 作为“数据容器”:存放模板渲染所需的所有变量(如业务数据、用户信息);
    • 关联语言环境:为 #{...} 消息表达式提供国际化的Locale依据;
    • 适配运行环境:WebContext 专门适配 Web 场景,封装 Servlet 相关的请求/会话/应用数据。
  2. IWebExchange 的意义: Thymeleaf 对 Servlet 的 HttpServletRequest/HttpServletResponse 的抽象封装,解耦模板引擎与具体的 Servlet API,提升通用性。
  3. 变量查找优先级${x} 会先查找 Thymeleaf 上下文(ctx.setVariable("x", value))中的变量,若不存在则查找请求属性(request.setAttribute("x", value))。

总结

  1. Thymeleaf 上下文(Context)是模板渲染的“数据载体”,IContext 是基础接口,WebContext 是 Web 环境的专用实现。
  2. WebContext 必须与 WebApplicationTemplateResolver 配合使用,能封装 Web 交互数据并指定国际化Locale。
  3. 模板中可通过 ${param/x/session/application.x} 等表达式,直接访问 Web 环境中的请求参数、会话/应用属性。