在 Freemarker 中使用动态生成的名称调用函数
Call function with dynamically generated name in Freemarker
我能否从 Java 对象中调用函数,该对象已从几个字符串生成名称?在我的示例中,它是一个简单的 getter。只是好奇。
进程是一个 Java 对象,如下所示:
public class Process {
private int number = 0;
public int getNumber() {
return this.number;
}
public String getPropertyName() {
return "number";
}
}
假设我们将 Process 对象作为变量 process 传递到 freemarker 模板中,如下所示:
return Results.html().render("process", new Process());
现在我们有一个包含以下代码的 html 页面。我想到的方法应该像这个例子一样做(这个例子不起作用!):
<#assign methodName = "process.get" + process.getPropertyName()?cap_first + "()">
<input name="${process.getPropertyName()}" type="number" value="${methodName}"/>
html中解释的结果是这样的:
<input name="number" type="number" value="process.getNumber()"/>
但它只是一个字符串,不会在 freemarker 模板中解释为存储在方法中的值。
你怎么看,有没有办法实现这个?
如果只想动态访问某个字段,那么可以这样写:
<input name="${process.propertyName}" type="number" value="${process[process.propertyName]}"/>
但是如果你真的想调用方法,那么你可以尝试 eval
:
<input name="${process.getPropertyName()}" type="number" value="${methodName?eval}"/>
我能否从 Java 对象中调用函数,该对象已从几个字符串生成名称?在我的示例中,它是一个简单的 getter。只是好奇。
进程是一个 Java 对象,如下所示:
public class Process {
private int number = 0;
public int getNumber() {
return this.number;
}
public String getPropertyName() {
return "number";
}
}
假设我们将 Process 对象作为变量 process 传递到 freemarker 模板中,如下所示:
return Results.html().render("process", new Process());
现在我们有一个包含以下代码的 html 页面。我想到的方法应该像这个例子一样做(这个例子不起作用!):
<#assign methodName = "process.get" + process.getPropertyName()?cap_first + "()">
<input name="${process.getPropertyName()}" type="number" value="${methodName}"/>
html中解释的结果是这样的:
<input name="number" type="number" value="process.getNumber()"/>
但它只是一个字符串,不会在 freemarker 模板中解释为存储在方法中的值。
你怎么看,有没有办法实现这个?
如果只想动态访问某个字段,那么可以这样写:
<input name="${process.propertyName}" type="number" value="${process[process.propertyName]}"/>
但是如果你真的想调用方法,那么你可以尝试 eval
:
<input name="${process.getPropertyName()}" type="number" value="${methodName?eval}"/>