2022-11-23 20:41

在 jfinal 中用 RedisPlugin 就好,多数 API 都封装好了,比直接用 jedis 要方便。

没有封装的 API 可以通过 Redis.call 来实现

2022-11-23 20:40

redis 是缓存,一般用于存放共享数据、热点数据,还可以辅助实现一些关系型数据库不方便实现的功能

例如,在集群架构下,存放多个节点下的账户登录信息。高并发条件下缓存库存数据等等

2022-11-15 00:07

可能是对 oceanbase 不兼容,升级一下 JDBC 驱动试一下

2022-11-12 23:54

slf4j-nop 这个就是啥也不显示,需要改依赖,而且如果使用 slf4j 需要配置:
me.setToSlf4jLogFactory();

2022-11-10 23:42

@yjjdick1990 可能加个 servlet, druid 的控制台可以通过 servlet 支持,也有可能是通过 Filter 支持,要看看它的文档

2022-10-29 17:16

要看怎么提交的,是不是发的 post 请求?

post 请求提交,注意使用 getRawData() 获取

2022-10-29 17:16

jfinal 中没有 @Table 注解,估计你是用了第三方,找找第三方的文档

2022-10-16 22:58

这几天居然没注意到这么好的分藏,点赞收藏一波

泛域名 SSL证书非常有用,目前我的 SSL 证书都还是手动一个个申请的,很不方便

2022-09-29 11:01

@杜福忠 业务封装非常深入,对 enjoy 的灵活运用趋向极致

2022-09-28 20:55

@杜福忠 json 配置 UI 怎么玩的? 贴点代码出来看看

2022-09-28 20:54

@杜福忠 我觉得你这个方向很有前景,业务逻辑才是应用软件的核心,UI 尽可能最低成本最高效率实现是大势所趋,UI 在未来都该组件化

2022-09-28 20:51

很多同学需要生成 table 注释,非常有用的分享,收藏 + 点赞一波

2022-09-25 20:04

@zzutligang 对每个方法都去父类拿它的注解,而父类还有可能有父类,代价太大

而这个需求几乎无人提及

你在子类中不使用 @Before 覆盖父类的是自动拿到的,使用 @Before 以后要注意将父类的拦截器一并放在当前方法

2022-09-24 23:26

@Leo.du @杜福忠 试用一下我这个设计,代码量一定要少,充分利用指令扩展的强大能力

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);
}
}