我的用例是为用户提供在模板引擎的帮助下创建报表的可能性。因此,我提取了我的数据模型的相关部分,并将Freemarker集成为模板引擎。 到目前为止它工作得很好,但现在我的数据模型包含某些位置的继承 - 但Freemarker似乎不支持操作的实例?如何处理这个问题?是否有其他模板引擎支持模型中的继承?
虚构的例子:
我有两节课#34; Car"和" Bike"其中包括" Vehicle"。该模型包含一个类"车队"其中包含车辆清单。用户希望(在模板的帮助下)遍历列表并在汽车的情况下写入属性" countSeats",在自行车的情况下,属性"帧大小"。如何通过Freemarker实现这一目标?可以在任何模板引擎中完成吗?
非常感谢提前!
//编辑:不幸的是,不可能将列表与多个列表中的超类一起拆分并使用'具体的'对象,因为列表中的车辆顺序(在上例中)是必不可少的。
答案 0 :(得分:4)
Uglier解决方案
<#if yourObject.class.simpleName == "Simple class name like String">
something
</#if>
<#if yourObject.class.simpleName == "other simple class name">
do something else
</#if> `
答案 1 :(得分:3)
没有内置任何东西,但它也不一定是。您可以编写自己的TemplateMethodModelEx
,或者将普通的Java帮助程序对象放入数据模型中以执行任何操作。或者,您可以将相关类放入数据模型中,例如root.put("Car", Car.class)
等,然后使用Class
的Java API,如下所示:<#if Car.isInstance(someObject)>
答案 2 :(得分:1)
使用TemplateMethodModelEx
解决方案。
类别:
public class InstanceOfMethod implements TemplateMethodModelEx {
@Override
public Object exec(List list) throws TemplateModelException
{
if (list.size() != 2) {
throw new TemplateModelException("Wrong arguments for method 'instanceOf'. Method has two required parameters: object and class");
} else {
Object object = ((WrapperTemplateModel) list.get(0)).getWrappedObject();
Object p2 = ((WrapperTemplateModel) list.get(1)).getWrappedObject();
if (!(p2 instanceof Class)) {
throw new TemplateModelException("Wrong type of the second parameter. It should be Class. Found: " + p2.getClass());
} else {
Class c = (Class) p2;
return c.isAssignableFrom(object.getClass());
}
}
}
}
将该类的实例和所有必需的类放到模板的输入参数中:
parameters.put("instanceOf", new InstanceOfMethod());
parameters.put("Car", Car.class);
...
或者您可以向共享变量添加方法:http://freemarker.org/docs/pgui_config_sharedvariables.html
所以你可以在FTL中使用这个方法如下:
<#if instanceOf(object, Car)>
...
</#if>
答案 3 :(得分:0)
这似乎对我有用:
<#if mypackage.Car.class.isInstance(object)>