jfinal 俱乐部有位小伙伴提了一个小需求,希望按如下规则输出如下数据:
1:当 type 为 1 时输出 '自买' 2:当 type 为 2 时输出 '跟买' 3:当 type 为其它值时出 '-'
常规的办法如下:
#if(type == 1) #('自买') #else if(type == 2) #('跟买') #else #('-') #end
但上面的代码量比较多,如果 type 的值有几十个的话, if else 分支数目将是一场灾难,有没有更好的办法呢? 答案当然是肯定的:
#({1:'自买', 2:'跟买'}.get(type) ?? '_')
如上代码所示,通过先自定一个 map 的方式,利用一个 key 值来取值可以极大减少代码量,并且十分利于理解。
此外,上面代码中的 key 还可以使用 java 类中定义的常量,例如 {com.Const::TYPE_ZIMAI : '自买'},这样来用更有利于 type 值的维护
以上示例代码中 Map 定义时的 key 必须是String、int、long、float、double、true、false、null 常量以及 ID 标识符,而不能是表达式,当碰到需要使用表达式求值后的结果作为 key 值时可以使用如下方法:
#(sex={}, sex.put(user.sex, "checked"), sex.put(user.sex, "checked" , null) <input type="checkbox" #(sex["男"]) >
如上代码所示, sex 这个 map 需要使用 user.sex 表达式求值后的结果作为 key,可以先定义一个空的 map,然后再使用 map.put(...) 将值写入。
俱乐部众多小伙伴,不断从实践、提问中挖掘出来 jfinal 的很多好用的功能并乐在其中。
jfinal 很多用法并不是在设计之初就规划好的,而是 jfinal 基于一整套极简设计思想构建出来以后,自然涌现出来的多样性,根本性要素通过组合所表现出来的灵活、强大远远超出设计者预期
注意:map 定义表达式支持 key 为非 String 与非 Identify 类型,需要使用 jfinal-3.4 版本。