我自定义了一个freemarker标签,代码如下:
public class MemberPrice implements TemplateDirectiveModel {
@Override
public void execute(Environment env, Map var2, TemplateModel[] var3, TemplateDirectiveBody body) throws TemplateException, IOException {
// 获取标签中属性的值都是从map参数里拿的
//输出对象通过env对象输出(流)
//var3 循环替代变量
//body 是自定义标签中的内容,如<@myDirective>XXXXXXXXXX</@myDirective>;当标签是<@myDirective />格式时,body=null 这个是指包含内容成为模板对象,可调用render来执行模板代码
BigDecimal memberPrice;
if (var2.get("price")==null){
throw new TemplateModelException("没有设置price属性");
}else{
//开始计算会员价
memberPrice = new BigDecimal(var2.get("price").toString()).multiply(new BigDecimal(WebConfig.discountRate)).divide(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP);
}
Writer out = env.getOut();
//out.write(memberPrice.toString());
env.setVariable("mp",WrappingTemplateModel.getDefaultObjectWrapper().wrap(memberPrice));
body.render(out);
// body.render();
}
}然后,使用的时候:
<em class="weui-form-preview__value hyPrice">¥<@MemberPrice price=row.price>${mp}</@MemberPrice></em>出现的问题是,当我按住刷新键不放,大概刷新到第20次左右的时候,freemarker就抛异常,提示 MemberPirce 为 Null,然后我再刷新一次,又好了,然后再刷新个几次,就又抛出这个异常,实在是搞不懂了,请教下老大是什么问题呢?
项目:JFinal
jfinal 3.3 提供了 #number 指令,比你现在的用法简单太多了,在俱乐部找我要一下 #number 指令的代码,可以先用上