用Java程式生成文字的捷徑(轉)

BSDLite發表於2007-08-15
用Java程式生成文字的捷徑(轉)[@more@]大多數程式都需要輸出一些文字,比如郵件訊息、HTML檔案或控制檯輸出。但是,計算機本質上只能處理二進位制資料,程式設計師必須讓軟體來生成可理解的文字。在這篇文章中,我要介紹的是在生成和輸出文字時,為何使用模板引擎能夠節省時間。你將瞭解模板的優點,如何針對不同的情形建立高效的模板。和 System.println說再見! 雖然程式設計師可以很輕鬆地編寫出輸出文字資訊的程式碼(因為這畢竟是從Hello World範例學到的第一件事情),但通常而言,程式設計師不是寫作或組織文字資訊(如郵件)的最佳人選。因此,我們常常讓市場部門或公關部門去做那些事情。但遺憾的是,即使對於最普通的郵件,編寫者也常常依賴程式輸出來完成任務。無論是對於郵件編寫者還是程式設計師,這種合作方式都很容易帶來誤解和造成失誤。 請看一個例子:一個Java程式從某個資料來源收集一些客戶資訊,透過email給公司的每一個客戶傳送帳戶餘額資訊。下面是完成這個任務的Java程式(完整的示例程式程式碼可以從本文最後下載): for (int i=0; i { Customer customer = (Customer)customers.get(i); StringBuffer message = new StringBuffer(); message.append ("尊敬的先生/女士: "); message.append (customer.getCustName()); message.append (" "); message.append (" "); message.append ("您的帳戶餘額是 "); message.append (customer.getAccountTotal()); message.append (" "); message.append (" "); message.append ("致禮!"); message.append (" "); message.append ("某某裝飾品公司"); // 傳送email mm.sendMail (customer.getFirstName(), customer.getEmail(), "Account", message.toString()); } 上面的例子可謂傳送訊息最差勁的方法之一。由於訊息嵌入到了程式程式碼之中,如果沒有程式設計師的幫助,其他人幾乎不可能對訊息進行編輯。同時,即使對於專業的程式設計師,如果他不瞭解程式碼,要進行編輯也很困難。如果你預見了這些麻煩,把程式碼寫成下面這種形式: static public final String STR_HELLO="尊敬的先生/女士: "; static public final String STR_MESSAGE="您的帳戶餘額是 "; static public final String STR_BEY="致禮! 某某裝飾品公司"; 如果說上述程式碼使得訊息編輯更容易,那麼這種幫助也不會很多。很難要求一個不搞程式設計的人理解static和final的含義。此外,如果要改變訊息的結構,上面這種程式碼也不夠靈活。例如,人們可能要求你在郵件訊息中加入更多來自資料來源的資訊,這時,你就得修改構造郵件的程式碼,或許還要新增更多的static final String物件。 模板簡介從文字檔案裝入訊息文字可以解決部分問題??但不能提供動態內容,而這對於系統來說是很重要的。你需要有一種方法把動態內容插入到預先編寫好的文字訊息。但是,如果使用某種文字模板引擎,它就能夠幫助你完成所有複雜的工作。 模板引擎解決了把動態內容插入文字訊息的問題。使用模板引擎時,我們不再把訊息直接嵌入程式,而是建立一個包含文字內容的簡單文字檔案,稱為“文字模板”。模板引擎解析文字模板,藉助一些簡單的模板指令,把動態內容插入模板輸出結果。 我選擇的模板引擎是Jakarta Project的Velocity,但你可以任意選擇其他許多模板引擎之一。Velocity和WebMacro或許是當前功能最豐富、最受歡迎的兩個引擎,而且兩者都按照原始碼開放協議免費提供。雖然我在本文例子中使用Velocity,你可以方便地把這些例子移植到不同的模板引擎,只需遵照目標引擎的語法即可。我們來看看用Velocity完成的email程式例子。要編譯和執行修改後的程式,你必須下載Velocity並把它加入到classpath。如果要讓email部分也能正常執行,你還需要JavaMail。 for (int i=0; i in ”。#foreach指令迭代list,把list中的每個元素放入item引數,然後解析#foreach塊內的內容。對於 list內的每個元素,#foreach塊的內容都會重複解析一次。從效果上看,它相當於告訴模板引擎說:“把list中的每一個元素依次放入item變數,每次放入一個元素,輸出一次#foreach塊的內容”。 MVC設計模型在看下一個例子之前,請回顧一下前面我們所討論的內容。使用模板引擎最大的好處在於,它分離了程式碼(或程式邏輯)和表現(輸出)。由於這種分離,你可以修改程式邏輯而不必擔心郵件訊息本身;類似地,你(或公關部門的職員)可以在不重新編譯程式的情況下,重新編寫郵件訊息。 實際上,我們分離了系統的資料模式(Data Model,即提供資料的類)、控制器(Controller,即郵件程式)以及檢視(View,即模板)。這種三層體系稱為Model-View- Controller模型(MVC)。如果遵從MVC模型,程式碼分成三個截然不同的層,簡化了軟體開發過程中所有相關人員的工作(MVC的出現已經有一段時間,參見本文最後的“參考資源”瞭解更多資訊)。 結合模板引擎使用的資料模式可以是任何Java物件,最好是使用Java Collection Framework的物件。控制器只要瞭解模板的環境(如VelocityContext),一般這種環境都很容易使用。一些關聯式資料庫的“物件-關係” 對映工具能夠和模板引擎很好地協同,簡化JDBC操作;對於EJB,情形也類似。 模板引擎與MVC中檢視這一部分的關係更為密切。模板語言的功能很豐富、強大,足以處理所有必需的檢視功能,同時它往往很簡單,不熟悉程式設計的人也可以使用它。模板語言不僅使得設計者從過於複雜的程式設計環境中解脫出來,而且它保護了系統,避免了有意或無意帶來危險的程式碼。例如,模板的編寫者不可能編寫出導致無限迴圈的程式碼,或侵佔大量記憶體的程式碼。不要輕估這些安全機制的價值;大多數模板編寫者不懂得程式設計,從長遠來看,避免他們接觸複雜的程式設計環境相當於節省了你自己的時間。 許多模板引擎的使用者相信,在採用模板引擎的方案中,控制器部分和檢視部分的明確分離,再加上模板引擎固有的安全機制,使得模板引擎足以成為其他內容釋出系統(比如JSP)的替代方案。因此,Java模板引擎最常見的用途是替代JSP也就不足為奇了。 HTML處理由於人們總是看重模板引擎用來替換JSP的作用,有時他們會忘記模板還有更廣泛的用途。到目前為止,模板引擎最常見的用途是處理HTML Web內容。但我還用模板引擎生成過SQL、email、XML甚至Java原始碼。在這裡我只能涉及模板的部分應用,但你可以從本文最後的參考資源找到更多的例子。 我將在下面的HTML例子中使用前面email例子的資料模式。這個HTML頁面是一個假想的企業Intranet頁面,它顯示出客戶帳戶的詳細資訊。本例中的控制器類是一個Java Servlet,檢視部分則包含一個HTML模板。下面的程式碼顯示了Servlet類中最主要的程式碼。為使這個例子更具有代表性,我從頭開始手工編寫這個 Servlet。然而,一般情況下,模板會提供一些Servlet工具,幫助使用者減輕一些編寫程式碼的負擔。 // 裝入模板 Template template = Velocity.getTemplate("html.vm"); // 建立環境 VelocityContext context = new VelocityContext(); context.put ("customers",Customer.getCustomers());// 解析模板,輸出應答ServletOutputStream output = response.getOutputStream();Writer writer = new OutputStreamWriter (output);template.merge(context, writer);writer.flush(); 這個例子也沒有什麼令人驚異的地方。和前面的例子一樣,我只是把必需的物件加入到VelocityContext,然後輸出解析模板的結果。但是請注意,在前面的例子中,我只把一個Customer加入到VelocityContext,這裡加入到VelocityContext的卻是一組 Customer物件。我可以用#foreach指令迭代訪問所有的Customer物件。下面是相應的HTML模板:

客戶報告

#foreach ($customer in $customers)

$customer.CustName

#foreach ($transaction in $customer.Transactions)
$transaction.Date

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-958023/,如需轉載,請註明出處,否則將追究法律責任。

用Java程式生成文字的捷徑(轉)
請登入後發表評論 登入
全部評論

相關文章