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 的配置就可以了