2017-12-05 11:34
@Dreamlu jfinal-java8 这个 jfinal 版本的 action 参数注入并不依赖于 cglib,而是 java8 自带的 API
cglib 目前仅用于支持业务层 AOP,而且也只是个过渡,有时间会将 cglib 干掉,让 jfinal 重回“对第三方无依赖”
2017-12-04 17:12
根据 @lyh061619 的回复设置一下就可以了:
arp.setTransactionLevel(2);
因为 oracle 不支持 transaction level 为 4。jfinal 只有一个版本才出这个提示,其它版本处理过 oracle 下的 transaction level
2017-12-04 16:35
jfinal 的模板引擎确实还没有整合到 struts 中去,但是只要看一下 jfinal 手册的 第 6.11 章节《 任意环境下使用 Engine》,就知道如何在任意环境下使用了
大致就是先配置,后使用:
1:配置:Engine.use().setBaseTemplatePath(...)
2:使用:Engine.use().getTemplate(fileName).render(...)
render 方法中的参数,可以参考一下 jfinal 中的 com.jfinal.render.TemplateRender 中的用法,就是从 request 中获取一个 outputStream 来用:
OutputStream os = requet.getOutputStream();
Engine.use().getTemplate(fileName).render(data, os);
如果你用到了 shared method、shared function 功能,也就是再添加两行代码的事:
1:Engine.use().addSharedFunction("layout.html");
2:Engine.use().addSharedMethod(new StrKit());
无论是配置,还是使用,代码量都少得惊人
2017-12-04 16:08
再补充一下,上面的所说的一切,仅仅针对于 #define 定义的 template function 而言,而表达式中调用 java 方法时,与 java 规则完全一样,例如:
#("abc".substring(1))
#("abc".substring(0, 2))
上面的 substring 方法调用的是 java 中的 String 类型的两个重载过的 substring 方法,这类调用是支持通过不同的参数个数、不同的参数类型,去调用不同的重载方法的
除了上面的调用 java 类上的方法以外,jfinal 的 shared object、shared method、extension method 这三种扩展全都支持方法重载
2017-12-04 16:03
用 #define 定义的 template function 的参数个数是固定的,除了性能方面的考虑,本质上是模板引擎是动态类型,不方便像java一样通过类型去判断调用的是哪个重载方法。
此外, template function 天然就支持更方便的传参方式,所以就更加没有必要像 java 那样实现,例如,你可在定义时只使用一个参数,例如:
#define layout(map)
#(map.title)
#(map.desc)
#end
传参的时候这样:
#@layout({title : "JFinal 极速开发社区" , desc: "天下武功,唯快不破"})
通过上面的方式,你可以传递任意类型,任意数量的参数进去
除了以上的方式传参以外,还可以通过 #set(...) 指令在模板中任意传参,例如:
#define layout()
#(title)
#(desc)
#end
用的时候这样:
#set(title = "JFinal", desc = "天下武功,唯快不破")
#@layout()
第二种方式相当于将参数从调用向前挪到了 #set 指令中
通过上面两种用法可以看出来,虽然 jfinal enjoy 引擎没有通过参数个数与参数类型进行函数重载,但传参可以更加自由灵活。
本质上是因为动态类型不方便通过参数的变数来实现重载
2017-12-04 11:22
如果是在 jfinal 中用,那么 @杜福忠 的分享就极好
如果是整合在 spring 中用,需要在 spring 的配置文件中为 不同的 ViewResolver 配置上不同的 order、suffix,重点关注册 spring 的配置就可以了