Browse Source

添加具有 Func 参数的四个 render 方法

James 5 years ago
parent
commit
f643978d4a
1 changed files with 94 additions and 0 deletions
  1. 94 0
      src/main/java/com/jfinal/template/Template.java

+ 94 - 0
src/main/java/com/jfinal/template/Template.java

@@ -142,6 +142,100 @@ public class Template {
 	public boolean isModified() {
 	public boolean isModified() {
 		return env.isSourceListModified();
 		return env.isSourceListModified();
 	}
 	}
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Func 接口用于接管内部的 Stat ast、Env env、Scope scope 变量
+	 * 实现更加灵活、强大的功能
+	 */
+	@FunctionalInterface
+	public interface Func<T> {
+		void call(Stat ast, Env env, Scope scope, T t);
+	}
+	
+	/**
+	 * 渲染到 String 中去
+	 * 
+	 * Func 接口用于接管内部的 Stat ast、Env env、Scope scope 变量,并且便于
+	 * 向 Ctrl 传入 attachment 参数
+	 * 
+	 * <pre>
+	 * 例子:
+	 *   Map<Object, Object> data = new HashMap<>();
+	 *   data.put("key", 123);
+	 *   
+	 *   String ret = template.renderToString(data, (ast, env, scope, writer) -> {
+	 *      // 可以传入任意类型的 attachment 参数,以下以 Kv 对象为例
+	 *      // 该参数可以在指令中通过 scope.getCtrl().getAttachment() 获取
+	 *      scope.getCtrl().setAttachment(Kv.by("key", 456));
+	 *      
+	 *      // 接管内部的 ast、env、scope、writer,执行 ast.exec(...)
+	 *      ast.exec(env, scope, writer);
+	 *   });
+	 *   
+	 *   System.out.println(ret);
+	 * </pre>
+	 */
+	public String renderToString(Map<?, ?> data, Func<CharWriter> func) {
+		FastStringWriter fsw = env.engineConfig.writerBuffer.getFastStringWriter();
+		try {
+			
+			CharWriter charWriter = env.engineConfig.writerBuffer.getCharWriter(fsw);
+			try {
+				func.call(ast, env, new Scope(data, env.engineConfig.sharedObjectMap), charWriter);
+			} finally {
+				charWriter.close();
+			}
+			
+			return fsw.toString();
+		} finally {
+			fsw.close();
+		}
+	}
+	
+	/**
+	 * 渲染到 OutputStream 中去
+	 */
+	public void render(Map<?, ?> data, OutputStream outputStream, Func<ByteWriter> func) {
+		ByteWriter byteWriter = env.engineConfig.writerBuffer.getByteWriter(outputStream);
+		try {
+			func.call(ast, env, new Scope(data, env.engineConfig.sharedObjectMap), byteWriter);
+		} finally {
+			byteWriter.close();
+		}
+	}
+	
+	/**
+	 * 渲染到 Writer 中去
+	 */
+	public void render(Map<?, ?> data, Writer writer, Func<CharWriter> func) {
+		CharWriter charWriter = env.engineConfig.writerBuffer.getCharWriter(writer);
+		try {
+			func.call(ast, env, new Scope(data, env.engineConfig.sharedObjectMap), charWriter);
+		} finally {
+			charWriter.close();
+		}
+	}
+	
+	/**
+	 * 渲染到 File 中去
+	 * 适用于代码生成器类似应用场景
+	 */
+	public void render(Map<?, ?> data, File file, Func<ByteWriter> func) {
+		try (FileOutputStream fos = new FileOutputStream(file)) {
+			
+			ByteWriter byteWriter = env.engineConfig.writerBuffer.getByteWriter(fos);
+			try {
+				func.call(ast, env, new Scope(data, env.engineConfig.sharedObjectMap), byteWriter);
+			} finally {
+				byteWriter.close();
+			}
+			
+		} catch (IOException e) {
+			throw new RuntimeException(e);
+		}
+	}
 }
 }