我们没有为我们的 Grocery 应用程序明确指定一个消息解析器实现,正如之前所解释的,这意味着正在使用的实现是 org.thymeleaf.messageresolver.StandardMessageResolver 对象。
StandardMessageResolver 是 IMessageResolver 接口的标准实现,但如果我们愿意,可以创建我们自己的,适应我们应用程序的具体需求。
注意:Thymeleaf + Spring 集成包默认提供了一个 IMessageResolver 实现,它使用标准的 Spring 方式来检索外部化消息,即使用在 Spring 应用上下文中声明的 MessageSource Bean。
那么,StandardMessageResolver 是如何在一个特定的模板中寻找所请求的消息呢?
如果模板名称是 home,并且位于 /WEB-INF/templates/home.html 中,请求的 locale 是 gl_ES,那么这个解析器将在以下文件中寻找消息,按照这个顺序:
/WEB-INF/templates/home_gl_ES.properties
/WEB-INF/templates/home_gl.properties
/WEB-INF/templates/home.properties
请参考 StandardMessageResolver 类的 JavaDoc 文档,以了解完整的消息解析机制如何工作的更多细节。
如果我们想在模板引擎中添加一个消息解析器(或更多),该怎么办?很简单。
// 对于只设置一个 templateEngine.setMessageResolver(messageResolver); // 对于设置一个以上的 templateEngine.addMessageResolver(messageResolver);
为什么我们要有一个以上的消息解析器呢?与模板解析器的原因相同:消息解析器是有顺序的,如果第一个解析器不能解析一个特定的消息,就会询问第二个,然后是第三个,等等。