中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

用Java程序生成文本的捷徑(轉)

發布時間:2020-08-10 15:02:01 來源:ITPUB博客 閱讀:145 作者:BSDLite 欄目:編程語言
用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
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南汇区| 武汉市| 车险| 陵水| 洪雅县| 太仓市| 闻喜县| 嘉峪关市| 屯留县| 乃东县| 盐山县| 香格里拉县| 宁阳县| 南开区| 安远县| 芷江| 武清区| 连江县| 临颍县| 武川县| 扎鲁特旗| 郯城县| 康定县| 清涧县| 平原县| 娄底市| 云霄县| 商河县| 通道| 镇原县| 清水县| 霍邱县| 无棣县| 兰考县| 尚志市| 凌云县| 泽库县| 四会市| 牙克石市| 砚山县| 桦甸市|