有时候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文件的细节后面在更新了