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