【摘 要】眾多企業(yè)都用Web發(fā)布新聞信息,新聞信息在絕大多數(shù)時(shí)候樣式固定不變。FreeMarker是一個(gè)使用純Java編寫(xiě)的模板引擎,能夠基于模板動(dòng)態(tài)和靜態(tài)生成HTML網(wǎng)頁(yè).本文在企業(yè)應(yīng)用中,利用FreeMarker模板技術(shù)為某企業(yè)進(jìn)行新聞網(wǎng)頁(yè)改造,改造方式分為Servlet動(dòng)態(tài)生成新聞、后臺(tái)生成靜態(tài)Html新聞,在新聞消息的整合和企業(yè)版本升級(jí)優(yōu)勢(shì)上得到充分體現(xiàn)。
【關(guān)鍵詞】新聞發(fā)布;FreeMarker;版本升級(jí);Java
1.引言
現(xiàn)在大部分企業(yè)或公司都要求有自己的網(wǎng)站,用來(lái)發(fā)布新聞信息展示公司自己的形象、宣傳自己的產(chǎn)品、獲取客戶(hù)的反饋信息等?;赪eb的系統(tǒng)由于前臺(tái)頁(yè)面經(jīng)常需要改版,花費(fèi)在維護(hù)界面改動(dòng)上的成本越來(lái)越高[1,3]。經(jīng)研究表明,這些網(wǎng)站的網(wǎng)頁(yè)顯示風(fēng)格在一段時(shí)間內(nèi)不會(huì)變化。如果將網(wǎng)站的顯示風(fēng)格抽象成固定模板,而網(wǎng)站的信息內(nèi)容獨(dú)立管理,這樣網(wǎng)站的顯示和數(shù)據(jù)可分開(kāi)管理和設(shè)計(jì)。通過(guò)FreeMarker引擎可將信息按照對(duì)應(yīng)的模板生成所需要的HTML頁(yè)面。這樣一個(gè)模板可以應(yīng)用到多條信息的顯示上,而同一條信息也可以通過(guò)不同模板生成不同的網(wǎng)頁(yè),從而可以大大提高信息內(nèi)容網(wǎng)站的建設(shè)和升級(jí)[1]。下面以FreeMarker實(shí)現(xiàn)某企業(yè)新聞模塊的改版升級(jí)為例,講述FreeMarker的應(yīng)用過(guò)程。
2.Freemarker簡(jiǎn)介
FreeMarker是基于Java的開(kāi)發(fā)包和類(lèi)庫(kù),一種基于模板的、用來(lái)生成輸出文本的通用工具。它一開(kāi)始就是為MVC設(shè)計(jì)的,不依賴(lài)于Servlet,網(wǎng)絡(luò)或Web環(huán)境,僅僅專(zhuān)注于展示,且程序邏輯(Java程序)和頁(yè)面設(shè)計(jì)(FreeMarker模板)分離,分層清晰、易于維護(hù),利于分工合作,支持Struts2,Springmvc等主流Web框架的集成,簡(jiǎn)單易學(xué)、功能強(qiáng)大,免費(fèi)開(kāi)源。程序員可以將它嵌入到自己的項(xiàng)目中,實(shí)現(xiàn)MVC框架中的View層組件、Html頁(yè)面靜態(tài)化、代碼生成工具、CMS模板引擎、頁(yè)面欄目動(dòng)態(tài)定制等。它可以從Servlet獲取的數(shù)據(jù)來(lái)動(dòng)態(tài)生成HTML代碼,且編譯速度非??欤c普通的HTML相比也毫不遜色[2],很多采用MVC模式的軟件架構(gòu)都使用FreeMarker來(lái)實(shí)現(xiàn)模板功能,支持從任意位置加載模板;從類(lèi)路徑下,從數(shù)據(jù)庫(kù)中等,易于定義特設(shè)的宏和函數(shù)。它的核心原理是:數(shù)據(jù)模型+模版=輸出[1]。
3.新聞發(fā)布改進(jìn)并整合的設(shè)計(jì)與實(shí)現(xiàn)
在企業(yè)新聞的發(fā)布中,有一些新聞?dòng)脩?hù)的訪(fǎng)問(wèn)量特別多,又有一些用戶(hù)訪(fǎng)問(wèn)量比較少。針對(duì)這兩種情況,程序設(shè)計(jì)人員怎么做呢?又怎么加以區(qū)分這兩種新聞呢?文章給出具體步驟設(shè)計(jì)并實(shí)現(xiàn)。
3.1 定義Html網(wǎng)頁(yè)模板,并用FreeMarker對(duì)其進(jìn)行編程
3.1.1 手動(dòng)制作html網(wǎng)頁(yè)
比如:制作topimgdowntext.htm,上方顯示新聞的圖片,下方顯示新聞的文字,網(wǎng)頁(yè)美工人員可以事先用html做好。效果圖略。
3.1.2 對(duì)模板進(jìn)行編程
另存topimgdowntext.htm網(wǎng)頁(yè)為topimg-
downtext.ftl后綴文件,用FreeMarKer語(yǔ)言對(duì)其進(jìn)行編程,原則是只對(duì)需要變動(dòng)的數(shù)據(jù)進(jìn)行數(shù)據(jù)替換,比如這一種上方圖片、下方文字新聞,在以后的新聞發(fā)布中會(huì)用很多次,那么需要替換的部分就是圖片和文字,而新聞模板的樣式是沒(méi)有改變的。簡(jiǎn)單實(shí)例如下:替換img標(biāo)簽的${image1},p標(biāo)簽的${content}。更復(fù)雜的需要自己動(dòng)手編程,對(duì)模板進(jìn)行定義。
3.1.3 設(shè)置模板專(zhuān)用庫(kù)templates
模板放于工程目錄templates下,這個(gè)文件夾專(zhuān)用于存放各類(lèi)型的網(wǎng)頁(yè)模板,動(dòng)態(tài)和靜態(tài)方式都需要調(diào)用這個(gè)目錄下的模板,設(shè)置文件夾的目的是為了方便工程管理。還可以自定義模板,導(dǎo)入到模板庫(kù),方便新聞發(fā)布者預(yù)覽和調(diào)用,預(yù)覽時(shí)候配合原模板的Html文件。
3.2 整合并改進(jìn)新聞發(fā)布
通過(guò)對(duì)企業(yè)單位的分析,發(fā)現(xiàn)在實(shí)際的網(wǎng)站訪(fǎng)問(wèn)中,有一些新聞?dòng)脩?hù)點(diǎn)擊率相當(dāng)?shù)母?,有一些新聞?dòng)脩?hù)點(diǎn)擊率不高,于是從服務(wù)器承受訪(fǎng)問(wèn)壓力的角度來(lái)看,對(duì)于那些訪(fǎng)問(wèn)不高的新聞采取Servlet動(dòng)態(tài)加載模板輸出新聞網(wǎng)頁(yè)來(lái)實(shí)現(xiàn);對(duì)于那些訪(fǎng)問(wèn)量特別高的新聞采取新聞發(fā)布時(shí),用模板技術(shù),先在后臺(tái)生成靜態(tài)的Html新聞網(wǎng)頁(yè),并按日期、分類(lèi)存放在服務(wù)器端(sina,sohu大多采取這種方式),當(dāng)用戶(hù)訪(fǎng)問(wèn)時(shí)候直接調(diào)用html靜態(tài)網(wǎng)頁(yè)就行了,這樣可以減輕因服務(wù)器編譯、執(zhí)行帶來(lái)性能上的壓力。
3.2.1 Servlet動(dòng)態(tài)輸出網(wǎng)頁(yè)實(shí)現(xiàn)
WEB-INF\web.xml中的配置
說(shuō)明:在配置Servlet的時(shí)候,servlet-name名字可以任意起名,url-pattern可以不用設(shè)置,這里設(shè)置成*.to為為了和項(xiàng)目中用到的Struts中的*.do格式統(tǒng)一,servlet-class是需要手動(dòng)寫(xiě)的java代碼。關(guān)鍵代碼片段如下:
Configuration cfg=new Configuration();
cfg.
setServletContextForTemplateLoading
(getServletContext(),SystemPara.templatesAddr);設(shè)置FreeMarker的模版文件位置
Map root=new HashMap();建立數(shù)據(jù)模型
root.put(\"content\",News_Content);為新聞內(nèi)容賦值;
root.put(\"image1\",ImgAddr+imgsName);為新聞圖片賦值;
數(shù)據(jù)庫(kù)設(shè)計(jì)部分內(nèi)容如下:
字段說(shuō)明:News_Content,專(zhuān)門(mén)存放新聞的文字,New_Src是新聞圖片存放位置,News_Template在templates模板目錄下,具體調(diào)用的模板名。這種方式下對(duì)軟件版本的改版、升級(jí)和維護(hù)比較有利。因?yàn)樾侣劦膬?nèi)容始終保持在數(shù)據(jù)庫(kù)或文件服務(wù)器里面,我們只需要對(duì)模板進(jìn)行修改,又可以利用原來(lái)數(shù)據(jù)重新生成新的新聞網(wǎng)頁(yè),缺點(diǎn)就是需要用數(shù)據(jù)庫(kù)存儲(chǔ)新聞的內(nèi)容和圖片,需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行設(shè)計(jì)。
3.2.2 靜態(tài)輸出網(wǎng)頁(yè)Html的實(shí)現(xiàn)
定義后臺(tái)輸出html文件的java處理類(lèi)
本系統(tǒng)為例:java處理類(lèi)的包名目錄是:src\logic\freemaker\html。里面定義了四個(gè)常用新聞模板處理的java類(lèi):多圖片新聞,文本新聞,上面圖片、下面文字新聞和上面兩張圖片,下方文字的新聞。
舉例MutiImages.java多圖片新聞生成為例,核心代碼如下:
Template temp=cfg.getTemplate(News_Template);加載模板,模板不同樣式。
Map root=new HashMap();
root.put(\"title\",Title);
root.put(\"content\",Content);
root.put(\"imgslist\",ImgAddr);
Writerout=newOutputStreamWriter(new FileOutputStream(OutHtmlAddr),\"GBK\");
News_Template變量為加載模板的變量,這里引用的是事先在模板庫(kù)目錄templates下定義好的模板。
ImgAddr為L(zhǎng)ist變量,然后再以文本輸出流的形式,把文件輸出到工程項(xiàng)目規(guī)定的地址,就完成靜態(tài)網(wǎng)頁(yè)的生成。
3.3 新聞發(fā)布策略分析
新聞網(wǎng)頁(yè)的設(shè)計(jì)中,我們是選擇采取servlet方式輸出,還是先輸出靜態(tài)網(wǎng)頁(yè)html文件,再提供給用戶(hù)訪(fǎng)問(wèn)呢?這需要額外的設(shè)計(jì)一個(gè)策略選擇器。第一步:開(kāi)發(fā)人員可以對(duì)該單位進(jìn)行初步的調(diào)研,對(duì)該模塊新聞的發(fā)布預(yù)先定義兩種模式中的一個(gè)。第二步,對(duì)新聞網(wǎng)頁(yè)按日,按月等進(jìn)行用戶(hù)訪(fǎng)問(wèn)量的統(tǒng)計(jì),同時(shí)對(duì)Web服務(wù)器的性能進(jìn)行同步檢測(cè),對(duì)檢測(cè)的結(jié)果記錄下最高和最低的峰值和出現(xiàn)的時(shí)間點(diǎn),然后和這期間的用戶(hù)訪(fǎng)問(wèn)量做比對(duì),對(duì)比對(duì)的結(jié)果,我們可以加權(quán)求一個(gè)相對(duì)的平均值,超過(guò)這個(gè)值的這類(lèi)新聞就按照html靜態(tài)生成網(wǎng)頁(yè)形式來(lái)解析,提供給用戶(hù)訪(fǎng)問(wèn);低于這個(gè)值,也就是用戶(hù)訪(fǎng)問(wèn)比較少的情況下,就采取servlet來(lái)訪(fǎng)問(wèn)。這樣可以相對(duì)達(dá)到一個(gè)平衡。
4.總結(jié)
本文用FreeMarKer模板引擎技術(shù),對(duì)某單位的新聞發(fā)布系統(tǒng)進(jìn)行了改造和整合。在這過(guò)程中,詳細(xì)的把開(kāi)發(fā)技術(shù)和流程做了介紹。通過(guò)實(shí)踐表明,F(xiàn)reeMarKer模板技術(shù)配合servlet動(dòng)態(tài)和后臺(tái)靜態(tài)輸出html兩種方式可以快速對(duì)網(wǎng)站的新聞版塊進(jìn)行升級(jí)改造,大大縮短人力和財(cái)力。
參考文獻(xiàn):
[1]屈建明,陳潔.FreeMarker模板引擎動(dòng)態(tài)生成網(wǎng)頁(yè)的應(yīng)用研究[J].計(jì)算機(jī)與現(xiàn)代化,2011(3).
[2]卞坤.公務(wù)員在線(xiàn)學(xué)習(xí)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].大連理工大學(xué),2012,6:6-7.
[3]張鐵頭,劉磊.基于模板的WEB視圖層生成技術(shù)[J].數(shù)字技術(shù)與應(yīng)用,2012.
[4]李寧.JavaWeb開(kāi)發(fā)技術(shù)大全[M].北京:清華大學(xué)出版社,2009.
[5]http://sourceforge.net/projects/freemarker/files/chinese-manual/FreeMarker_Manual_zh_CN.pdf.