蔣 彭
(上海市靜安區(qū)業(yè)余大學(xué),上海 200040)
商業(yè)需求刺激了現(xiàn)代信息技術(shù)的不斷發(fā)展,并直接對(duì)各種基于web的應(yīng)用服務(wù)產(chǎn)生了深遠(yuǎn)的影響。當(dāng)前,在以信息技術(shù)運(yùn)用為基礎(chǔ)的現(xiàn)代業(yè)務(wù)運(yùn)作模式中對(duì)WEB系統(tǒng)的依賴(lài)程度也在不斷擴(kuò)大,并且日趨復(fù)雜。一個(gè)健壯而高效的WEB應(yīng)用服務(wù)系統(tǒng)不僅能為各種業(yè)務(wù)流程節(jié)省大量的人力和物力,同時(shí)也能為用戶(hù)提供一個(gè)合理而有效的服務(wù)平臺(tái)。
本文通過(guò)闡述一種基于Struts技術(shù)的圖片管理系統(tǒng)的開(kāi)發(fā)設(shè)計(jì)過(guò)程,介紹了在J2EE平臺(tái)上進(jìn)行WEB應(yīng)用服務(wù)開(kāi)發(fā)所涉及到的一些理論知識(shí),并詳細(xì)闡明了系統(tǒng)的設(shè)計(jì)過(guò)程,與實(shí)現(xiàn)的思路和具體算法。
J2EE表示企業(yè)版Java2平臺(tái),是使用Java技術(shù)開(kāi)發(fā)企業(yè)級(jí)WEB應(yīng)用的一種事實(shí)上的工業(yè)標(biāo)準(zhǔn)。通過(guò)這個(gè)平臺(tái)可以將多種面向服務(wù)的應(yīng)用都包含在一個(gè)框架中,也稱(chēng)之為容器,每個(gè)框架中又包含用于實(shí)現(xiàn)各種功能的若干組件。在J2EE中最常用的容器就是WEB容器或稱(chēng)為WEB服務(wù)器,里面最核心的兩個(gè)組件就是JSP和SERVLET。而Struts就是基于這兩種技術(shù),依賴(lài)于WEB容器。
MVC是一種設(shè)計(jì)模式,利用應(yīng)用服務(wù)器將應(yīng)用的業(yè)務(wù)邏輯、表示邏輯和數(shù)據(jù)分為三個(gè)不同的處理層,即分為模型(Model)、視圖(View)和控制器(Controller)三個(gè)部分。當(dāng)客戶(hù)端通過(guò)瀏覽器提交用戶(hù)請(qǐng)求后,在MVC模式中由控制器接收用戶(hù)動(dòng)作,通過(guò)模型調(diào)用具體的業(yè)務(wù)邏輯進(jìn)行數(shù)據(jù)處理,并將數(shù)據(jù)處理的結(jié)果以一個(gè)特定的視圖格式在表示層中返回給用戶(hù)。MVC模式的結(jié)構(gòu)如圖1所示。
圖1 MVC模式的結(jié)構(gòu)
模型包含應(yīng)用程序的核心功能,封裝了應(yīng)用程序的狀態(tài),主要完成對(duì)數(shù)據(jù)的處理和計(jì)算操作。
視圖提供了應(yīng)用服務(wù)系統(tǒng)與用戶(hù)交互的界面,呈現(xiàn)了數(shù)據(jù)處理的結(jié)果,在視圖中只是作為一種輸出數(shù)據(jù)并允許用戶(hù)操縱的方式。
控制器對(duì)用戶(hù)的輸入做出反應(yīng),負(fù)責(zé)把用戶(hù)的請(qǐng)求提交給相應(yīng)的模型和將模型的改變及時(shí)反應(yīng)到視圖上,控制對(duì)用戶(hù)輸入的響應(yīng)方式和流程。
Java開(kāi)發(fā)WEB應(yīng)用服務(wù)系統(tǒng)有多種符合MVC開(kāi)發(fā)方式的組件及框架組合,在本項(xiàng)目中是使用JSP作為開(kāi)發(fā)模型(Model),以Struts框架作為開(kāi)發(fā)控制器(Controller),以Hibernate作為應(yīng)用服務(wù)程序與用戶(hù)交互的界面(View)。
Struts的核心是一個(gè)彈性的控制層,基于如Java Servlets,JavaBeans與XML等標(biāo)準(zhǔn)技術(shù),以及Jakarta Commons 的一些類(lèi)庫(kù)。結(jié)合Struts框架的MVC模式處理過(guò)程是:其中控制器部分由Struts的ActionServlet 類(lèi)和Action類(lèi)來(lái)實(shí)現(xiàn),在客戶(hù)提交請(qǐng)求后,首先由前端控制器ActionServlet類(lèi)接收,它將不同的請(qǐng)求傳遞給不同的后端控制器Action類(lèi)來(lái)進(jìn)行處理,請(qǐng)求的URL和后端控制器的映射關(guān)系在配置文件struts-config.xml中的〈action-mappings〉里面設(shè)置,并返回JSP類(lèi)型的視圖格式,Struts框架的結(jié)構(gòu)如圖2所示。
圖2 Struts框架的結(jié)構(gòu)
系統(tǒng)主要是實(shí)現(xiàn)圖片上傳、編輯和展示的功能。其中圖片展示模塊主要實(shí)現(xiàn)在頁(yè)面中按分類(lèi)顯示圖片預(yù)覽效果的功能,并可按照不同的分類(lèi)訂閱RSS,以供用戶(hù)有選擇性的訂閱或?yàn)g覽;圖片管理模塊包括圖片的上傳、圖片縮略圖編輯和組圖編輯等功能。
在整體顯示界面布局設(shè)計(jì)中主要采用Struts中的Tiles框架來(lái)實(shí)現(xiàn),Tiles框架為創(chuàng)建Web頁(yè)面提供了一種模板機(jī)制,它能將網(wǎng)頁(yè)的布局和內(nèi)容分離。允許先創(chuàng)建模板,然后在運(yùn)行時(shí)動(dòng)態(tài)地將內(nèi)容插入到模板中。與采用基本的JSP語(yǔ)言來(lái)創(chuàng)建Web頁(yè)面相比,Tiles框架大大提高了視圖層程序代碼的可重用性、可擴(kuò)展性和可維護(hù)性。
首先,定義模板文件,在模板文件要插入頁(yè)面的地方加入〈tiles:insert〉標(biāo)簽并定義attribute屬性,該屬性指定了待插入內(nèi)容的邏輯名,而沒(méi)有指定真正被插入的文件。
其次,在專(zhuān)門(mén)的XML文件中配置Tiles 組件,這個(gè)文件位于WEB-INF目錄下。在本項(xiàng)目中,該文件名為tilesDefinitions.xml。在配置文件中配置definition元素和put元素,對(duì)應(yīng)模板文件和其下所定義的邏輯名。
最后,在web.xml配置文件中配置如下〈taglib〉元素:
〈taglib-uri〉/WEB-INF/struts-tiles.tld〈/tagliburi〉
〈taglib-location〉/WEB-INF/struts-tiles.tld〈/taglib-location〉
在系統(tǒng)設(shè)計(jì)中,選用了Sun公司所提供的開(kāi)發(fā)組件Rome來(lái)實(shí)現(xiàn)符合RSS2.0標(biāo)準(zhǔn)的RSS功能。在RSS文檔中,它的根元素是〈rss〉,并包含一個(gè)表示其版 本 的version屬 性, 如:〈rss version="2.0"〉。整個(gè) RSS 文檔由包含在 〈rss〉 中的一個(gè) 〈channel〉元素及其子元素組成。除了頻道內(nèi)容本身之外,〈channel〉元素還以〈item〉項(xiàng)的形式包含表示頻道元數(shù)據(jù)(metadata)的元素?!磇tem〉項(xiàng)通常是頻道的主要部分,包含經(jīng)常變化的內(nèi)容。不論是在channel還是item中,都要包含以下三個(gè)必須的元素:〈title〉,頻道或提要的名稱(chēng);〈link〉,與之關(guān)聯(lián)的 Web 站點(diǎn)或者站點(diǎn)區(qū)域的 URL;〈description〉,簡(jiǎn)要的介紹或描述。
根據(jù)上述描述,將圖片的分類(lèi)(category)對(duì)應(yīng)RSS中的頻道(channel),將組圖(story)對(duì)應(yīng)項(xiàng)(item),然后根據(jù)時(shí)間排列列出最新的6個(gè)組圖數(shù)據(jù)進(jìn)行輸出。RSS最終聚合方式的實(shí)現(xiàn)方法是,在做struts跳轉(zhuǎn)之前,通過(guò)servlet中response的getWriter()方法直接以XML的格式輸出處理后的數(shù)據(jù)。
channel.setEncoding ("UTF-8"); //定義所生成的XML的字符集
channel.setTitle ("圖片新聞網(wǎng)"); //設(shè)置title內(nèi)容
channel.setDescription (dw.getCateName()); //設(shè)置Description內(nèi)容
channel.setLink ("##"); //設(shè)置鏈接
在圖片編輯設(shè)計(jì)中圖片上傳功能是通過(guò)struts框架中的FormFile組件實(shí)現(xiàn)的,它主要是基于apache的common-uploadfile工具包通過(guò)數(shù)據(jù)流的方式將數(shù)據(jù)傳回服務(wù)器端。
在邏輯驗(yàn)證通過(guò)后,按照設(shè)定的算法將原始圖片做成兩張縮略圖片,以供在組圖和大圖瀏覽時(shí)能以最佳的精度得以展示。
BufferedImage src = ImageIO.read (new File(srcImageFile)); //讀入文件
BufferedImage tag = new BufferedImage (w, h,
BufferedImage.TYPE_INT_RGB); //創(chuàng)建指定尺寸的RGB模式圖片對(duì)象
tag.getGraphics().drawImage (src,0,0,w,h,null);//根據(jù)原始圖片開(kāi)始繪制
File smallfile = new File (path);
ImageIO.write (tag, "jpg", smallfile); //寫(xiě)入圖片
在面向Web系統(tǒng)的前臺(tái)顯示頁(yè)面中,通常設(shè)置字符集為GB2312或GBK,而Java默認(rèn)采用的是unicode編碼,即UTF-8字符集,加之?dāng)?shù)據(jù)庫(kù)也有字符集的設(shè)定,如果這三者之間不能統(tǒng)一或者相互轉(zhuǎn)換,那么就會(huì)產(chǎn)生顯示亂碼的情況。
因此在本系統(tǒng)設(shè)計(jì)中加入過(guò)濾器(filter),通過(guò)在java端轉(zhuǎn)換字符集,每當(dāng)有request和response請(qǐng)求時(shí),需要經(jīng)過(guò)系統(tǒng)后臺(tái)的java程序進(jìn)行處理,強(qiáng)制轉(zhuǎn)換所包含數(shù)據(jù)的字符集。
具體實(shí)現(xiàn)是通過(guò)StrutsFormUtil類(lèi),該類(lèi)實(shí)現(xiàn)了Filter接口,通過(guò)讀取配置的方式將數(shù)據(jù)轉(zhuǎn)換成指定的字符集。
Struts技術(shù)使用標(biāo)記和 MVC模式提高了程序設(shè)計(jì)代碼的可重用性和靈活性,使網(wǎng)頁(yè)設(shè)計(jì)人員和程序開(kāi)發(fā)人員能將精力集中于自己最擅長(zhǎng)的方面。但是,在強(qiáng)健性增強(qiáng)的同時(shí),也意味著復(fù)雜性的增加。Struts技術(shù)比簡(jiǎn)單的單個(gè) JSP 網(wǎng)頁(yè)要復(fù)雜得多,但對(duì)于更大的系統(tǒng)而言,Struts技術(shù)實(shí)際上有助于管理復(fù)雜性。
本文通過(guò)采用Struts技術(shù)進(jìn)行圖片管理系統(tǒng)設(shè)計(jì)過(guò)程的闡述,介紹了其中所運(yùn)用到的相關(guān)框架、組件以及設(shè)計(jì)模式。從本文中可看出在J2EE平臺(tái)下使用Struts技術(shù),除了具有Java語(yǔ)言本身的優(yōu)點(diǎn)外,還可以利用其中諸多功能豐富的組件,使其可以勝任企業(yè)級(jí)應(yīng)用的復(fù)雜性和安全性的要求,Struts也可能會(huì)成為您下一個(gè)WEB項(xiàng)目中不可缺少的一部分。
[1] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. 設(shè)計(jì)模式[M]. 機(jī)械工業(yè)出版社, 2002.
[2] 孫衛(wèi)琴. 精通struts [M]. 電子工業(yè)出版社, 2004.
[3] 孫衛(wèi)琴. 精通hibernate [M]. 電子工業(yè)出版社, 2005.
[4] 曾順. 精通JavaScript+jQuery[M]. 人民郵電出版社,2008.
[5] 劉潤(rùn)東. Object Design & Programming with UML[M]. 北京希望電子出版社, 2001.
[6] 譚穎華, 張?jiān)骑w, 唐勇. Webwork inAction中文版[M]. 電子工業(yè)出版社, 2006.