JFinal Enjoy 模板 Map 定义表达式使用技巧

   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 版本。

评论区

l745230

2018-02-28 17:06

沙发

絮随风

2018-02-28 17:15

很强

netwild

2018-03-01 00:06

很巧妙~学习了

flyinkeke

2018-03-01 18:29

厉害了

大龙

2018-03-02 09:21

我一般通过国际化方式来处理

zhongshg

2018-03-02 13:22

JFinal的魅力就在这曲径通幽处,让人使用起来欲罢不能

JFinal

2018-03-02 16:50

@zhongshg jfinal enjoy 引擎的表达式在与 java 打通的基础上,做了极少的有助于用户体验的增强,例如本贴中的功能不仅支持 {1:'自买', 2:'跟买'}.get(type), 还支持:
{1:'自买', 2:'跟买'}[type]

如果懒得学习这类增强的用法,当成 java 去用也很方便

针对某个语言去写模板引擎,必须要与其语言直接打通的设计理念,这个在 jfinal enjoy 看来是极为自然的事情,可惜 freemarker velocity 之类的并没有这么做

陈伟

2018-03-03 08:51

厉害了!

hczyh888

2018-03-09 09:16

lyh061619

2018-04-26 10:37

@JFinal 这有有待调整,如:
#for(user : userPage.list)
#({1:'男', 2:'女'}.get(user.sex) ?? '-')
#end
1、当userPage.list为null或空时,也会进入for循环处理里面的#({1:'男', 2:'女'}.get(user.sex) ?? '-'),提示这个错误:com.jfinal.template.stat.ParseException: Expression error: the value of map key must be identifier or String,正确应该是当userPage.list为null跳过for循环的处理。
2、当userPage.list不为null或空,且user.sex不为空值为:整形1和2,都抛出上面的异常。

lyh061619

2018-04-26 10:50

@JFinal 以上问题在3.4改进了,问题只存在3.3版本。波总你这个补漏的速度够快的呢。^_^!!^_^!!

热门分享

扫码入社