Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 402|回复: 0

[Java框架学习]FreeMarker ObjectWrapper使用测试

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-4 00:00:42 | 显示全部楼层 |阅读模式
    先学习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 :
         <#&#65533;
         以下方法有问题
         User is : <br>
         &#65533;>
    </#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
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-17 17:51 , Processed in 0.364333 second(s), 48 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表