对象包装
当往容器中添加一些对象时,可以是任意java对象类型的参数,而不一定是TemplateModel。这是因为模板实现会默默地用合适的TemplateModel对象来替换原有对象。比如向容器中加入一个String,也许它将被替换为一个SimpleScalar实例来存储相同的文本。
至于什么类型的Java对象可以被替换,又使用什么样的TemplateModel来实现,它可以被实现的容器自身来控制,也可以委派给ObjectWrapper的一个实例。
ObjectWrapper是一个接口,其中只定义了一个方法:TemplateModel wrap(java.lang.Object obj)。可以传递一个object类型的对象,它会返回对应的TemplateModel对象,如果不行则抛出TemplateModelException一场。替换原则是在ObjectWrapper的实现类中编码实现的。
最重要的ObjectWrapper实现类是FreeMarker核心包提供的:
ObjectWrapper.DEFAULT_WRAPPER:
它使用SimpleScalar替换String,SimpleNumber替换Number
SimpleSequence来替换List和数组,
SimpleHash来替换Map,
TempalteBooleanModel.true和TempalteBooleanModel.false来替换boolean
ObjectWrapper.BEANS_WARPPER:它可以通过反射java机制来获取java bean属性和其他任意对象类型的成员变量