package com.uuzz.demo.template.service.impl; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.StringWriter; import java.io.Writer; import java.util.Iterator; import java.util.Map; import org.springframework.stereotype.Service; import com.uuzz.demo.template.service.HtmlCreator; import com.uuzz.demo.template.util.FreeMarderFactory; import freemarker.cache.StringTemplateLoader; import freemarker.core.TemplateElement; import freemarker.ext.beans.StringModel; import freemarker.template.Template; import freemarker.template.TemplateSequenceModel; @Service public class HtmlCreatorImpl implements HtmlCreator { private String homeTemplate; private String basePath; @Override public String getHomeTemplate() { return homeTemplate; } @Override public void setHomeTemplate(String homeTemplate) { this.homeTemplate = homeTemplate; } @Override public String getBasePath() { return basePath; } @Override public void setBasePath(String basePath) { this.basePath = basePath; } @Override public boolean createHtmlByNameAndData(String templateName, Map<String, Object> dataMap) { // TODO Auto-generated method stub return false; } @Override public boolean createHtmlByTemplateAndData(Map<String, String> templateMap, Map<String, Object> dataMap) { StringTemplateLoader stringTemplateLoader = (StringTemplateLoader) FreeMarderFactory.getTemplateLoader(); Iterator<String> iterator = templateMap.keySet().iterator(); while (iterator.hasNext()) { String key = iterator.next(); stringTemplateLoader.putTemplate(key, templateMap.get(key)); } recuriseHtml(getHomeTemplate(), stringTemplateLoader, dataMap); FreeMarderFactory.getConfiguration().clearTemplateCache(); iterator = templateMap.keySet().iterator(); while (iterator.hasNext()) { String key = iterator.next(); try { Template template = FreeMarderFactory.getConfiguration().getTemplate(key); File afile = new File(this.getBasePath() + key); if (!afile.exists()) { afile.createNewFile(); } Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(afile), "UTF-8")); template.process(dataMap, out); } catch (Exception e) { e.printStackTrace(); } } return false; } public void recuriseHtml(String templateName, StringTemplateLoader stringTemplateLoader, Map<String, Object> rootMap) { try { Template template = FreeMarderFactory.getConfiguration().getTemplate(templateName, "UTF-8"); TemplateSequenceModel list = template.getRootTreeNode().getChildNodes(); for (int i = 0; i < list.size(); i++) { StringModel model = (StringModel) list.get(i); TemplateElement element = (TemplateElement) model.getWrappedObject(); if (element.getNodeName().equals("Include")) { String templateSource = element.getSource(); recuriseHtml(templateSource.substring(templateSource.indexOf("\"") + 2, templateSource.lastIndexOf("\"")), stringTemplateLoader, rootMap); } } StringWriter out = new StringWriter(); Map<String, Object> dataMap = (Map<String, Object>) rootMap.get(templateName); template.process(dataMap, out); stringTemplateLoader.putTemplate(templateName, out.toString()); } catch (Exception e) { e.printStackTrace(); } } }
调用方式
Map<String, String> templateMap = new HashMap<String, String>(); Map<String, Object> dataMap = new HashMap<String, Object>(); QueryTestBean t = new QueryTestBean(); //获取所有模板 List<TestBean> resultList = testServiceImpl.queryPojoForList(t); // 所有模板 for (int i = 0; i < resultList.size(); i++) { TestBean testBean = resultList.get(i); templateMap.put(testBean.getColumn_2(), testBean.getColumn_6()); List<Map<String, String>> templateDataMap = new ArrayList<Map<String, String>>(); Map<String, Object> data = new HashMap<String, Object>(); Map<String, String> map = new HashMap<String, String>(); map.put("name", "您好!" + testBean.getColumn_2()); map.put("href", "href"); templateDataMap.add(map); data.put("list", templateDataMap); dataMap.put(testBean.getColumn_2(), data); } htmlCreator.setHomeTemplate("index.html"); htmlCreator.setBasePath(this.request.getServletContext().getRealPath("/html" )+ "/"); htmlCreator.createHtmlByTemplateAndData(templateMap, dataMap);