上下文

为了处理我们的模版,我们将会创建一个实现了IGTVGController接口的HomeController类。如下:

  1. public class HomeController implements IGTVGController {
  2. public void process(
  3. final HttpServletRequest request, final HttpServletResponse response,
  4. final ServletContext servletContext, final ITemplateEngine templateEngine)
  5. throws Exception {
  6. WebContext ctx =
  7. new WebContext(request, response, servletContext, request.getLocale());
  8. templateEngine.process("home", ctx, response.getWriter());
  9. }
  10. }

我们第一眼看到的就是上下文的创建。一段Thymeleaf的上下文就是一个实现了org.thymeleaf.context.IContext接口的对象。上下文应当包含,在变量的映射关系中执行模版引擎需要的所有数据,同时指明了外部化的信息必须用到的地区。

  1. public interface IContext {
  2. public Locale getLocale();
  3. public boolean containsVariable(final String name);
  4. public Set<String> getVariableNames();
  5. public Object getVariable(final String name);
  6. }

这个接口有一个专门的扩展:org.thymeleaf.context.IWebContext,用在基于ServletAPI的网络应用里(比如SpringMVC)。

  1. public interface IWebContext extends IContext {
  2. public HttpServletRequest getRequest();
  3. public HttpServletResponse getResponse();
  4. public HttpSession getSession();
  5. public ServletContext getServletContext();
  6. }

Thymeleaf核心库提供了这些接口里每一个的实现:

  • org.thymeleaf.context.Context实现了IContext接口
  • org.thymeleaf.context.WebContext实现了IWebContext接口

如同你在controller的代码里看到的那样,我们使用了WebContext。实际上,我们不得不这样做,因为ServletContextTemplateResolver需要一个实现了IWebContext接口的上下文。

  1. WebContext ctx = new WebContext(request, response, servletContext, request.getLocale());

那四个构造器参数中只有三个是必须的,因为如果没有指定地区(尽管你不应当让这种情况发生在实际的应用里),系统里默认的地区将会被使用。

我们可以使用一些专门的表达式,从模版里的WebContext获取请求参数、请求、会话和应用属性。比如:

  • ${x}会返回存储在Thymeleaf上下文里的变量x,或者作为请求属性存储的变量x
  • ${param.x}会返回一个称为x的请求属性(可能多值)。
  • ${session.x}会返回一个称为x的会话属性。
  • ${application.x}会返回一个称为x的servlet上下文属性。