蔣 彭
(上海市靜安區業余大學,上海 200040)
商業需求刺激了現代信息技術的不斷發展,并直接對各種基于web的應用服務產生了深遠的影響。當前,在以信息技術運用為基礎的現代業務運作模式中對WEB系統的依賴程度也在不斷擴大,并且日趨復雜。一個健壯而高效的WEB應用服務系統不僅能為各種業務流程節省大量的人力和物力,同時也能為用戶提供一個合理而有效的服務平臺。
本文通過闡述一種基于Struts技術的圖片管理系統的開發設計過程,介紹了在J2EE平臺上進行WEB應用服務開發所涉及到的一些理論知識,并詳細闡明了系統的設計過程,與實現的思路和具體算法。
J2EE表示企業版Java2平臺,是使用Java技術開發企業級WEB應用的一種事實上的工業標準。通過這個平臺可以將多種面向服務的應用都包含在一個框架中,也稱之為容器,每個框架中又包含用于實現各種功能的若干組件。在J2EE中最常用的容器就是WEB容器或稱為WEB服務器,里面最核心的兩個組件就是JSP和SERVLET。而Struts就是基于這兩種技術,依賴于WEB容器。
MVC是一種設計模式,利用應用服務器將應用的業務邏輯、表示邏輯和數據分為三個不同的處理層,即分為模型(Model)、視圖(View)和控制器(Controller)三個部分。當客戶端通過瀏覽器提交用戶請求后,在MVC模式中由控制器接收用戶動作,通過模型調用具體的業務邏輯進行數據處理,并將數據處理的結果以一個特定的視圖格式在表示層中返回給用戶。MVC模式的結構如圖1所示。

圖1 MVC模式的結構
模型包含應用程序的核心功能,封裝了應用程序的狀態,主要完成對數據的處理和計算操作。
視圖提供了應用服務系統與用戶交互的界面,呈現了數據處理的結果,在視圖中只是作為一種輸出數據并允許用戶操縱的方式。
控制器對用戶的輸入做出反應,負責把用戶的請求提交給相應的模型和將模型的改變及時反應到視圖上,控制對用戶輸入的響應方式和流程。
Java開發WEB應用服務系統有多種符合MVC開發方式的組件及框架組合,在本項目中是使用JSP作為開發模型(Model),以Struts框架作為開發控制器(Controller),以Hibernate作為應用服務程序與用戶交互的界面(View)。
Struts的核心是一個彈性的控制層,基于如Java Servlets,JavaBeans與XML等標準技術,以及Jakarta Commons 的一些類庫。結合Struts框架的MVC模式處理過程是:其中控制器部分由Struts的ActionServlet 類和Action類來實現,在客戶提交請求后,首先由前端控制器ActionServlet類接收,它將不同的請求傳遞給不同的后端控制器Action類來進行處理,請求的URL和后端控制器的映射關系在配置文件struts-config.xml中的〈action-mappings〉里面設置,并返回JSP類型的視圖格式,Struts框架的結構如圖2所示。

圖2 Struts框架的結構
系統主要是實現圖片上傳、編輯和展示的功能。其中圖片展示模塊主要實現在頁面中按分類顯示圖片預覽效果的功能,并可按照不同的分類訂閱RSS,以供用戶有選擇性的訂閱或瀏覽;圖片管理模塊包括圖片的上傳、圖片縮略圖編輯和組圖編輯等功能。
在整體顯示界面布局設計中主要采用Struts中的Tiles框架來實現,Tiles框架為創建Web頁面提供了一種模板機制,它能將網頁的布局和內容分離。允許先創建模板,然后在運行時動態地將內容插入到模板中。與采用基本的JSP語言來創建Web頁面相比,Tiles框架大大提高了視圖層程序代碼的可重用性、可擴展性和可維護性。
首先,定義模板文件,在模板文件要插入頁面的地方加入〈tiles:insert〉標簽并定義attribute屬性,該屬性指定了待插入內容的邏輯名,而沒有指定真正被插入的文件。
其次,在專門的XML文件中配置Tiles 組件,這個文件位于WEB-INF目錄下。在本項目中,該文件名為tilesDefinitions.xml。在配置文件中配置definition元素和put元素,對應模板文件和其下所定義的邏輯名。
最后,在web.xml配置文件中配置如下〈taglib〉元素:
〈taglib-uri〉/WEB-INF/struts-tiles.tld〈/tagliburi〉
〈taglib-location〉/WEB-INF/struts-tiles.tld〈/taglib-location〉
在系統設計中,選用了Sun公司所提供的開發組件Rome來實現符合RSS2.0標準的RSS功能。在RSS文檔中,它的根元素是〈rss〉,并包含一個表示其版 本 的version屬 性, 如:〈rss version="2.0"〉。整個 RSS 文檔由包含在 〈rss〉 中的一個 〈channel〉元素及其子元素組成。除了頻道內容本身之外,〈channel〉元素還以〈item〉項的形式包含表示頻道元數據(metadata)的元素。〈item〉項通常是頻道的主要部分,包含經常變化的內容。不論是在channel還是item中,都要包含以下三個必須的元素:〈title〉,頻道或提要的名稱;〈link〉,與之關聯的 Web 站點或者站點區域的 URL;〈description〉,簡要的介紹或描述。
根據上述描述,將圖片的分類(category)對應RSS中的頻道(channel),將組圖(story)對應項(item),然后根據時間排列列出最新的6個組圖數據進行輸出。RSS最終聚合方式的實現方法是,在做struts跳轉之前,通過servlet中response的getWriter()方法直接以XML的格式輸出處理后的數據。
channel.setEncoding ("UTF-8"); //定義所生成的XML的字符集
channel.setTitle ("圖片新聞網"); //設置title內容
channel.setDescription (dw.getCateName()); //設置Description內容
channel.setLink ("##"); //設置鏈接
在圖片編輯設計中圖片上傳功能是通過struts框架中的FormFile組件實現的,它主要是基于apache的common-uploadfile工具包通過數據流的方式將數據傳回服務器端。
在邏輯驗證通過后,按照設定的算法將原始圖片做成兩張縮略圖片,以供在組圖和大圖瀏覽時能以最佳的精度得以展示。
BufferedImage src = ImageIO.read (new File(srcImageFile)); //讀入文件
BufferedImage tag = new BufferedImage (w, h,
BufferedImage.TYPE_INT_RGB); //創建指定尺寸的RGB模式圖片對象
tag.getGraphics().drawImage (src,0,0,w,h,null);//根據原始圖片開始繪制
File smallfile = new File (path);
ImageIO.write (tag, "jpg", smallfile); //寫入圖片
在面向Web系統的前臺顯示頁面中,通常設置字符集為GB2312或GBK,而Java默認采用的是unicode編碼,即UTF-8字符集,加之數據庫也有字符集的設定,如果這三者之間不能統一或者相互轉換,那么就會產生顯示亂碼的情況。
因此在本系統設計中加入過濾器(filter),通過在java端轉換字符集,每當有request和response請求時,需要經過系統后臺的java程序進行處理,強制轉換所包含數據的字符集。
具體實現是通過StrutsFormUtil類,該類實現了Filter接口,通過讀取配置的方式將數據轉換成指定的字符集。


Struts技術使用標記和 MVC模式提高了程序設計代碼的可重用性和靈活性,使網頁設計人員和程序開發人員能將精力集中于自己最擅長的方面。但是,在強健性增強的同時,也意味著復雜性的增加。Struts技術比簡單的單個 JSP 網頁要復雜得多,但對于更大的系統而言,Struts技術實際上有助于管理復雜性。
本文通過采用Struts技術進行圖片管理系統設計過程的闡述,介紹了其中所運用到的相關框架、組件以及設計模式。從本文中可看出在J2EE平臺下使用Struts技術,除了具有Java語言本身的優點外,還可以利用其中諸多功能豐富的組件,使其可以勝任企業級應用的復雜性和安全性的要求,Struts也可能會成為您下一個WEB項目中不可缺少的一部分。
[1] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. 設計模式[M]. 機械工業出版社, 2002.
[2] 孫衛琴. 精通struts [M]. 電子工業出版社, 2004.
[3] 孫衛琴. 精通hibernate [M]. 電子工業出版社, 2005.
[4] 曾順. 精通JavaScript+jQuery[M]. 人民郵電出版社,2008.
[5] 劉潤東. Object Design & Programming with UML[M]. 北京希望電子出版社, 2001.
[6] 譚穎華, 張云飛, 唐勇. Webwork inAction中文版[M]. 電子工業出版社, 2006.