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;
    }

}

原文地址:https://www.cnblogs.com/mutong1228/p/8987519.html

时间: 2024-10-10 15:24:18

velocity模板实战的相关文章

使用 Velocity 模板引擎快速生成代码

原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-velocity1/ Velocity 是一个基于 Java 的模板引擎,它允许任何人仅仅简单的使用模板语言来引用由 Java 代码定义的对象,从而实现界面和 Java 代码的分离,使得界面设计人员可以和 Java 程序开发人员同步开发一个遵循 MVC 架构的 web 站点.但是在实际应用过程中,Velocity 又不仅仅被用在了 MVC 的架构中. Velocity 模板引擎介绍 在现今的软

Spring+Velocity模板发送邮件

Spring+Velocity模板发送邮件 1.在eclipse中新建一个Java Project, 命名为spring-velocity-mail 2.在项目下新建一个lib目录,导入需要的jar包 依赖包如下: commons-collections-3.2.1.jar commons-lang-2.6.jar commons-logging-1.2.jar mail.jar spring-beans-3.2.2.jar spring-context-3.2.2.jar spring-con

Struts2中使用Velocity模板时模板资源路径配置问题

在Struts2中使用Velocity模板时,如何以相对与Web工程的路径来配置模板资源文件路径这个问题网上千篇一律的来自Velocity官方文档.官方文档中指出如果是Web工程的话,模板的相对路径是工程根路径,今天在使用的时候有如下配置: Velocity.properties(默认在WEB-INF下): resource.loader =file, classclass.resource.loader.description = Velocity Classpath Resource Loa

velocity模板技术生成word文档

本文介绍采用velocity技术在Java中生成word文档的方法. 1.新建一个word文档,编辑内容如下: 2.将上述word文档另存为htm格式的文件 3.新建一个Java Project项目velocityTest,加入Velocity所依赖的Jar包velocity-dep-1.5-beta2.jar. 4.在src目录下新建一个velocity.vm文件,将第二步生成的velocity.htm用文本编辑器打开,复制内容到velocity.vm中.内容如下: <html xmlns:v

java 利用spring JavaMailSenderImpl发送邮件,支持普通文本、附件、html、velocity模板

java 利用spring JavaMailSenderImpl发送邮件,支持普通文本.附件.html.velocity模板 博客分类: Java Spring 本文主要介绍利用JavaMailSenderImpl发送邮件.首先介绍了发送一般邮件,然后介绍了发送富文本(html)邮件及以velocity为模板发送邮件. 邮件发送分为为三步:创建邮件发送器.编写邮件.发送邮件. Spring的JavaMailSenderImpl提供了强大的邮件发送功能,可发送普通文本邮件.带附件邮件.html格式

【转】Velocity模板(VM)语言介绍

http://www.blogjava.net/caizh2009/archive/2010/08/20/329495.html Velocity是什么? Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象. 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人 员可以只关注页面的显

velocity模板加载

http://hi.baidu.com/ly_dayu/item/828b09c5c3c5e547a8ba9409 velocity使用基本来说比较简单,但在加载模板时老出问题,很多初学者经常会遇到找不到模板这种异常.本文就针对目前常用的三种模板加载方式做以说明.  一.velocity默认的加载方式(文件加载方式) Java代码   package com.velocity.test; import java.io.StringWriter; import java.util.Properti

通过Velocity模板实现了Hibernate sql-query的动态(SQL/HQL)

一.简介 Hibernate对数据库结构提供了较为完整的封装,Hibernate的O/R Mapping实现了POJO 和数据库表之间的映射,以及SQL 的自动生成和执行.而MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架,MyBatis需要使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录.在编写比较复杂的动态SQL语句时,Mybatis的SQL是手动编写的,所以

改造Velocity模板引擎让$[!]{}输出默认进行html转义,并增加$#{}语法支持不转义输出

一直以来在项目中使用Apache Velocity模板引擎作为视图层输出,为了解决XSS漏洞,需要对输出到页面的内容进行HTML转义,我一般采用2种方式实现: 使用过滤器 Filter,在其中进行 HttpServletRequestWrapper 的 getParameter( )等方法重载,在底层进行HTML转义,然后页面直接输出: 这种方式很轻松很直接,业务代码不需要修改就完成了所有的转义工作:但是也带来了问题:修改了用户的原始输入数据,如果需要用到用户的原始输入数据,又得反转义回去,很麻