在项目中经常遇到,相同的数据,对不同的客户以及不同的终端,需要输出不同的数据。
更有特殊的情况,需要对一个数据,在不同的终端表示形式不一样。综合多种考虑,需要一种支持扩展,并且灵活的的接口, 开发效率还需高效。
在网上找了一圈没有发现,决定自己实现一个,决定使用模板,在freeMark和Velocity之间择了Velocity 。
- 性能
- 够用
原理,
利用Velocity的功能,生成各种复杂的数据,再向通过接口统一输出
直接上代码截图
接口模板
package com.echo.api.velocity.inter; import org.apache.velocity.VelocityContext; /** * 适配器接口. <br> * 类详细说明. * <p> * Copyright: Copyright (c) 2015年9月9日 下午4:02:23 * <p> * <p> * * @version 1.0.0 */ public interface IDataAdapter { String TYPE_JSON = "json"; String TYPE_XML = "xml"; /** * @param type * 报文类型,json,xml * @param version * 版本,1.0.0 * @param key * 标示key可以是任意指定 * @param template * 报文模板名称 * @return */ public String getResult(String type, String version, String key, String template, VelocityContext context); }
package com.echo.api.velocity.impl; import java.io.File; import java.io.FileInputStream; import java.io.StringWriter; import java.util.Properties; import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.apache.velocity.app.VelocityEngine; import com.echo.api.velocity.inter.IDataAdapter; /** * 常见的数据 * <p> * Copyright: Copyright (c) 2015年9月9日 下午4:13:42 * <p> * * @version 1.0.0 */ public class GeneralDataAdapter implements IDataAdapter { /** * 模板基础路径 */ private String baseTemplatePath; private VelocityEngine velocityEngine; private String encoding = "utf-8"; public GeneralDataAdapter() throws Exception { init(); } private void init() throws Exception { try { Properties properties = new Properties(); // 设置velocityp 配置 properties.load(new FileInputStream(new File("./config/velocity.properties"))); Velocity.init(properties); velocityEngine = new VelocityEngine(); } catch (Exception ex) { throw ex; } } public String getResult(String type, String version, String key, String template, VelocityContext context) { // 添加通用的处理函数 context.put("DateFormatUtils", DateFormatUtils.class); // 返回报文 StringWriter sw = new StringWriter(); String path = baseTemplatePath + "/" + type + "/" + version + "/" + key + "/" + template; velocityEngine.mergeTemplate(path, encoding, context, sw); return sw.toString(); } public String getBaseTemplatePath() { return baseTemplatePath; } public void setBaseTemplatePath(String baseTemplatePath) { this.baseTemplatePath = baseTemplatePath; } public String getEncoding() { return encoding; } public void setEncoding(String encoding) { this.encoding = encoding; } public GeneralDataAdapter(String baseTemplatePath, String encoding) throws Exception { super(); this.baseTemplatePath = baseTemplatePath; this.encoding = encoding; init(); } public GeneralDataAdapter(String baseTemplatePath, VelocityEngine velocityEngine, String encoding) throws Exception { super(); this.baseTemplatePath = baseTemplatePath; this.velocityEngine = velocityEngine; this.encoding = encoding; init(); } }
package com.echo.api; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.velocity.VelocityContext; import com.echo.api.velocity.impl.GeneralDataAdapter; import com.echo.api.velocity.inter.IDataAdapter; /** * 使用velocity设计复杂多变的报文接口,在bean相同情况下实现不同的输出 * <p> * Copyright: Copyright (c) 2015年9月9日 下午3:27:47 * <p> * Company: 北京宽连十方数字技术有限公司 * <p> * * @author [email protected] * @version 1.0.0 */ public class TestAipVersion { /** * main函数. * * @param args * 启动参数 * @throws Exception * Exception */ public static void main(String... args) throws Exception { VelocityContext context = new VelocityContext(); // 同一数据源,输出不同报文以及不同的格式 List<User> users = new ArrayList<User>(); users.add(new User("张三", 23, "张家庄良民", new Date(), "shaoyishao")); // users.add(new User("李四", 25, "李家庄好人", new Date(), "shaoyishao")); // users.add(new User("王五", 39, "王庄刁民啊", new Date(), "shaoyishao")); context.put("userList", users); // json数据 IDataAdapter generalDataAdapter = new GeneralDataAdapter("./templates", "utf-8"); // json报文 long stime = 0; stime = System.currentTimeMillis(); System.out.println(generalDataAdapter.getResult(IDataAdapter.TYPE_JSON, "1.0.0", "android", "userlist.vm", context)); System.out.println(generalDataAdapter.getResult(IDataAdapter.TYPE_JSON, "1.0.0", "android640", "userlist.vm", context)); // xml报文 stime = System.currentTimeMillis(); System.out.println(generalDataAdapter.getResult(IDataAdapter.TYPE_XML, "1.0.0", "android", "userlist.vm", context)); } }
输出json,xml,以及不同屏幕
[{ "count:": 1, "name":"张三", "age":23, "remark":"张家庄良民", "regTime":"20150909170631", "btn1":"扫一扫" } ] [{ "count:": 1, "name":"张三", "age":23, "remark":"张家庄良民", "regTime":"20150909170631", "btn1":"扫一扫就知道" } ] <?xml version="1.0" encoding="utf-8" ?> <data><users><user> <count>1</count> <name>张三</name> <age>23</age> <remark>张家庄良民</remark> <regTime>2015年09月09日 17:06:31</regTime> </user> </users> </data>
时间: 2024-10-11 04:49:08