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() 了,而这个也不太算上是反射了,性能是相当高的