Freemarker

时间:2015-05-23 19:23:36

标签: java templates freemarker

我的用例是为用户提供在模板引擎的帮助下创建报表的可能性。因此,我提取了我的数据模型的相关部分,并将Freemarker集成为模板引擎。 到目前为止它工作得很好,但现在我的数据模型包含某些位置的继承 - 但Freemarker似乎不支持操作的实例?如何处理这个问题?是否有其他模板引擎支持模型中的继承?

虚构的例子:

我有两节课#34; Car"和" Bike"其中包括" Vehicle"。该模型包含一个类"车队"其中包含车辆清单。用户希望(在模板的帮助下)遍历列表并在汽车的情况下写入属性" countSeats",在自行车的情况下,属性"帧大小"。如何通过Freemarker实现这一目标?可以在任何模板引擎中完成吗?

非常感谢提前!

//编辑:不幸的是,不可能将列表与多个列表中的超类一起拆分并使用'具体的'对象,因为列表中的车辆顺序(在上例中)是必不可少的。

4 个答案:

答案 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)>