麦克斯仇
Think different
159
文章
36871
阅读
首页
INDEX
文章
ARTICLE
关于
ABOUT
扩展Directive使Enjoy的#date兼容LocalDateTime等java8时间类
创建日期:
2020/08/26
修改日期:
2023/05/19
Java
SpringBoot
SpringMVC
JFinal
> 自`Enjoy 4.9.02`开始,官方已支持LocalDateTime等时间类,无需如下扩展 ## 场景 ### 场景一 - JFinal > 自定义的`DTO`等对象中的字段使用`LocalDateTime`等时间类型,且需要在前端自定义格式化并渲染 ### 场景二 - SpringBoot - Mybatis Plus - Enjoy > `Mybatis Plus`代码生成器生成的实体中时间字段对应的类型是`LocalDateTime` 使用`#date`指令自定义格式化并渲染实体时提示不支持 此时需要修改实体中的字段时间类型为`Date` 若不想修改实体,则需要手动扩展 ## 开始扩展 > 该内容参照`JFinal`官方的`Directive`实现类:`DateDirective`,实现了兼容并简化了代码 > 咳咳,兼容是兼容了,测试没做多少,我只测试了`LocalDateTime`,毕竟其他的时间类我也没有现成的代码去测试`( ̄▽ ̄)~*` 新建一个`MyDateDirective`类(别问为啥叫`MyDateDirective`,因为我也不知道命名啥好),内容如下 ```java import java.io.IOException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAccessor; import java.util.Date; import com.jfinal.template.Directive; import com.jfinal.template.Env; import com.jfinal.template.TemplateException; import com.jfinal.template.expr.ast.Expr; import com.jfinal.template.expr.ast.ExprList; import com.jfinal.template.io.Writer; import com.jfinal.template.stat.ParseException; import com.jfinal.template.stat.Scope; /** * #date 日期格式化输出指令 * * 三种用法:<br> * 1:#date(createAt) 用默认 datePattern 配置,输出 createAt 变量中的日期值<br> * 2:#date(createAt, "yyyy-MM-dd HH:mm:ss") 用第二个参数指定的 datePattern,输出 createAt 变量中的日期值<br> * 3:#date() 用默认 datePattern 配置,输出 “当前” 日期值 * * 注意:<br> * 1:#date 指令中的参数可以是变量,例如:#date(d, p) 中的 d 与 p 可以全都是变量<br> * 2:默认 datePattern 可通过 Engine.setDatePattern(...) 进行配置 * * @author Max_Qiu */ public class MyDateDirective extends Directive { private Expr valueExpr; private Expr datePatternExpr; private int paraNum; @Override public void setExprList(ExprList exprList) { this.paraNum = exprList.length(); if (paraNum > 2) { throw new ParseException("#date 指令最多两个参数", location); } if (paraNum == 0) { this.valueExpr = null; this.datePatternExpr = null; } else if (paraNum == 1) { this.valueExpr = exprList.getExpr(0); this.datePatternExpr = null; } else if (paraNum == 2) { this.valueExpr = exprList.getExpr(0); this.datePatternExpr = exprList.getExpr(1); } } @Override public void exec(Env env, Scope scope, Writer writer) { if (paraNum == 1) { outputWithDatePattern(scope, env.getEngineConfig().getDatePattern(), writer); } else if (paraNum == 2) { Object datePattern = this.datePatternExpr.eval(scope); if (!(datePattern instanceof String)) { throw new TemplateException("#date 指令的第二个参数类型必须是 String", location); } outputWithDatePattern(scope, (String)datePattern, writer); } else { write(writer, LocalDateTime.now(), env.getEngineConfig().getDatePattern()); } } private void outputWithDatePattern(Scope scope, String datePattern, Writer writer) { Object value = valueExpr.eval(scope); if (value instanceof TemporalAccessor) { write(writer, (TemporalAccessor)value, datePattern); } else if (value instanceof Date) { write(writer, (Date)value, datePattern); } else if (value != null) { throw new TemplateException("#date 指令的第一个参数必须是实现TemporalAccessor接口的时间类型或者是Date类型", location); } } private void write(Writer writer, TemporalAccessor temporal, String datePattern) { String s; try { s = DateTimeFormatter.ofPattern(datePattern).format(temporal); } catch (Exception e) { throw new TemplateException("格式化出错,请检查第二个参数:" + datePattern, location, e); } try { writer.write(s, 0, s.length()); } catch (IOException e) { throw new TemplateException(e.getMessage(), location, e); } } private void write(Writer writer, Date date, String datePattern) { try { writer.write(date, datePattern); } catch (IOException e) { throw new TemplateException(e.getMessage(), location, e); } } } ``` ## 开始使用 ### JFinal 在`configEngine(Engine me)`中添加如下代码 ```java // 移除官方的指令 me.removeDirective("date"); // 加入自己的扩展指令 me.addDirective("date", MyDateDirective.class, true); ``` ### SpringBoot 在`JFinalEnjoyConfig`内添加如下代码 ```java JFinalViewResolver resolver = new JFinalViewResolver(); // 其他配置代码略... // 获取Engine引擎 Engine engine = resolver.getEngine(); // 移除官方的指令 engine.removeDirective("date"); // 加入自己的扩展指令 engine.addDirective("date", MyDateDirective.class, true); ``` ***完成!***
26
全部评论