使用freemarker對模板進行渲染


最近項目中使用到了,對word模板進行編輯和渲染,所以使用到了模板引擎技術。

在項目中,我們前端使用的富文本編輯器,進行展示和保存(和word格式一致),后端采用了freemarker進行數據的渲染。前端,就不多說了,處理很簡單,只有一個展示,一個保存操作。

后台,需要獲取模板和數據,進行渲染后返回到前台,進行展示。

目前實現了輸入字符串和輸入文件兩種形式。(20180409)

freemark技術的整合和使用如下:

1.引入maven依賴

復制代碼
        <!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.23</version>
        </dependency>
復制代碼

2.封裝為utils工具類使用

復制代碼
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;

import org.apache.log4j.PropertyConfigurator;

import com.winning.Application;
import com.winning.polaris.admin.service.impl.UpgradeServiceImpl;
import com.winning.polaris.comm.util.LogUtil;

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

public class FreemarkerUtils {
    private static LogUtil logger = LogUtil.getInstance(UpgradeServiceImpl.class);
    private static String defaultCharacter = "UTF-8";
    private static Configuration cfg;
    private  FreemarkerUtils() {
    }
    static {
        cfg = new Configuration(Configuration.getVersion());
        cfg.setDefaultEncoding(defaultCharacter);
        cfg.setTagSyntax(Configuration.AUTO_DETECT_TAG_SYNTAX);
    }
    /**
     * 對模板進行渲染
     * @param data 數據Map
     * @param tplStr 模板
     * @return
     */
    public static  String generateString(
            Map<String, Object> data,  String tplStr) {
        String result = null;
        String name="myStrTpl";
        try { 
            StringTemplateLoader stringTemplateLoader= new StringTemplateLoader();
            stringTemplateLoader.putTemplate(name, tplStr);
            cfg.setTemplateLoader(stringTemplateLoader); 
            Template template = cfg.getTemplate(name,defaultCharacter);
            StringWriter out = new StringWriter(); 
            template.process(data, out);  
            out.flush();  
            result= out.toString();
            out.close(); 
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return result;
    }
    /**
     * 將模板渲染以后保存到文件
     * @param templateFileDir 模板目錄
     * @param fileName 模板文件名稱
     * @param targetFilePath 渲染后文件名稱
     * @param dataMap 數據
     * @return
     */
    public static boolean renderingTemplateAndGenerateFile(String templateFileDir,
            String fileName,String targetFilePath,Map<String, Object> dataMap){
            boolean flag=true;
            try {
                // 設置文件所在目錄的路徑  
                cfg.setDirectoryForTemplateLoading(new File(templateFileDir));//模板路徑  
                // 獲取模版  
                Template template = cfg.getTemplate(fileName);
                // 設置輸出文件名,和保存路徑  
                File outFile = new File(targetFilePath);
                // 將模板和數據模型合並生成文件 重點設置編碼集  
                BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "UTF-8"));  
                // 生成文件  
                template.process(dataMap, out);  
                // 關閉流  
                out.flush();  
                out.close();
            } catch (Exception e) {
                logger.error("生產模板文件失敗!",e);
                flag=false;
            }
        return flag;
    }
    
    
    public static void main(String[] args) {
        PropertyConfigurator.configure(Application.class.getClassLoader().getResourceAsStream("config" + File.separator + "log4j.properties"));

        Map<String,Object> dataMap=new HashMap<String, Object>();
        dataMap.put("APP_HOME", "c:/test/appHome");
        //F:\freemark
        boolean renderingTemplateAndGenerateFile = renderingTemplateAndGenerateFile("F:\\freemark\\", "temp.txt",
                "F:\\freemark\\temp.bat",dataMap);
        
        System.out.println(renderingTemplateAndGenerateFile);
    }

}
復制代碼

 

3.單元測試

public  class  FreemarkerUtilsTest extends  TestCase {
     
     public  void  generateStringTest(){
         
         Map<String,Object> map= new  HashMap<>();
         map.put( "date" , "2017-05-11 11:55:55" );
         map.put( "caseNo" , "AJ00000001" );
         map.put( "descrip" , "這是描述信息==========" );
         String template= "案件編號為:${caseNo!}   "
                 + " 日期為:${date!} "
                 + " 自動獲取日期為:${ .now?string('yyyy年MM月dd日')}"
                 + "描述:${descrip!}" ;
         String generateString = FreemarkerUtils.generateString(map, template);
         System.out.println( "------" );
         System.out.println(generateString);
     }
}

 結果:案件編號為:AJ00000001    日期為:2017-05-11 11:55:55  自動獲取日期為:2018年01月29日描述:這是描述信息==========

模板渲染完成。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM