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