以前是在網站/上獲取最新版本的更新,然後進行版本更新操作。下面介紹NVelocity的幾個文件生成操作,讓大家有更深入的了解。
我在之前的幾篇文章中也介紹了NVOCITY的使用,主要介紹了NVOCITY的語法和邏輯,以及在實際項目中如何動態生成內容。如果有興趣,可以翻到以下文章:
強大的模板引擎開源軟件NVelocity
為數據庫2Sharp版本更新生成自定義模板
用NVelocity0.5實現服務器端頁面的自動生成
1,幾種基於虛擬性的內容生成方法
從上圖可以看出,NVelocity的模板生成包括三種方式,壹種是從文件到文件或字符串,另壹種是從字符串到字符串。它們各自的處理方式不同,但都能正確解析內容。
為了更好的利用NVelocity的特性,我們為它做了壹個初步的輔助類包。
復制代碼
///& lt;總結& gt
///基於NVelocity的模板文件生成輔助類。
///& lt;/summary & gt;
公共類NVelocityHelper
{
受保護的VelocityContext上下文;
受保護的模板模板;
受保護的字符串模板文件;
///& lt;總結& gt
///用於存儲鍵值的字典內容
///& lt;/summary & gt;
私人字典& lt字符串,對象& gtKeyObjDict =新詞典& lt字符串,對象& gt();
///& lt;總結& gt
///添加壹個鍵值對象
///& lt;/summary & gt;
///& lt;param name = " key " & gt鍵,不能重復
///& lt;param name = " value " & gt價值
///& lt;returns & gt& lt/returns & gt;
公共NVelocityHelper AddKeyValue(字符串鍵,對象值)
{
如果(!KeyObjDict。ContainsKey(key))
{
KeyObjDict。Add(鍵,值);
}
還這個;
}
................
復制代碼
上面的AddKeyValue方法主要是用來為模板引擎添加壹些需要綁定到頁面的變量對象,以便正確解析頁面變量參數的內容。
為了使用NVelocity的各種特性,我們需要在輔助類中構造模板的相關信息,並設置相關參數。
復制代碼
///& lt;總結& gt
///初始化模板引擎
///& lt;/summary & gt;
受保護的虛擬void InitTemplateEngine()
{
嘗試
{
//速度。init(NVELOCITY _ PROPERTY);
velocity engine template engine = new velocity engine();
模板引擎。SetProperty(RuntimeConstants。RESOURCE_LOADER,“文件”);
模板引擎。SetProperty(RuntimeConstants。INPUT_ENCODING,“utf-8”);
模板引擎。SetProperty(RuntimeConstants。OUTPUT_ENCODING,“utf-8”);
//如果設置了FILE_RESOURCE_LOADER_PATH屬性,則模板文件的基本路徑是基於此設置的目錄;否則,當前運行目錄是默認目錄。
模板引擎。SetProperty(RuntimeConstants。文件資源加載器路徑。current domain . base directory);
模板引擎。init();
模板= templateEngine。get template(template file);
}
catch(ResourceNotFoundException re)
{
字符串錯誤=字符串。Format("找不到模板"+template file);
LogTextHelper。錯誤(error);
拋出新的異常(error,re);
}
catch (ParseErrorException pee)
{
字符串錯誤=字符串。Format("模板中的語法錯誤"+ templateFile + ":" + pee。stack trace);
LogTextHelper。錯誤(error);
拋出新的異常(error,pee);
}
}
復制代碼
在生成內容之前,需要將相關的對象屬性綁定到模板引擎的上下文對象中。
復制代碼
///& lt;總結& gt
///初始化上下文的內容
///& lt;/summary & gt;
私有void InitContext()
{
context = new velocity context();
foreach(KeyObjDict中的字符串鍵。按鍵)
{
語境。Put(key,KeyObjDict[key]);
}
}
復制代碼
1)根據模板文件構造相應的文件內容。
復制代碼
///& lt;總結& gt
///根據模板創建輸出文件,返回生成的文件路徑。
///& lt;/summary & gt;
公共虛擬字符串ExecuteFile()
{
字符串文件名= " ";
如果(模板!=空)
{
string file path = checkendbylash(directoryOfOutput);
fileName = file path+fileName of output+file extension;
如果(!字符串。IsNullOrEmpty(文件路徑)& amp& amp!目錄。存在(文件路徑))
{
目錄。CreateDirectory(文件路徑);
}
//LogTextHelper。調試(字符串。Format("類文件輸出路徑:{0} ",文件名));
init context();
using(StreamWriter writer = new StreamWriter(fileName,false))
{
模板。合並(上下文、作者);
}
}
返回文件名;
}
復制代碼
2)根據模板文件構建字符串內容
復制代碼
///& lt;總結& gt
///根據模板輸出字符串內容。
///& lt;/summary & gt;
///& lt;param name = " templateFile " & gt& lt/param & gt;
///& lt;returns & gt& lt/returns & gt;
公共字符串ExecuteString()
{
init context();
系統。IO.StringWriter writer =新系統。IO . string writer();
模板。合並(上下文、作者);
回歸作家。GetStringBuilder()。ToString();
}
復制代碼
3)根據字符串內容構建字符串輸出。
復制代碼
///& lt;總結& gt
///合並字符串的內容
///& lt;/summary & gt;
///& lt;returns & gt& lt/returns & gt;
公共字符串ExecuteMergeString(字符串輸入字符串)
{
velocity engine template engine = new velocity engine();
模板引擎。init();
init context();
系統。IO.StringWriter writer =新系統。IO . string writer();
模板引擎。Evaluate(context,writer,“mystring”,input string);
回歸作家。GetStringBuilder()。ToString();
}
復制代碼
上述模板輸出模式的調用代碼如下。
復制代碼
私有void btnGenerateFile_Click(對象發送方,EventArgs e)
{
string tempalte = " Template/Template . htm ";//相對目錄
TestInfo info = new TestInfo();
信息。Title = "測試標題";
信息。Content = "測試內容,這是測試內容";
信息。日期時間=日期時間。現在;
NVelocityHelper adapter = new NVelocityHelper(tempalte);
適配器。AddKeyValue("標題","這是壹個標題")
。AddKeyValue("content ","這是壹個內容")
。AddKeyValue("datetime ",系統。日期時間.現在)
。AddKeyValue("TestInfo ",info);
適配器。FileNameOfOutput = " test template ";
字符串filePath = adapter。execute file();
如果(!字符串。IsNullOrEmpty(文件路徑))
{
過程。Start(文件路徑);
}
}
復制代碼
復制代碼
private void btnGenerate_Click(對象發送方,EventArgs e)
{
string tempalte = " Template/Template . htm ";//相對目錄
TestInfo info = new TestInfo();
信息。Title = "測試標題";
信息。Content = "測試內容,這是測試內容";
信息。日期時間=日期時間。現在;
NVelocityHelper adapter = new NVelocityHelper(tempalte);
適配器。AddKeyValue("標題","這是壹個標題")
。AddKeyValue("content ","這是壹個內容")
。AddKeyValue("datetime ",系統。日期時間.現在)
。AddKeyValue("TestInfo ",info);
this.txtCode.Text = adapter。execute string();
}
復制代碼
復制代碼
私有void btnMergeString_Click(對象發送方,EventArgs e)
{
系統。StringBuilder builder =新系統。text . StringBuilder();
建築商。追加(
" ${Title}\r\n" +
" $Content\r\n" +
" $Digest\r\n" +
" $Author\r\n" +
" $Keyword\r\n" +
" $ DateTime \ r \ n ");
NVelocityHelper adapter = new NVelocityHelper();
適配器。AddKeyValue("Title "," Title ")。
AddKeyValue("內容","內容")。
AddKeyValue("摘要","摘要")。
AddKeyValue(“作者”,“作者”)。
AddKeyValue("關鍵字","關鍵詞")。
AddKeyValue("DateTime ",日期時間。現在);
this.txtCode.Text = adapter。ExecuteMergeString(生成器。ToString());
}
復制代碼
2.模板引擎虛擬性的幾種應用場景。
以上操作模板內容的方法在大多數情況下都能滿足我們的應用需求。比如我們可以在代碼生成工具中定義壹些自定義的內容模板,然後結合數據庫的元數據信息,實現豐富的邏輯代碼生成操作。
在壹些內容管理應用中(比如文章管理),可以根據輸入的內容實現文章內容的文件生成操作。這樣生成之後,我們就可以直接使用文章的文件鏈接地址了。
或者根據數據信息生成用於打印操作的特定頁面。下面是Winform中的打印處理。