• velocity模板实战


    场景:json配置报文转换
    遇到的问题:1.json报文转换成map,多节点如何处理?数组如何处理?
    2.velocity模板处理数组
    3.应用之间rabbitmq通讯map反序列化,数组报错?
    知识点:
    HashMap map中重要的两个方法map.containsKey()和map.contaisValue()
    #foreach($key in [0..10])
    $key
    #end
    #if($id == "")
    #end
    计数器 velocityCount
    haspmap的属性可以在模板中使用
    样例报文

     {
         "service":{
             "service_header":{
                 "name":"张三",
                 "age":"12"
             }
             "service_body":{
                  "info":[
                     {
                         "address":"上海",
                         "tel":"111"
                     },
                     {
                         "address":"北京",
                         "tel":"020"
                     }
                     
                  ]
             }
         }
      }
    

      模板配置

    {
         "service":{
             "service_header":{
                 "lastname":"${name}",
                 "age":"${age}"
             }
             "service_body":{
                  "info":[
                      #set($infos={"address":"address","telphone":"tel"})
                              #foreach($key in ${infos})
                              {
                                  #foreach($key2 in $key.keySet())
                                     #foreach($key3 in $infos.keySet())
                                        #if($key2 == $infos.get($key3))
                                           "$key3":"$key.get($key2)"
                                            #if($velocityCount != $key.size())
                                             ,
                                            #end
                                        #end
                                     #end   
                                  #end
                              }
                              #if($velocityCount != $infos.size())
                               ,
                              #end
                            #end 
                  ]
             }
         }
      } 

    测试代码

    package com.sunline.nfs.process;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.StringWriter;
    import java.util.LinkedHashMap;
    import java.util.Map;
    import java.util.Properties;
    
    import net.sf.json.JSONArray;
    import net.sf.json.JSONObject;
    
    import org.apache.velocity.Template;
    import org.apache.velocity.VelocityContext;
    import org.apache.velocity.app.Velocity;
    import org.apache.velocity.app.VelocityEngine;
    import org.springframework.core.io.ClassPathResource;
    import org.springframework.core.io.Resource;
    
    public class velocityEngine {
        static Map<String,Object> jsonMap = new LinkedHashMap<String,Object>();
        
        public static Map recursinMap(Map<String,Object> map){
            net.sf.json.JSONObject jObject = new net.sf.json.JSONObject();
            for(String key:map.keySet()){
                String str = map.get(key).toString();
                if(str.startsWith("{")){
                    /*com.alibaba.fastjson.JSONObject jObject = JSON.parseObject(str);*/
                    Map<String,Object> map2 = jObject.fromObject(str);
                    if(!map.toString().endsWith(map2.toString()+"}")){
                        int i = map.toString().indexOf(map2.toString())+1;
                        String value ="{" + map.toString().substring((i+map2.toString().length()),map.toString().length());
                        map2.put(key, value);
                    }
                    return recursinMap(map2);
                }
                else{
                    if(str.startsWith("[")){
                        JSONArray tmpMaps = JSONArray.fromObject(str);    
                        System.out.println("key="+key+" tmpMaps"+tmpMaps);
                        jsonMap.put(key, tmpMaps); 
                        /*for(int i=0;i<tmpMaps.size();i++){
                            JSONObject job = tmpMaps.getJSONObject(i);
                            Map<String,Object> jobMap = JSONObject.fromObject(job.toString());  
                            for(String key2:jobMap.keySet())
                                jsonMap.put(key+i+key2, jobMap.get(key2)); 
                        }        */                    
                    }
                    else{
                        jsonMap.put(key, str);
                    }
                    
                }
            }
            return jsonMap;
        }
        @SuppressWarnings("null")
        public static void main(String[] args) throws IOException{    
            String filename = "ObtainAppNo.txt";
            String json = readJson(filename);
            net.sf.json.JSONObject jObject = new net.sf.json.JSONObject();
            Map<String,Object> map2 = jObject.fromObject(json);
            Map<String,Object> jsonMap = recursinMap(map2);
            System.out.println("-----" +jsonMap);
            //初始化参数
            Properties properties=new Properties();
            //设置velocity资源加载方式为class
            properties.setProperty("resource.loader", "class");
            //设置velocity资源加载方式为file时的处理类
            properties.setProperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
            //实例化一个VelocityEngine对象
            VelocityEngine velocityEngine=new VelocityEngine(properties);
            
            //实例化一个VelocityContext
            VelocityContext context=new VelocityContext();         
            for(Object key :jsonMap.keySet()){
                context.put((String)key, jsonMap.get(key));
            }
            //实例化一个StringWriter
            StringWriter writer=new StringWriter();
          //假若在com.velocity.test包下有一个hello.vm文件,那么加载路径为com/velocity/test/hello.vm
           // String json2 = readJson("2.txt");
           // velocityEngine.mergeTemplate(json2, "gbk", context, writer);
            //这种方式是正确的
            velocityEngine.mergeTemplate("2.txt", "gbk", context, writer);
            String str = writer.toString();
            str = str.replaceAll("\s*", "");
            System.out.println("-----" +str);
            
            
            
        }
        public static String readJson(String filename){
            Resource resource =new  ClassPathResource(filename);
            File file;
            try {
                file = resource.getFile();
                BufferedReader reader= new BufferedReader(new FileReader(file));
                String temp=null;
                String str="";
                while((temp=reader.readLine())!=null){
                    str = str + temp;
                }
                str=str.replace(" ", "");
                return str;
            } catch (IOException e) {
                e.printStackTrace();
            }
            
            return null;
        }
    
    }
  • 相关阅读:
    java fx example
    JavaFX 2.0+ WebView /WebEngine render web page to an image
    剑指Offer面试题41(Java版):和为s的两个数字VS和为s的连续正数序列
    时间类(时间戳的各种转换成)
    Android系统各种类型的service刨根解读
    二叉树的建立基本操作(链表方式)(一)
    从头认识java-13.2 利用元组的方式返回多类型对象
    EA初步使用
    inline-block元素设置overflow:hidden属性导致相邻行内元素向下偏移
    下拉框与列表框
  • 原文地址:https://www.cnblogs.com/mutong1228/p/8987519.html
Copyright © 2020-2023  润新知