有时候thymeleaf自带的模板方言有点不够用的时候 可以支持自定义,最近遇到一个在thymeleaf模板中显示订单状态的需求。
当然也可以使用 switch case的方式,但是如果很多的页面都要使用的时候你得一直复制代码 很麻烦 而且中途如果修改了某个状态码含义 你得全部修改一遍。这当然不是我们得正确使用姿势。状态码含义如下

9 待支付定金
10 待停车(已支付定金)
11 停车中
12 停车结束(待支付尾款)
13 订单完成(已支付尾款)

定义处理tag得解析器

这里我们定义一个名为orderstatus的属性(attributeName),表示遇到这个属性会调用doProcess方法中的代码

public class ParkingOrderStatusTagProcessor  extends AbstractAttributeTagProcessor {


protected ParkingOrderStatusTagProcessor(String dialectPrefix) {
super(TemplateMode.HTML, dialectPrefix,
null, false, "orderstatus", true, 1000, true);
}

@Override
protected void doProcess(ITemplateContext context, IProcessableElementTag tag,
AttributeName attributeName, String attributeValue,
IElementTagStructureHandler structureHandler) {
final IStandardExpressionParser expressionParser = StandardExpressions
.getExpressionParser(context.getConfiguration());
final IStandardExpression expression =
expressionParser.parseExpression(context, attributeValue);
Object val=expression.execute(context);
if(val!=null && val instanceof Number){
structureHandler.setBody(
HtmlEscape.escapeHtml5(getOrderStatus((Integer) val)), false);
}
}

private static String getOrderStatus(Integer status){
if(status== 9){
return "待支付定金";
}else if(status==10){
return "待停车(已支付定金)";
}else if(status==11){
return "停车中";
}else if(status==12){
return "停车结束(待支付尾款)";
}else if(status==13){
return "订单完成(已支付尾款)";
}else{
return "未知状态";
}
}
}

定义方言

创建一个方言 因为thymeleaf模板引擎需要先添加方言(Dealect),而这个方言中又可以添加多个tag属性解析器,这里设置了一个名为park的前缀,并添加了上面的ParkingOrderStatusTagProcessor属性解析器。

在模板中就可以使用<div park:orderstatus="${order.status}"></div>

public class ParkDealect extends AbstractProcessorDialect {

public ParkDealect() {
super("parkingDealect", "park", 1001);
}

@Override
public Set<IProcessor> getProcessors(String dialectPrefix) {
final Set<IProcessor> processors = new HashSet<IProcessor>();
processors.add(new ParkingOrderStatusTagProcessor(dialectPrefix));
return processors;
}
}

添加方言到模板引擎中

@Bean
public SpringTemplateEngine templateEngine(@Autowired ITemplateResolver resolver){
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setEnableSpringELCompiler(true);
templateEngine.setTemplateResolver(resolver);
templateEngine.addDialect(new ParkDealect());//把定义好的方言添加进去
return templateEngine;
}

最后在模板中设置一下park的xmlns,我自己测试了一下 这个xmlns的文件不创建也没关系,但最好还是建好。

<html lang="zh" xmlns:th="http://www.thymeleaf.org"
xmlns:park="http://www.peachyy.com/thymeleaf/park">

其实自定义方言就相当于JSP中的自定义标签。更多xmlns文件的细节后面在更新了