9
回答
高手帮忙-Freemarker怎么获取非文件中保存的模板
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

网上找的、freemarker文档中的示例等都是传一个文件路径,获取保存在文件中的模板信息。

读取文件中的模板是这样做的:

freemarkerCfg.setDirectoryForTemplateLoading(new File(path));

 

freemarkerCfg.setEncoding(Locale.getDefault(), "GBK");

StringWriter writer = new StringWriter();

Template template = freemarkerCfg.getTemplate(templateName,"UTF-8");

template.process(rootMap, writer);

我想把模板保存在内存变量中,上面的语句该怎么写呢?查了很久没有解决,大家帮帮忙,多谢了。

 

举报
mdaimon
发帖于7年前 9回/2K+阅
共有9个答案 最后回答: 4年前

兄弟,你根本没看懂这些代码的意思。

freemarkerCfg.setDirectoryForTemplateLoading(new File(path));

这句去告诉系统,freemarker的模板所放置的位置,也就是文件夹,并不知文件中放置的模板。

 

freemarkerCfg.setEncoding(Locale.getDefault(), "GBK");

这行是这只编码的,没有什么特殊的。

StringWriter writer = new StringWriter();

初始化一个书写器

Template template = freemarkerCfg.getTemplate(templateName,"UTF-8");

根据名字从上面的文件夹中找到对应的模板并实例化。

template.process(rootMap, writer);

用书写器+模板渲染出所要的内容。

 

你想要的是不是模板缓存?

我要的具体说也不是模板缓存,就是freemarker能不能接受非文件的模板,比如我如果是临时程序生成的模板呢,难不成要先保存为文件,然后再让freemarker读取?freemarker能不能直接接受模板字符串呢?

除了3楼说的自己实现TemplateLoader还有办法吗?

其实很简单:

  private static final freemarker.template.Configuration fmConfig=new freemarker.template.Configuration();
  static {
      fmConfig.setDefaultEncoding("GBK");
  }

  public static String evaluateFreeMarker(Map<String,Object> bindMap,String strInput) {
    StringReader reader= new StringReader(strInput);
    try {
      freemarker.template.Template templateA = new freemarker.template.Template("name",reader,fmConfig);
      StringWriter writerA = new StringWriter();

      templateA.process(bindMap, writerA);
     
      bindMap.clear();
      bindMap = null;
      templateA = null;

      return writerA.toString();
    } catch (Throwable ex) {
      return strInput;
    } finally {
      reader.close();
    }
  }

/**
* @param content  The given string of template content
* @return The template instance of which description by string content
* @throws IOException
*/
public static Template createTemplateByContent(String content) throws IOException
{
Configuration configuration = new Configuration();
configuration.setTemplateLoader(new StringFreemarkerTemplateLoader(content));
configuration.setDefaultEncoding("UTF-8");
return configuration.getTemplate(""); 
}


public class StringFreemarkerTemplateLoader implements TemplateLoader {

private static final String DEFAULT_TEMPLATE_KEY = "_default_template_key";
private Map<String,String> templates = new HashMap<String,String>();

public StringFreemarkerTemplateLoader(String defaultTemplate) {
if (defaultTemplate != null && !defaultTemplate.equals("")) {
templates.put(DEFAULT_TEMPLATE_KEY, defaultTemplate);
}
}

貌似代码cache中StringTemplateLoader这个类

 

String templateStr="Hello ${user}";
Template t = new Template("name", new StringReader(templateStr),new Configuration());

StringTemplateLoader stringLoader = new StringTemplateLoader();
stringLoader.putTemplate("greetTemplate", "<#macro greet>Hello</#macro>");
stringLoader.putTemplate("myTemplate", "<#include \"greetTemplate\"><@greet/> World!");
 cfg.setTemplateLoader(stringLoader);

这个你执行一下,模板在字符串中:

 

 

package com.test.demo;

import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;

import freemarker.cache.StringTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public class TestFreemarker {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		
		Configuration cfg = new Configuration();
		StringTemplateLoader stringLoader = new StringTemplateLoader();
		String s="欢迎:${user}";
		stringLoader.putTemplate("myTemplate",s );
		
		cfg.setTemplateLoader(stringLoader);
		
		try {
			Template template = cfg.getTemplate("myTemplate","utf-8");
			Map root = new HashMap();  
			root.put("user", "Keven Chen");
			
			StringWriter writer = new StringWriter();  
			try {
				template.process(root, writer);
				System.out.println(writer.toString());  
			} catch (TemplateException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}  
      
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}





	}

}


顶部