velocity 模板解析類

package com.renhenet.util;

import java.io.StringWriter;
import java.util.Date;

import org.apache.commons.lang.StringUtils;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.context.Context;

import com.renhenet.fw.ServiceLocator;
import com.renhenet.modules.cache.CacheNeedsRefreshException;
import com.renhenet.modules.cache.CacheService;
import com.renhenet.web.VMUtils;
import com.renhenet.web.WebConstants;
import com.spinn3r.log5j.Logger;

public class VMParser {

	private static final Logger logger = Logger.getLogger();
	private static final CacheService cacheService = (CacheService) ServiceLocator.getService("cacheService");

	private static VelocityEngine engine;
	
	private static VMUtils vMUtils = (VMUtils) ServiceLocator.getService("vMUtils");
	// 配置文件的文件名,配置文件位于$BASE/conf下
	private static final String DEFAULT_CONF_FILE = "/velocity.properties";

	static {
		engine = new VelocityEngine();
		try {
			String absolutePath = VMParser.class.getResource(DEFAULT_CONF_FILE).getFile();
			engine.init(absolutePath);
		} catch (Exception e) {
			logger.error("init velocity engine occur exception.", e);
		}
	}

	private static Template getTemplateByName(String templateName) {
		Template template = null;
		try {
			template = engine.getTemplate(templateName);
		} catch (Exception e) {
			logger.error("getTemplateByName occur exception.", e);
		}
		return template;
	}

	private static Template getTemplateFromCache(String templateName) {
		Template template = null;
		if(StringUtils.isNotEmpty(templateName)) {
			try {
				template = (Template) cacheService.getFromCache("tempate", templateName, 5 * 60);
			} catch (CacheNeedsRefreshException nre) {
				template = getTemplateByName(templateName);
				if (template != null) {
					cacheService.putInCache("tempate", templateName, template);
				}
			}
		}
		return template;
	}

	public static String substitute(String templateName) {
		return substitute(templateName, new VelocityContext());
	}

	public static String substitute(String templateName, Context context) {
		// 設置一些公用的變量
		putCommonVelocityContext(context);
		if (StringUtils.isEmpty(templateName)) {
			return StringUtils.EMPTY;
		}
		Template tmplate = getTemplateFromCache(templateName);
		if (tmplate != null) {
			StringWriter writer = new StringWriter();
			try {
				tmplate.merge(context, writer);
				String restring = writer.toString();
				writer.flush();
				writer.close();
				return restring;
			} catch (Exception ex) {
				logger.error("merge velocity with template occur exception.", ex);
			}
		}
		return StringUtils.EMPTY;
	}

	private static void putCommonVelocityContext(Context context) {
		context.put("vMUtils", vMUtils);
	}
}

更多相關文章
  • 一直以來在專案中使用Apache Velocity模板引擎作爲視圖層輸出,爲了解決XSS漏洞,需要對輸出到頁面的內容進行HTML轉義,我一般采用2種方式實現:使用過濾器 Filter,在其中進行 HttpServletRequestWrapper 的 getParameter( )等方法重載,在底層 ...
  • Velocity 是一個基于 Java 的模板引擎,它允許用戶使用簡單的模板語言來引用由 Java 代碼定義的對象.當 Velocity 應用于 Web 開發時,界面設計人員可以和 Java 程序開發人員同步開發一個遵循 MVC 架構的 Web 站點.也就是說,頁面設計人員可以只關注頁面的顯示效果, ...
  • ecmall 模板解析二次開發 卓流應用網(http://www.360cd.cn/)-專業的ecmall二次開發 對于,ecmall的本身自帶的模板,可能很多用過的朋友都知道,其實還有許多功能根本無法實現.從根本上來講,不如Smarty強大,但本人也試過將smarty 引入但不是很成功,究其原因, ...
  •     問題描述:Red5伺服器端的代碼報錯無法解析類型 org.springframework.core.io.support.ResourcePatternResolver.從必需的 .class 文件間接引用了它.具體我的報錯的地方是當我創建一個ISope,然後通過這個IScope獲得名稱的時 ...
  • 一.發現在寫一個基于模板的代碼生成器(我叫她--bud)的時候.因爲相對熟悉velocity,而velocity也完全能夠勝任,于是就用了他.在生成一個xml文件的時候發現一個有趣的現象--某些情況下velocity會吧模板中的"換行"給吃掉.就是在模板代碼裏是有換行的.但是處理 ...
  • 轉載velocity模板載入
    轉載自: http://www.blogjava.net/sxyx2008/archive/2010/11/11/337799.html velocity使用基本來說比較簡單,但在載入模板時老出問題,很多初學者經常會遇到找不到模板這種異常.本文就針對目前常用的三種模板載入方式做以說明. 其工程目錄結 ...
  • volist中的循環變量名字 id 最好能有前綴或者後綴因爲如果有同名的,作用範圍更廣的相同變量名的變量,其值將會被覆蓋,而發生取到volist循環中最後一個賦值的信息的bug: 比如說有一個 商鋪首頁的模板,shop是該商鋪的信息,整個頁面用$shop引用其某些變量值,如{$shop.id}而如果 ...
一周排行
  • 關于社群經濟,"羅輯思維"應該是最早的定義者和實踐者,尤其是他在四個月內兩次招募付費會員,入賬會員費近千萬的事迹,一時傳爲佳話,讓人對社群商業的力量驚歎不已,老羅更把互聯網社群稱爲未來商業的核心動 ...
  • 4月份的時候申請了亞馬遜AWS的免費一年試用,之後因爲工作太忙,就沒去試試,趁著現在還能免費用,准備試試.AWS上很多有意思的服務,當然,這些服務裏最基礎的還是Ec2,就從它開始吧.登陸AWS的控制台,通過key p ...
  • Spring LDAP 我累了,感情累了,中午不睡覺,也很累. -----------Sayi spring-ldap-core(the Spring LDAP library) JNDI/LDAP和JDBC/DB ...
  • weblogic安裝後,忘記訪問控制台的用戶名或者密碼,可通過以下步驟來重置用戶名密碼. 版本:WebLogic Server 10.3  說明:%DOMAIN_HOME%:指WebLogic Server 域(Do ...
  • 構建企業私有雲的最佳實踐
    構建企業私有雲的最佳實踐作爲全球計算創新領域的領先廠商,英特爾在中國大力推進計算創新.近年 ...
  • soa
    面向服務的體系結構(Service-Oriented Architecture,SOA)是一個組件模型,它將 應用程序的不同功能單元(稱爲服務)通過這些服務之間定義良好的接口和契約聯系起來.接口是采用中立的方式進行定 ...
  • php的iconv函數只支持對字符串的轉換編碼,如果是數組,就要自己遍曆轉換了,因此寫如上的函數,對任意維數組進行轉換,同時轉換下標(索引)及值. 注意:不轉對象. function mult_iconv($in_c ...
  • FreeBSD10 gnome2 桌面安裝手冊 (通過鏡像iso)
    FreeBSD10 通過鏡像iso安裝gnome2桌面cnyin 2014/11/17cn ...
  • 最近在寫一個python程序,發生了crash,並生成了一個core文件,需要使用gdb排查問題,折騰了好久,終于把環境搭建了起來,記錄下:1.安裝gdb 最好是gdb7.7版本 wget http://ftp.gn ...
  • 轉載 非常酷的拖動分頁JS+CSS圖
    效果圖:源碼如下: <html> <head> <title ...