實際項目中使用freemaker作模板

在以前的一篇文章中項目中Spring結合Freemaker渲染網頁,示例了使用freemaker來作spring mvc的視圖處理。本文使用freemaker來處理系統外發消息時候的消息模板處理。好比用戶後給用戶發送激活郵件,用戶修改密碼後給用戶發送提醒短信等,這些場景下都會使用到模板引擎。記得以前在杭研的時候,使用velocity來開發報文構件,freemaker做業也差很少。java

設計

在項目中,模板保存在數據庫中,notify_template(id,subject,content,memo),在一些功能模塊的初始化中,將template_id傳進去。最後,在交易處理的某個階段,調用發送服務時,在發送服務中檢索模板ID在和交易信息一塊兒,生成完整的信息。spring

核心代碼

public class FreeMarkerTemplateUtil {
    private static Log log = LogFactory.getLog(FreeMarkerTemplateUtil.class);
    private FreeMarkerTemplateUtil( )
    {}

    /**
     * 實用模板從數據庫中取出爲字符串
     * @param templateContent
     * @param paraMap
     * @return
     */
    public static String templateParser(String templateContent,Map<String, String> paraMap) {
        try {
            StringReader reader = new StringReader(templateContent);
            Template template;
            template = new Template("", reader, null);
            StringWriter out = new StringWriter();

            if (paraMap != null) {
                template.process(paraMap, out);

                String result = out.toString();
                if (log.isDebugEnabled()) {
                    log.debug("template content is:[" + result + "]");
                }
                return result;
            } else {
                return templateContent;
            }
        } catch (Exception e) {
            log.error(e);
            log.error("templateContent = " + templateContent + "\ncontent = "+ paraMap);
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 適合模板保存在本地目錄
     * @param paramMap
     * @param templateLoadingDir
     * @param templateFilePath
     * @return
     * @throws IOException
     * @throws TemplateException
     */
    public static String processTemplate( Map< String, Object > paramMap,String templateLoadingDir, String templateFilePath ) throws IOException,
            TemplateException {
        if ( StringUtils.isBlank( templateLoadingDir ) ) {
            throw new TemplateException( "模板文件目錄爲空", Environment.getCurrentEnvironment( ) );
        }
        else if ( StringUtils.isBlank( templateFilePath ) ) {
            throw new TemplateException( "模板路徑爲空", Environment.getCurrentEnvironment( ) );
        }
        Configuration cfg = new Configuration( );
        cfg.setDirectoryForTemplateLoading( new File( templateLoadingDir ) );
        cfg.setDefaultEncoding( CharEncoding.UTF_8 );
        Template template = cfg.getTemplate( templateFilePath );

        if ( paramMap == null || paramMap.isEmpty( ) )
        {
            return template.toString( );
        }
        return StringUtils.trimToEmpty( FreeMarkerTemplateUtils.processTemplateIntoString(template, paramMap ) );
    }
}
//簡單調用
public static void  main(String[] args)throws Exception{
        NotifyTemplate notifyTemplate = new NotifyTemplate();
        //
        notifyTemplate.setContent("orderNo=${order_no}&status=${status}&respCode=${resp_code}");
        notifyTemplate.setId(400L);

        Map<String, String> content= new HashMap<>();
        content.put("order_no","_123456");
        content.put("status","1");
        content.put("resp_code","000000");
        System.out.println(FreeMarkerTemplateUtil.templateParser( notifyTemplate.getContent(),content));

        String templateLoadingDir="E:\\";
        String templateFilePath="template.txt";
        Map<String, Object> content2= new HashMap<>();
        content2.put("order_no","_123456");
        content2.put("status","1");
        content2.put("resp_code","000000");
        System.out.println(FreeMarkerTemplateUtil.processTemplate(content2, templateLoadingDir,templateFilePath));
    }

總結

FreeMaker有國際化功能,在Configuration中傳入Locale便可,它就會給要查找的模板增長後綴,優先使用有後綴的模板,好比傳入的模板名爲temp.txt,而Locale.ENGLISH,它就會去找temp_en.txt。數據庫

相關文章
相關標籤/搜索