Enjoy里面要输出一个对象属性,但这个属性名是另一个对象的属性值,如何写?

public class Size {
    private int width;
    private int height;
    public Size(int width, int height) {
        this.width = width;
        this.height = height;
    }
    public int getWidth() {
        return width;
    }
    public void setWidth(int width) {
        this.width = width;
    }
    public int getHeight() {
        return height;
    }
    public void setHeight(int height) {
        this.height = height;
    }
}
public class Attr {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
}


Controoler代码片断:

List datalist = new ArrayList<>();
datalist.add(new Size(50, 50));
datalist.add(new Size(500, 500));
Attr attr = new Attr();
attr.setName("width");        
set("datalist", datalist);
set("attr", attr);

html页面:

#(attr.name) //输出值:width
#for(data : datalist)        
  #(data.attr.name)  //本意是想得到 data.width的值,但不能直接写 #(data.width),请问这里应该怎么办才好?
#end

尝试了以下三种方法都不得行:

#(data[attr.name])  //报错:Only the list array and map is supported by index access

#(data.attr.name)  //报错:public field not found: "data.attr" and public getter method not found: "data.getAttr()"

#(data.get(attr.name)) //报错:public method not found: com.jfinal.admin.common.Size.get(java.lang.String)

============感谢大神提供改造思路,修改以下代码正常========================

public class Size<M extends Size<M>> extends Model<M>{
    
    public Size(int width, int height) {
        this.setWidth(width);
        this.setHeight(height);
    }
    public int getWidth() {
        return getInt("width");
    }
    public void setWidth(int width) {
        set("width", width);
    }
    public int getHeight() {
        return getInt("height");
    }
    public void setHeight(int height) {
        set("height", height);
    }
}

html页面:

#for(data : datalist)
#(data.get(attr.name))
#end

可以正常动态获取属性值了。

评论区

杜福忠

2022-04-16 16:40

想动态取 Size 对象的方法,有多种方式,
一个是声明式:
#if('width' == attr.name)#(data.width)
#elseif('height' == attr.name)#(data.height)
#end

还有改变Size 类,使其继承Kv对象,然后去掉成员属性,this.赋值和取值改使用set 和get 方法代替。
这样模板中就可以这样动态取了:
#(data.get(attr.name))

还有其他方式,比如增加SharedMethod方法里面转调反射方法取值,
#(get(data, attr.name))
还可扩展一下Engine等

yiditushe

2022-04-16 17:05

@杜福忠 十分感谢提供思路。采用第二种方法比较适合改造比较简便,再次感谢!

杜福忠

2022-04-16 17:07

@yiditushe Enjoy模板引擎SharedMethod扩展get方法来了
https://jfinal.com/share/2552