在項目中常常遇到,相同的數據,對不一樣的客戶以及不一樣的終端,須要輸出不一樣的數據。java
更有特殊的狀況,須要對一個數據,在不一樣的終端表示形式不同。綜合多種考慮,須要一種支持擴展,而且靈活的的接口, 開發效率還需高效。android
在網上找了一圈沒有發現,決定本身實現一個,決定使用模板,在freeMark和Velocity之間擇了Velocity 。apache
性能json
夠用api
原理,app
利用Velocity的功能,生成各類複雜的數據,再向經過接口統一輸出函數
直接上代碼截圖性能
接口模板this
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> * <p> * * @author lihuan * @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>