深色模式
上下文(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 属性”) |
核心概念解释
- Context 的核心作用:
- 作为“数据容器”:存放模板渲染所需的所有变量(如业务数据、用户信息);
- 关联语言环境:为
#{...}消息表达式提供国际化的Locale依据; - 适配运行环境:
WebContext专门适配 Web 场景,封装 Servlet 相关的请求/会话/应用数据。
- IWebExchange 的意义: Thymeleaf 对 Servlet 的
HttpServletRequest/HttpServletResponse的抽象封装,解耦模板引擎与具体的 Servlet API,提升通用性。 - 变量查找优先级:
${x}会先查找 Thymeleaf 上下文(ctx.setVariable("x", value))中的变量,若不存在则查找请求属性(request.setAttribute("x", value))。
总结
- Thymeleaf 上下文(Context)是模板渲染的“数据载体”,
IContext是基础接口,WebContext是 Web 环境的专用实现。 WebContext必须与WebApplicationTemplateResolver配合使用,能封装 Web 交互数据并指定国际化Locale。- 模板中可通过
${param/x/session/application.x}等表达式,直接访问 Web 环境中的请求参数、会话/应用属性。
