當前位置:成語大全網 - 書法字典 - 如何在NVelocitym模板渲染的頁面上實時更新數據

如何在NVelocitym模板渲染的頁面上實時更新數據

NVelocity已經用了好幾年了,主要是在我的代碼生成工具Database2Sharp上生成相關代碼,但是NVelocity是壹個非常好的模板引擎,可以用來生成文件、頁面等相關處理,非常高效方便。

以前是在網站/上獲取最新版本的更新,然後進行版本更新操作。下面介紹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中的打印處理。