2021-02-05 19:44

我不知道是 fst 版本太低导致还是 jfinal 的封装导致

希望你在你的项目中改一改实现,看能不能解决,因为你现在正处于这个环境下,最方便

改造的办法可以是通过扩展 ISerializer ,然后通过 redisPlugin.setSerializer(ISerializer) 切换成自己的

2021-02-05 19:41

String sql = "select table_name from information_schema.tables where table_name = ?"
String tableName = Db.queryStr(sql, 这里输入你要查的表名);
if (tableName != null)
存在
else
不存在

2021-02-04 20:50

@yiditushe 只要方法名是 index,意味着 url 中必须省掉 index,但 jfinal 也为你提供了打破这个限定的方法,那就是使用 @ActionKey,例如:
@ActionKey("/index")
public void index() {
...
}

还可以使用路由扫描功能的 @Path 注解来实现,例如:
@Path("/index")
public class MyController extends Controller {
public void index() {
...
}
}

2021-02-04 20:47

指令嵌套不是这么用的,而是这么用的:
#xxx()
#yyy()
#end

也就是说,指令内部再使用指令

而你的用法:#escape(escape(xxx)) , 其中的内部的 escape(xxx) 是指令 #escape 的参数,千万别搞混

你的用法,内部的 escape(xxx) 用法叫: shared method 调用,可以极其方便去添加一个 escape(...),方法如下:
public class Xxx {
public String escape(String str) {
return MyKit.escape(str);
}
}

最后再配置一下:
engine.addShardMethod(new Xxx());

然后就可以这么用了:
#escape(escape(xxx))

指令与 shared method 的区别一定要搞清楚

2021-02-04 20:25

service 层的调用,你拿到手的是一个明确的类型,例如:
XxxService xxx = Aop.get(XxxService.class);
或者:
@Inject
XxxService xxx;

调用时是这样:
xxx.method(...);

而 controller 层的 action 调用方是 jfinal 框架,而 jfinal 框架在调用时拿到的仅仅是一个 url + para,一般是这样:
"/admin/article/delete?id=123"

通过 url 去对应一个对象上的方法的调用,与业务层是完全不同的,多少要有点反射的代码

所以,业务层的方案是无法消灭这里的反射的,controller 层的 AOP 改为使用业务层的模式也无法消除,所以还是保持原设计为好

原设计已将反射降到最低了,观察一下 action 的 java.lang.Method 的获取,只在初始化时进行一次

唯一的反射就只有 Method.invoke() 了,而这个也不太算上是反射了,性能是相当高的

2021-02-04 18:39

补充一下,checkUrlPara(int) 还可以限定参数个数,例如:
checkUrlPara(3);

就可以限定 urlPara 只能有三个,前面的方案一是限定了参数个数为 0。

checkUrlPara(int) 检测到 urlPara 参数个数不正确时,会返回 404 页面

2021-02-04 18:38

http://HOST/index,能正确识别,这个是将 "index" 当成 urlPara 而已,你在控制台的输出中能看到:
urlPara: index

如果不希望有 urlPara,可以在 index 中通过下面两种方式之一即可:
1:使用 checkUrlPara(0) 限定不使用 urlPara
public void index() {
checkUrlPara(0);
...... 其它代码在此
}

2:使用拦截器
@Before(NoUrlPara.class)
public void index() {
...... 其它代码在此
}

两种方法任选其一


一般来说 urlPara 是默认开启的,没有限制,但脑海中要有这根弦存在。此外,多关注一下控制台输出的 jfinal action report, 各种参数都有输出

2021-02-04 18:04

1:service 默认的 proxy 依赖于 JDK 中的 tools.jar,如果你是 JRE 那么没有这个 tools.jar,需要添加配置改为使用 cglib:
me.setToCglibProxyFactory();

这里有详细说明:
https://jfinal.com/doc/4-8

2:controller 的 AOP 用的是最直接的递归调用,不依赖于任何第三方机制。在往期俱乐部视频中详细讲了这个设计

虽然 service 层与 controller 层的 AOP 用到了不同的实现方式,但对外开放的 API 以及一套使用方式是一样的,例如都是用的 @Before(...) 以及 Interceptor

2021-01-29 13:30

UserWeekRewardService 有没有继承什么类或者实现什么接口,而继承的类或者接口所需要的 jar 包是否存在?

还要看看 UserWeekRewardService 内部有什么地方依赖不满足,例如构造方法中对外部类有依赖没满足

最后, jfinal 升级到 4.9.06 看一看

解决后来反馈一下,这个问题比较奇怪

2021-01-28 17:11

目前感觉比较好的办法是:
1:迭代所有 model,获取这些 model 中所涉及的所有字段名
2:以所有字段名为蓝本生成 sql,这样就不会漏掉字段名了
3:但还是解决不了那些 model 中没有指定字段值要给定什么值的问题,给定 null 值可能是不适合的,因为这个字段在数据库中可能已经有值了,给定 null 值相当于是将其删掉

有时候吧,我们做越多,涌现出的问题也就越多,当解决一个问题的时候如果冒出来的问题个数相等或者更多,或者更麻烦,那还不如不解决, 而是约定、限制我们自己的行为

2021-01-28 17:07

是个办法,但比较麻烦,还不如 batch 操作前先对所有 model 迭代扫描,找出拥有最多字段个数的 model,以它为蓝本生成 sql

但上面方法也有缺陷,因为最多字段个数的 model 在如下情况下也不能作为生成 sql 的蓝本,例如:
1:假定 model a 拥有 a,b,c 三个字段值
2:假定 model b 拥有 b,c,d 三个字段值
3:以上情况,字段值数量是一致的,但字段名本身不一致
4:当然,可以更进一步,在迭代的时候获取所有字段名来生成 sql,得到 a,b,c,d 四个字段

2021-01-27 20:47

@一只敲代码的猫 老版本可以照抄 getRawData() 里头的源码,也就两行代码

2021-01-27 16:48

@一只敲代码的猫

客户端发 json 是很方便的, 有很多同学并不知道浏览器中通过 js 代码也能发 json 数据,其实很方便:
function ajaxPostJson(url, jsonString, callback) {
$.ajax({
url: url, data: jsonString,
contentType: 'application/json; charset=UTF-8', // 关键参数
type: 'POST', cache: false, dataType: 'json',
error: function(ret) {alert(ret.statusText);},
success: function(ret) {....}
});
}

注意关键参数是:
contentType: 'application/json; charset=UTF-8'

注意上面的例子依赖 jquery