2022-11-10 23:42
@yjjdick1990 可能加个 servlet, druid 的控制台可以通过 servlet 支持,也有可能是通过 Filter 支持,要看看它的文档
2022-09-28 20:54
@杜福忠 我觉得你这个方向很有前景,业务逻辑才是应用软件的核心,UI 尽可能最低成本最高效率实现是大势所趋,UI 在未来都该组件化
2022-09-25 20:04
@zzutligang 对每个方法都去父类拿它的注解,而父类还有可能有父类,代价太大
而这个需求几乎无人提及
你在子类中不使用 @Before 覆盖父类的是自动拿到的,使用 @Before 以后要注意将父类的拦截器一并放在当前方法
2022-09-24 23:26
你的实现思路是非常好的,但是代码量有点多了,我刚刚写了一个版本,你试用一下:
1: 定义一个 #template 指令,该指令至少需要一个参数传递模板名,其它参数可任意,例如可传递赋值表达式传值进去:#template("template.txt", title="enjoy")
public class TemplateDirective extends Directive {
@Override
public void setExprList(ExprList exprList) {
if (exprList.length() < 1) {
throw new ParseException("#template 指令至少需要 1 个参数", location);
}
super.setExprList(exprList);
}
@Override
public void exec(Env env, Scope scope, Writer writer) {
if (scope.getRootData() == null) {
scope.setRootData(new HashMap());
}
// 将指令内部的全部内容传递给 #slot 指令去使用
Object[] values = exprList.evalExprList(scope);
String templateFile = values[0].toString();
scope.getRootData().put("__slotStat__", stat);
// 指令自身直接渲染参数传递的模板就行
StringBuilder sb = Engine.use().getTemplate(templateFile).renderToStringBuilder(scope.getRootData());
write(writer, sb.toString());
}
public boolean hasEnd() {
return true;
}
}
2: 定义一个 #slot 插槽指令
public class SlotDirective extends Directive {
@Override
public void exec(Env env, Scope scope, Writer writer) {
Object slotStat = scope.getRootData().get("__slotStat__");
if (slotStat == null) {
throw new TemplateException("slotStat 未找到", location);
}
if (slotStat instanceof Stat) {
((Stat)slotStat).exec(env, scope, writer);
}
}
}
测试代码:
1: 模板文件 template.txt 的内容如下:
AAA
#slot()
ZZZ
2: 测试用的主模板 test.txt 内容如下:
#template("template.txt")
#for (x : [0..3]) #(x) #end
#end
3: java 测试代码如下
public class Test {
public static void main(String[] args) {
Engine.use().setToClassPathSourceFactory();
Engine.use().addDirective("template", TemplateDirective.class);
Engine.use().addDirective("slot", SlotDirective.class, true);
String ret = Engine.use().getTemplate("test.txt").renderToString(Kv.create());
System.out.println(ret);
}
}