模板引擎中访问Model属性的问题

文档说明:
由于模板引擎的属性取值表达式极为常用,所以对其在用户体验上进行了符合直觉的扩展,field 表达式取值优先次序,以 user.name 为例:
如果 user.getName() 存在,则优先调用
如果 user 具有 public 修饰过的name 属性,则取 user.name 属性值(注意:jfinal 4.0 之前这条规则的优先级最低)
如果 user 为 Model 子类,则调用 user.get("name")
如果 user 为 Record,则调用 user.get("name")
如果 user 为 Map,则调用 user.get("name")


DictCustom dictCustom = new DictCustom().findById(id);
request.setAttribute("dictCustom", dictCustom);
在html模板中,
使用#(dictCustom.function_name??)  不能输出内容
使用#(dictCustom.functionName??) 可以输出内容

使用如下赋值方式
String s= dictCustom.getFunctionName();
request.setAttribute("s", s);
String d= dictCustom.get("function_name");
request.setAttribute("d", d);
在html模板中:
#(s)  #(d) 都可以输出内容


评论区

JFinal

2019-05-19 15:05

文档中有关 field 表达式的输出优先级已经逐一列出,这里的关键在于 “优先级” , 从上到下,只要碰到了满足的条件,后面的将会被跳过

泰山日出

2019-05-19 18:48

@JFinal 使用#(dictCustom.function_name??) 这个没有匹配项目啊 单独使用这个也没有啊,应该这么理解吧,按优先级进行输出,那么至少应该能匹配到一种模式输出啊,

JFinal

2019-05-19 19:34

@泰山日出 通过代码:
new DictCustom().findById(id)

可以猜出你的对象是 model, 那么你的 #(dictCustom.function_name??) 具体行为如下:
1:先找 dictCustom.getFunction_name() 方法,找到则调用
2:直接调用 dictCustom.get("function_name") 方法

查看一下上面两个是否可以获取到值,在 getFunction_name() 方法以及 Model.get(String) 方法中设置断点,看程序走没走这里

这里可能的问题在于:不要认为会调用 getFunctionName() 方法,这里的 getter 方法并不会理会下划线,只会将 fieldName 的首字线变大写字母,并在之前添加 "get",即:
getFunction_name()

泰山日出

2019-05-20 16:04

@JFinal 对象是 model,我的意思,当找不到getFunction_name()方法 时(实际上也确实没有,但有getFunctionName()方法,且table中有键值function_name,也即按user.get("name")这种规则是应该输出的) 按规则【如果 user 为 Model 子类,则调用 user.get("name")】来理解的话 #(dictCustom.function_name??) 应该能输出内容 才对。多谢了!!!

泰山日出

2019-05-20 16:11

@JFinal
public java.lang.String getFunctionName() {
return getStr("function_name");
}

热门反馈

扫码入社