TA的每日心情  | 开心 2021-3-12 23:18 | 
|---|
 
  签到天数: 2 天 [LV.1]初来乍到  
 | 
 
| 
 
 先学习freemarker Programmer Guide中对ObjectWrapper的说明:      FreeMarker 数据容器(root)可以放置任意的对象,而不一定就是实现了TemplateModel 接口的对象。这是为什么呢?!因为FreeMarker 提供的容器实例会在其内部把放置在其中的对象自动转换成实现了TemplateModel 接口的对象。比如说, 
 如果你放置一个String 对象在容器中, 它就会把String 对象在内部自动转换成SimpleScalar。 
  
     至于何时发生转换,这是容器自身逻辑的问题。但是最晚也会在获取子变量的时候进行转换,因为获取子变量方法会返回TemplateModel 对象而不是Object 对象。例如,SimpleHash,SimpleSequence 和SimpleCollection 使用延迟转换策略(laziest 
 strategy);它们会在第一次获取子变量的时候把其他类型的对象转换成TemplateModel类型。 
  
     至于什么类型的对象可以被转换,以及具体转换成何种类型,一方面容器自身可以处理,另一方面也可以把它委托给ObjectWrapper 实例去处理。  
   
     
     
      
     
 
      
     
   
  
  
  
   ObjectWrapper 是一个接口,具有一个方法TemplateModel wrap(java.lang.Object obj)。用户可以传递一个Object 对象,它就会返回一个与之对应的TemplateModel 对象,或者抛出异常。这些转换规则是写死在ObjectWrapper 实现里面的。 
   
  
   
     FreeMarker 提供的ObjectWrapper 重要的实现有: 
   
  
  ObjectWrapper.DEFAULT_WRAPPER :它可以把String 转换成SimpleScalar ,Number 转换成SimpleNumber,List 和array 转换成SimpleSequence,Map 转换成SimpleHash,Boolean 转换成TemplaeBooleanModel.TRUE/FALSE 等等。(对于其他的类型对象的转换就要调用BEANS_WRAPPER) 
   
  
   
  
  ObjectWrapper.BEANS_WRAPPER:它可以使用反射访问任意JavaBean 的属性  
      对于Freemarker中如果使用HashMap(或SimpleHash)时候,如果HashMap的键值对(key,value)的value是普通的Scalar对象(String、Double等),此种情况下,对于ObjectWrapper可以直接使用DEFAULT_WRAPPER,在Freemarker模板文件中使用也相对简单,只需要采用如下方式即可:  
  <#list scalarMap? keys as mykey> 
     Scalar Map key is : 
     Scalar Map value is: 
 </#list>  
      但如果Map的value是JavaBean对象(例如JavaBean为User,有userId和userName两个属性),如果需要在Freemarker模板文件中使用类似el表达式的方式获取JavaBean的属性值,也即:,此种情况下不能采用缺省的DEFAULT_WRAPPER,需要使用ObjectWrapper.BEANS_WRAPPER。  
      当然如果在Freemarker模板文件中不需要获取JavaBean对象的属性值,也即只需要获取对象本身:,则也可以不使用ObjectWrapper.BEANS_WRAPPER。 
  
  1、测试用例  
  import java.io.StringWriter; 
 import java.util.ArrayList; 
 import java.util.HashMap; 
 import java.util.List; 
 import java.util.Locale; 
 import java.util.Map; 
 import freemarker.template.Configuration; 
 import freemarker.template.ObjectWrapper; 
 import freemarker.template.SimpleHash; 
 import freemarker.template.SimpleSequence; 
 import freemarker.template.Template; 
 public class FreeMarkerTest { 
     public static void main(String[] args){ 
         FreeMarkerTest test = new FreeMarkerTest(); 
         test.sayHelloWorld(); 
     } 
     public void sayHelloWorld(){ 
         Configuration freemarkerCfg = new Configuration(); 
         freemarkerCfg.setClassForTemplateLoading(this.getClass(), “/”); 
         freemarkerCfg.setEncoding(Locale.getDefault(), “GBK”); 
         Template template; 
         Locale.setDefault(Locale.SIMPLIFIED_CHINESE); 
         try{ 
             template = freemarkerCfg.getTemplate(“HelloWorld.ftl”); 
             template.setEncoding(“GBK”);  
              User user1=new User(); 
             user1.setUserId(“1″); 
             user1.setUserName(“1″);  
              User user2=new User(); 
             user2.setUserId(“2″); 
             user2.setUserName(“2″);  
              User user3=new User(); 
             user3.setUserId(“3″); 
             user3.setUserName(“3″);  
              User user4=new User(); 
             user4.setUserId(“4″); 
             user4.setUserName(“4″); 
             User user5=new User(); 
             user5.setUserId(“5″); 
             user5.setUserName(“5″); 
             User user6=new User(); 
             user6.setUserId(“6″); 
             user6.setUserName(“6″);  
              List scalarList = new ArrayList(); 
             scalarList.add(“red”); 
             scalarList.add(“green”); 
             scalarList.add(“blue”); 
             SimpleHash root = new SimpleHash(ObjectWrapper.BEANS_WRAPPER); 
             root.put(“scalarString”, “Scalar String Test”); 
             root.put(“scalarNumber”, new Integer(3)); 
             root.put(“scalarObject”, new User(“33″,”33″)); 
             root.put(“scalarList”, scalarList); 
             SimpleHash scalarMap=new SimpleHash(ObjectWrapper.BEANS_WRAPPER);     
             root.put(“scalarMap”, scalarMap); 
             scalarMap.put(“anotherString”, “aaaaaaaa”); 
             scalarMap.put(“anotherNumber”, new Double(3.14)); 
             SimpleSequence userList=new SimpleSequence(ObjectWrapper.BEANS_WRAPPER); 
             root.put(“userList”, userList); 
             userList.add(user1); 
             userList.add(user2); 
             userList.add(user3); 
             userList.add(user4);             
             userList.add(user5); 
             userList.add(user6); 
             SimpleHash userMap=new SimpleHash(ObjectWrapper.BEANS_WRAPPER);         
             root.put(“userMap”, userMap); 
             userMap.put(“1″, user1); 
             userMap.put(“2″, user2);             
             userMap.put(“3″, user3); 
             userMap.put(“4″, user4); 
             userMap.put(“5″, user5); 
             userMap.put(“6″, user6);  
              StringWriter writer = new StringWriter(); 
             template.process(root, writer); 
             System.out.println(writer.toString()); 
         }catch(Exception e){ 
             e.printStackTrace(); 
         }} 
 } 
  
  2、HelloWorld.ftl  
  Scalar String:     
 Scalar Number: 
 Object is:  
  List使用样例-List元素为Scalar对象:  
  <#list scalarList as value0> 
     Scalar List值:  
 </#list>  
  List使用样例-List元素为User对象:  
  <#list userList as listUser> 
     List对象User Id值:  
 </#list>  
  Map使用样例-Map Values元素为Scalar :  
  <#list scalarMap?keys as mykey> 
     Scalar Map key is : 
     Scalar Map value is: 
 </#list>  
  Map使用样例-Map Values元素为User对象:  
  <#list userMap?keys as key1> 
     <#assign mapUser=”” > 
     User Object is : 
     <#�  
     以下方法有问题  
     User is : <br> 
     �> 
 </#list>  
  3、User.java  
  public class User { 
     private String userId; 
     private String userName; 
     public User(){ 
     } 
     public User(String userId,String userName){ 
         this.userId = userId; 
         this.userName = userName; 
     } 
     public String getUserId() { 
         return userId; 
     } 
     public void setUserId(String userId) { 
         this.userId = userId; 
     } 
     public String getUserName() { 
         return userName; 
     } 
     public void setUserName(String userName) { 
         this.userName = userName; 
     } 
 }  
  运行结果:  
   
 C:src>java FreeMarkerTest 
 log4j:WARN No appenders could be found for logger (freemarker.cache). 
 log4j:WARN Please initialize the log4j system properly. 
 Scalar String:Scalar String Test 
 Scalar Number:3 
 Object is:User@10ef90c 
 List使用样例-List元素为Scalar对象:  
  Scalar List值:red 
 Scalar List值:green 
 Scalar List值:blue  
  List使用样例-List元素为User对象: 
 List对象User Id值:1 
 List对象User Id值:2 
 List对象User Id值:3 
 List对象User Id值:4 
 List对象User Id值:5 
 List对象User Id值:6  
  Map使用样例-Map Values元素为Scalar : 
 Scalar Map key is :anotherString 
 Scalar Map value is:aaaaaaaa 
 Scalar Map key is :anotherNumber 
 Scalar Map value is:3.14  
  Map使用样例-Map Values元素为User对象:  
   User Object is :User@fe64b9 
 User Object is :User@186db54 
 User Object is :User@a97b0b 
 User Object is :User@cd2c3c 
 User Object is :User@13582d 
 User Object is :User@21b6d  
     
  C:src>  
   
  
                         
        -->  
  
  
  
   
   
     
     
 
      
     
 
      
     
   
 
源码下载:http://file.javaxxz.com/2014/11/4/000042078.zip |   
 
 
 
 |