眾所周知,Web這個Intemet上最熱門的應用架構是由Tim Bemers-Lee發明的。Web的前身是1980年Tim Bemers-Lee負責的Enquire(Enquire Within Upon Everything的簡稱)項目。1990年11月,第一個web服務器nxoc01.eem.ch開始運行,Tim Bemers-Lee在自己編寫的圖形化web瀏覽器Worldwideweb上看到了最早的Web頁面。1991年,CERN(European Particle Physies Laboratory)正式發布了Web技術標準。目前,與web相關的各種技術標準都由著名的W3C組織(World Wide Web Consortium)管理和維護。
Web是一種典型的分布式應用架構。Web應用中的每一次信息交換都要涉及到客戶端和服務端兩個層面。因此,Web開發技術大體上也可以被分為客戶端技術和服務端技術兩大類。
Web客戶端的主要任務是展現信息內容,而HTML語言則是信息展現的最有效載體之一。作為一種實用的超文本語言,HTML的歷史最早可以追溯到上世紀四十年代。1945年,Vannevar Bush在一篇文章中闡述了文本和文本之間通過超級鏈接相互關聯的思想,并在文中給出了一種能實現信息關聯的計算機Mcmex的設計方案。Doug Engelbart等人則在1960年前后,對信息關聯技術做了最早的實驗。與此同時,Ted Nelson正式將這種信息關聯技術命名為超文本(Hypertext)技術。1969年,IBM的Charles Goldfarb由發明了可用于描述超文本信息的GML(Generalized Markup Language)語言。1978到1986年間,在ANSI等組織的努力下,GML語言進一步發展成為著名的SGML語言標準。當Tim Bemers-Lee和他的同事們在1989年試圖創建一個基于超文本的分布式應用系統時,Tim Bemers-Lee意識到,SGML是描述超文本信息的一個上佳方案,但美中不足的是,SGML過于復雜,不利于信息的傳遞和解析。于是,Tim Bemers-Lee對SGML語言做了大刀闊斧的簡化和完善。1990年,第一個圖形化的Web瀏覽器“World Wide Web”終于可以使用一種為Web量身定制的語言HTML來展現超文本信息了。
最初的HTML語言只能在瀏覽器中展現靜態的文本或圖像信息,這滿足不了人們對信息豐富性和多樣性的強烈需求,最終,由靜態技術向動態技術的轉變成為了Web客戶端技術演進的永恒定律。
1995年Java語言的問世為Web客戶端帶來了巨大的變革。Java語言天生就具備的平臺無關的特點,讓人們一下子找到了在瀏覽器中開發動態應用的捷徑。而后來CSS與DHTML技術的加入,讓HTML頁面真正做到了動感無限。
與客戶端技術從靜態向動態的演進過程類似,Web服務端的開發技術也是由靜態向動態逐漸發展、完善起來的。最早的Web服務器簡單地響應瀏覽器發來的HTTP請求,并將存儲在服務器上的HTML文件返回給瀏覽器。一種名為SSI(Server Side Ineludes)的技術可以讓Web服務器在返回HTML文件前,更新HTML文件的某些內容,但其功能非常有限。第一種真正使服務器能根據運行時的具體情況,動態生成HTML頁面的是CGI(Common Gateway Interface)技術,它使客戶端和服務端的動態信息交換成為了可能。隨著CGI技術的普及,聊天室、論壇、電子商務、信息查詢、全文檢索等各式各樣的Web應用蓬勃興起,人們終于可以享受到信息檢索、信息交換、信息處理等更為便捷的信息服務了。
1994年,Rasmus Lerdorf發明了專用于Web服務端編程的PHP(Personal Home Page Tools)語言。Web應用的開發者可以用一種更加簡便、快捷的方式實現動態Web功能。1996年,Microsoft借鑒PHP的思想,在其Web服務器IIS3.0中引入了ASP技術。當然,以Sun公司為首的Java陣營也不會示弱。1997年,Servlet技術問世,1998年,JSP技術誕生。Servlet和JSP的組合(還可以加上JavaBean技術)讓Java開發者同時擁有了類似CGI程序的集中處理功能和類似PHP的HTML嵌入功能,此外,Java的運行時編譯技術也大大提高了Servlet和JSP的執行效率,這也正是Servlet和JsP被后來的J2EE平臺吸納為核心技術的原因之一。
Web服務端開發技術的完善使開發復雜的Web應用成為了可能。在此起彼伏的電子商務大潮中,為了適應企業級應用開發的各種復雜需求,為了給最終用戶提供更可靠、更完善的信息服務,兩個最重要的企業級開發平臺J2EE和.NET在2000年前后分別誕生于Java和Windows陣營,它們隨即就在企業級Web開發領域展開競爭。
J2EE是純粹基于Java的解決方案。1998年,Sun發布了EJB1.0標準。EJB為企業級應用中必不可少的數據封裝、事務處理、交易控制等功能提供了良好的技術基礎。至此,J2EE平臺的三大核心技術servlet、JSP和EJB都已先后問世。1999年,Sun正式發布了J2EE的第一個版本。緊接著,遵循J2EE標準,為企業級應用提供支撐平臺的各類應用服務軟件爭先恐后地涌現了出來。IBM的websphere、BEA的WebLogic都是這一領域里最為成功的商業軟件平臺。隨著開源運動的興起,JBoSS、Tomcat等開源世界里的應用服務新秀也吸引了許多用戶的注意力。到目前,Sun的J2EE 5已經發布,其中三個關鍵組件的版本也演進到了Servlet2.5、JSP2.1和EJB3.0。至此,J2EE體系及相關的軟件產品已經成為了web服務端開發的一個強有力的支撐環境。
2000年以后,隨著Web應用的日益復雜,人們逐漸意識到,單純依靠某種技術多半無法達到快速開發、快速驗證和快速部署的最佳境界。研究者開始嘗試著將已有的Web開發技術綜合起來,形成完整的開發框架或應用模型,并以此來滿足各種復雜的應用需求。目前,在J2EE多層架構上己經開發出了很多框架,它們為應用開發提供了一個能夠使用的架構模板和軟件包,讓開發者從編碼中解脫出來,不必一切從頭開始,自己來完成,只需將注意力集中在業務邏輯上,從而減輕了開發者處理復雜問題的負擔,提高了工作效率。其次在應用和分析框架的基礎上,可以對其進行改進和擴展,以適應實際的需求。
WebWork
Webwork是由Open Symphony組織開發的,致力于組件化和代碼重用的拉出式MVC模式J2EE Web框架。現在的Webwork2.x前身是Rickard Oberg開發的Webwork,但現在Webwbrk已經被拆分成了Xwork1和Webwork2兩個項目。XWork簡潔、靈活功能強大,它是一個標準的Command模式實現,并且完全從web層脫離出來。
Struts
Struts是一個基于Sun J2EE平臺的MVC框架,主要是采用Servlet和JSP技術來實現的。由于Struts能充分滿足應用開發的需求,簡單易用,敏捷迅速,在過去的一年中頗受關注。Struts把Servlet、JSP、自定義標簽和信息資源(message resources)整合到一個統一的框架中,開發人員利用其進行開發時不用再自己編碼實現全套MVC模式,有效的縮短了開發周期。
TaPestry
Tapestry是一個開源的基于servlet的應用程序框架,它使用組件對象模型來創建動態的,交互的Web應用。一個組件就是任意一個帶有jwcid屬性的html標記。其中jwc的意思是Java Web Component。TaPestry使得java代碼與html完全分離,利用這個框架開發大型應用變得輕而易舉。并且開發的應用容易維護和升級。
IBAIS
使用ihatis提供的ORM機制,對業務邏輯實現人員而言,面對的是純粹的Java對象,這一層與通過Hibemate實現ORM而言基本一致,而對于具體的數據操作,Hibernate會自動生成SQL語句,而ibatis則要求開發者編寫具體的SQL語句。
Hibemate
Hibemate是Java平臺上的一種全功能的、開放源代碼OR映射框架。Hibemate在許多方面類似于EJB(容器管理的持久性/容器管理的關系)和JDO(Java Data Objeets)。與JDO不同,Hibemate完全著眼于關系數據庫的OR映射,并且包括比大多數商業產品更多的功能。Hibernate使用反射和運行時字節碼生成,使它對于最終用戶幾乎是透明的。Hibenate已經成為輕量級J2EE項目中持久層框架的首選,使用Hibemate可以在輕量級J2EE架構中取代CMP,完成數據持久化的重任。
Spring
Spring是一個解決了許多在J2EE開發中常見的問題的強大框架。Spring提供了管理業務對象的一致方法并且鼓勵了注入對接口編程而不是對類編程的良好習慣。Spring的架構基礎是基于使用JavaBean屬性的Inversion of Controf容器。然而,這僅僅是完整圖景中的一部分:Spring在使用IOC容器作為構建所有架構層的完整解決方案方面是獨一無二的。Spring提供了唯一的數據訪問抽象,包括簡單和有效率的JDBC框架,極大的改進了效率并且減少了可能的錯誤。Spring的數據訪問架構還集成了Hibemate和其他O/R
mapping解決方案。Spring還提供了唯一的事務管理抽象,它能夠在各種底層事務管理技術,例如JTA或者JDBC事務提供一個一致的編程模型。Spring提供了一個用標準Java語言編寫的AOP框架,它給POJOs提供了聲明式的事務管理和其他企業事務。Spring框架的使用,使得應用程序能夠拋開EJB的復雜性,同時享受著和傳統EJB相關的關鍵服務。Spring還提供了可以和IOC容器集成的強大而靈活的MVC Web框架。
2.1 ASSH框架的技術基礎
2.1.1 J2EE架構
J2EE(Java2 Entenprise Edition)是sun公司主持推出的一項企業計算平臺規范,它是一種利用Java2平臺來簡化企業解決方案的開發、部署和管理相關的復雜問題的體系結構。J2EE技術的基礎就是核心Java平臺或Java2平臺的標準版,J2EE不僅鞏固了標準版中的許多優點,例如“編寫一次、隨處運行”的特性、方便存取數據庫的 JDBC API、CORBA技術以及能夠在Internet應用中保護數據的安全模式等等,同時還提供了對EJB(Enierprise JavaBeans)、 Java Servlets API、 JSP(Java Server Pages)以及XML技術的全面支持。其最終目的就是成為一個能夠使企業開發者大幅縮短投放市場時間的體系結構。
SUN設計J2EE的初衷正是為了解決C/S模式 (client/server)的弊端,在傳統模式中,客戶端擔當了過多的角色而顯得臃腫,在這種模式中,第一次部署的時候比較容易,但難于升級或改進,可伸展性也不理想。它使得重用業務邏輯和界面邏輯非常困難。J2EE使用多層的分布式應用模型,應用邏輯按功能劃分為組件,各個應用組件根據他們所在的層分布在不同的機器上。這種模型將兩層化模型中的不同層面切分成許多層。一個多層化應用能夠為不同的每種服務提供一個獨立的層。
J2EE的三層體系結構,即表現層、業務邏輯層和數據持久層。表現層主要指用戶界面,它要求盡可能的簡單,使最終用戶不需要進行任何培訓就能方便地訪問信息;第二層是業務邏輯層,也就是常說的中間件,所有的應用系統、應用邏輯、控制都在這一層,系統的復雜性也主要體現在業務邏輯層;最后的數據持久層存儲大量的數據信息和數據邏輯,所有與數據有關的安全、完整性控制、數據的一致性、并發操作等都是在第三層完成。
采用J2EE三層結構的特點:
1.能有效降低建設和維護成本,簡化管理。
2.適應大規模和復雜的應用需求。
3.可適應不斷的變化和新的業務需求。
4.訪問異構數據庫。
5.能有效提高系統并發處理能力。
6.能有效提高系統安全性。
2.1.2StrutS框架
1.StrutS體系結構
StrutS是Apache基金會Jakarta項目組的一個開源項目,它采用MVC模式,提供了對開發MVC系統的底層支持,能夠很好地幫助java開發者利用J2EE開發Web應用。和其他的java架構一樣,Struts也是面向對象設計,將MVC模式“分離顯示邏輯和業務邏輯”的能力發揮得淋漓盡致。它采用的主要技術是Servlet,JSP和Custom tag library。其基本構成如圖2一1所示:

由上圖可以看出,在Struts框架中Controller功能由ActionServlet和ActionMapping對象構成,核心是一個Servlet類型的對象ActionServlet,它用來接受客戶端的請求。ActionServlet包括一組基于配置的ActionMapping對象,每個ActionMapping對象實現了一個請求到一個具體的Model部分中Action處理器對象之間的映射。
Model部分由Action和Acti。nForm對象構成。所有的Action處理器對象都是開發者從Struts的Action類派生的子類。Action處理器對象封裝了具體的處理邏輯,調用業務邏輯模塊,并且把響應提交到合適的View組件以產生響應。Struts提供的ActionForm組件對象可以通過定義屬性描述客戶端表單數據。開發者可以從它派生子類對象,利用它和Struts提供的自定義標記庫結合可以實現對客戶端的表單數據的良好封裝和支持,Action處理器對象可以直接對它進行讀寫,而不再需要和request、response對象進行數
據交互。通過ActionForm組件對象實現了對View和Model之間交互的支持。View部分是通過JSP技術實現的。Struts提供了自定義的標一記庫,通過這些自定義標記可以非常好地和系統的Model部分交互,通過使用這些自定義標一記創建的JSP表單,可以實現和Model部分中的ActionForm的映射,完成對用戶數據的封裝。
Struts框架在應用中采用兩個基于XML的配置文件來進行配置,分別是web.xml和struts-config.xml文件。web.xml文件是配置所有web應用的,而struts-config.xml文件是Struts框架的部署描述符,用來創建和配置各種Struts組件。
2.Struts工作流程
在Web啟動時加載并初始化AetionServlet。AetionServlet從struts-config.xml文件中讀取配置信息,把它們存放到各種配置對象中。初始化完成后,系統將通過URL匹配映射截獲所有以.do結尾的URL請求。當ActionServlet接收到一個客戶請求時:
(1)判斷用戶請求是否為Struts受理范圍的請求,如果是則接受請求。
(2)檢索和用戶請求匹配的ActionMapping實例,如果不存在,就返回用戶請求路徑無效。
(3)如果ActionForm實例不存在,就創建一個ActionForm對象,把客戶提交表單數據保存到ActionForm對象中。
(4)根據配置決定是否需要表單驗證,如果需要驗證,就調用ActionForm的validate()方法。
(5)如果AetionForm的validate()方法返回null或返回一個不包含ActionMessage的AetionError對象,就表示表單驗證成功。
(6)ActionServlet根據AetionMapping實例包含的映射決定將請求轉發給哪個Action。如果相應的Action實例不存在,就先創建這個實例,然后調用Aetion的execute()方法。
(7)Aetion的execute()方法返回一個AetionForward對象,ActionServlet再把客戶請求轉發給ActionForward對象指向的JSP組件。
(8)ActionForward對象指向的JSP組件生成動態網頁,返回給客戶。
對于以上流程(5)中,如果ActionForm的validate()方法返回一個包含一個或多個ActionMessage的ACtionErrors對象,就表示表單驗證失敗,此時ActionServlet將直接把請求轉發給包含用戶提交表單的JSP組件。在這種情況下,不會再創建Action對象并調用Action的execute()方法。
StrutS工作流程圖如圖2一2所示:

2.1.3 Spring框架
Spring是J2EE平臺上的一個開源應用框架。Spring框架本身并沒有強制實行任何特別的編程模式。在Java社區里,Spring作為EJB模型之外的另外一個選擇甚至是替代品而廣為流行。從設計上看,Spring給予了Java程序員許多的自由度,但同時對業界常見的問題也提供了良好的文檔和易于使用的方法。
1.Spring框架的組成模塊
Spring框架是一個分層架構,由7個定義良好的模塊組成。Spring模塊構建在核心容器之上,核心容器定義了創建、配置和管理bean的方式,如圖2-3所示。

組成Spring框架的每個模塊(或組件)都可以單獨存在,或者與其他一個或多個模塊聯合實現。每個模塊的功能可見附錄一。
附錄一
核心容器:核心容器提供Spring框架的基本功能。核心容器的主要組件是BeanFactory,它是工廠模式的實現。BeanFactory使用控制反轉(IOC)模式將應用程序的配置和依賴性規范與實際的應用程序代碼分開。
Spring上下文:Spring上下文是一個配置文件,向Spring框架提供上下文信息。Spring上下文包括企業服務,例如JNDI、EJB、電子郵件、國際化、校驗和調度功能。
SpringAOP:通過配置管理特性,SpringAOP模塊直接將面向方面的編程功能集成到了Spring框架中。所以,可以很容易地使Spring框架管理的任何對象支持AOP。SpringAOP模塊為基于Spring的應用程序中的對象提供了事務管理服務。
SpringDAO:JDBC DAO抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不同數據庫供應商拋出的錯誤消息。異常層次結構簡化了錯誤處理,并且極大地降低了需要編寫的異常代碼數量(例如打開和關閉連接)。Spring DAO的面向JDBC的異常遵從通用的DAO異常層次結構。
SpringORM:Spring框架插入了若干個ORM框架,從而提供了ORM的對象關系工具,其中包括JDO、Hibernate和iBatiSSQLMap。所有這些都遵從Spring的通用事務和DAO異常層次結構。
Spring Web模塊:web上下文模塊建立在應用程序上下文模塊之上,為基于Web的應用程序提供了上下文。所以,Spring框架支持與Jakarta Struts的集成。Web模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工作。
SpringMVC框架:MVC框架是一個全功能的構建Web應用程序的MVC實現。通過策略接口,MVC框架變成為高度可配置的,MVC容納了大量視圖技術,其中包括JSP、veloeity、Tiles、iText和POI。
2. Spring框架的相關技術
(1)控制反轉(Ioc)與依賴注入(DI)
控制反轉模式(Inversion of Control)簡稱IOC,其原理是基于好萊塢原則:別找我們,我們會找你。也就是說,所有的組件都是被動的,所有的組件初始化和調用都由容器負責。控制反轉意味著在系統開發過程中,設計的類將交由容器去控制,而不是在類的內部去控制,類與類之間的關系將交由容器處理,這與傳統的編程方式有了很大的不同。Martin Fowler在他的一篇文章中給IOC起了一個更為直觀的名字:依賴注射DI(Dependency Injection),即組件之間的依賴關系由容器在運行期決定,形象地說,即由容器動態地將某種依賴關系注入到組件之中。
使用Spring框架管理J2EE應用各層的對象時,不管是控制層的Action對象,還是業務層的Service對象,還是持久層的DAO對象,都可在Spring的管理下有機地協調、運行。Spring將各層的對象以松耦合的方式組織在一起,Action對象無須關心Service對象的具體實現,Service對象無須關心持久層對象的具體實現,各層對象的調用完全面向接口。當系統需要重構時,代碼的改寫量將大大減少。而這一切都得益于Spring的核心機制IOC,它讓Spring框架中Bean與Bean之間以配置文件組織在一起,而不是以硬編碼的方式耦合在一起。
Spring框架中的三種注入方式,分別為:
①接口注入
②設值注入
③構造子注入
(2)面向方面編程(AOP)
Spring框架的另一優勢是它的面向方面編程技術,相對于面向對象編程而言,面向方面編程提供從另一個角度來考慮程序結構以完善面向對象編程(OOP),為開發者提供了一種描述橫切關注點的機制,并能夠自動將橫切關注點織入到面向對象的軟件系統中,從而實現了橫切關注點的模塊化lll]。通過劃分Aspect代碼,橫切關注點變得容易處理。開發者可以在編譯時更改、插入或除去系統的Aspect,甚至重用系統的Aspect。
Spring AOP用純Java實現。它不需要專門的編譯過程。Spring AOP不需要控制類裝載器層次,因此它適用于J2EE Web容器或應用服務器。
Spring實現AOP的方法跟其他的框架不同。Spring并不是要嘗試提供最完整的AOP實現(盡管Spring AOP有這個能力),相反的,它其實側重于提供一種AOP實現和Spring IOC容器的整合,用于幫助解決在企業級開發中的常見問題。
因此,Spring AOP通常都和Spring IOC容器一起使用。Aspect使用普通的bean定義語法(盡管Spring提供了強大的“自動代理(autoproxying)”功能):與其他AOP實現相比這是一個顯著的區別。有些是使用Spring AOP無法輕松或者高效的完成的,如通知一個細粒度的對象,這種時候,使用Aspect是最好的選擇。不過經驗告訴我們:大多數在J2EE應用中遇到的問題,只要適合AOP來解決的,Spring AOP都沒有問題,SpringAOP提供了一個非常好的解決方案。
2.1.4 Hibernate框架
Hibernate框架作為對象/關系映射(Object/Relational Mapping)的解決方案,就是將Java中的對象與對象關系映射至關系型數據庫中的表格與表格之間的關系。Hibernate內部封裝了通過JDBC訪問數據庫的操作,向上層應用提供了面向對象的數據訪問API,使得Java程序員可以隨心所欲的使用對象編程思想來操縱數據庫。
Hibernate是一種非強迫性的解決方案。開發者在寫業務邏輯與持續性類時,不會被要求遵循許多Hibernate特定的規則和設計模式。這樣,Hibernate就可以與大多數新的和現有的應用平穩地集成,而不需要對應用的其余部分作破壞性的改動。更有意義的是Hibernate可以在應用EJB的J2EE架構中取代CMP,完成數據持久化的重任。
1.Hibernate框架的工作流程
Hibernate啟動后,創建Configuration實例,利用此實例加載配置文件hibernate.cfg.xml到內存中,通過hibernate.cfg.xml配置文件中的mapping節點配置并加載*.hbm.xml文件至該實例中,并利用此實例創建一個SessionFaetory實例,在由SessionFaetory實例得到Session的事務操作接口,利用此接口來操縱對數據庫的訪問,訪問結束后關閉Session連接。
具體的Hibernate工作流程如圖2一4所示:

2. Hibernate框架的優點
Hibernate作為持久層框架,其自身的優勢使得Hibernate在企業級系統的應用中越來越流行。Hibernate的優勢主要體現在以下幾點:
①對JDBC進行了輕量級的對象封裝,使編程人員不必重復編寫SQL代碼,結構清晰,維護簡單。
②Hibenate既適用于獨立的Java程序,也可以用于J2EE Web應用,還可以在應用EJB的J2EE架構中取代CMP,完成數據持久化的重任。
③以統一的方式支持多種數據庫。
④由于是開源的框架,可以對其代碼進行修改,增加或修改功能。
⑤不僅提供了Java類到數據表之間的映射,也提供了數據查詢和回復機制,避免了對數據庫的手工操作,大大減少了操作數據庫的工作量。
⑥可以和多種Web服務器或者應用服務器良好集成,幾乎支持所有流行的數據庫服務器。
2.1.5Ajax技術
目前,Web應用程序正在以幾何數量級的速度增長,其解決技術也正逐步成熟。Web應用程序不再是簡單顯示信息的網站,而逐步融合核心的業務
邏輯,成為了IT領域的業務處理平臺。但是在web應用程序中,前端的用戶界面與后臺邏輯處理的同步交互過程越來越不是適應用戶的需要,逐漸成為
Web應用發展的瓶頸。
Ajax全稱為“Asynchronous JavaScript and XML”(異步JavaScript和XML),是指一種創建交互式網頁應用的網頁開發技術。Ajax技術的出現讓業界重新審視Web應用程序的通信模式,對Web應用程序的數據傳輸速度和用戶體驗提出了更高的要求和期望,也讓業界看到了成功的曙光。
傳統的Web應用程序采用同步交互過程。在這種情況下,用戶首先向Web服務器觸發一個行為請求;反過來,服務器執行某些任務,再向發起請求的用戶返回一個HTML/XHTML頁面。這是一種不連貫的用戶體驗,服務器在處理請求的時候,用戶多數時間處于等待的狀態,屏幕內容也是一片空白。當負載較大時,用戶就必須在瀏覽器前等待很久才能得到需要的頁面,有時甚至出現打不開頁面的情況。
與傳統的web應用程序不同,Ajax采用異步交互過程,在用戶與服務器之間引入一個中間媒體,從而消除了在傳統Web應用的網絡交互過程中處理—等待—處理—等待的缺點。
Ajax引擎允許用戶與應用軟件之間交互過程異步進行,獨立于用戶與網絡服務器間的交流。通過JavaScrint調用Ajax引擎來代替產生一個Http請求的用戶動作,內存中的數據編輯、頁面導航、數據校驗、部分數據加載顯示這些都不需要重新載入整個頁面的請求,可以交給Ajax來執行。異步的Ajax傳輸過程如圖2-5所示:

Ajax技術的出現,改變了傳統Web應用程序的交互模式,為開發人員、終端用戶帶來了便捷,在Web應用中越來越流行。Ajax技術的優點主要體現在以下幾個方面:
①減輕服務器的負擔。與傳統Web系統的更新整個頁面相比,Ajax可是對頁面內容進行實時更新,即只更新需要更新的部分,其余部分則保持不變。這種
“按需 取數據”的原則可以在相當程度上減少冗余請求和響應對服務器造成的負擔。
②無刷新更新頁面,減少用戶心理和實際的等待時間。特別地,當要讀取大量數據地時候,不會像Reload那樣出現“白屏”的情況。
③進一步促進頁面呈現和數據的分離。
④可以把以前一些服務器擔負的工作轉嫁到客戶端,利用客戶端閑置的能力來處理,減輕了服務器和帶寬的負擔,節約空間和寬帶租用成本。
⑤基于標準化的并被廣泛支持的技術,無需下載插件或者小程序。
⑥跨瀏覽器和跨平臺的兼容性,可以在不同的瀏覽器(如IE、Firefox等)上建立基于Ajax的web應用。
2.2ASSH框架的設計
ASSH框架是按照J2EE三層結構對Struts、Spring、Hibernate框架進行整合并加入Ajax技術而形成的。在Web應用系統開發過程中,不同的層次采用不同的框架,表現層采用Struts MVC模式,并結合Ajax技術來增加系統與用戶交互的靈活性;業務邏輯層采用Spring框架,完成應用系統的業務邏輯與事務處理等功能;數據持久層采用對象/關系映射工具Hibernate框架,完成與數據庫進行數據交互的功能。ASSH框架中的整合包括:
①Struts框架與Spring框架的整合。
②Spring框架與Hibernate框架的整合。
③Ajax技術在表現層的應用。
2.2.1Struts框架與Spring框架的整合
雖然Spring框架本身提供了一套極其優秀的MVC框架,但這套框架的設計過于追求完美,采用了大量的映射策略,如請求到控制器之間的控制器解析策略,邏輯視圖和實際視圖之間的視圖解析策略等;還有過于細化的角色劃分,使得MVC層的開發相當煩瑣。這對于實際應用的開發往往弊大于利,而且Spring MVC的開發群體不夠活躍,也存在風險。
而采用Struts框架將不存在這些風險,它擁有極其穩定的表現,經過長時間的檢驗,有大量成功的應用可以參考。
將StrutsMVC與SPring框架整合有三種方法:
(1)使用Spring的ActionSupport類整合Struts;
(2)使用Spring的DelegatingRequestProeessor覆蓋Struts的RequestProeessor;
(3)將StrutSAction管理委托給Spring框架。
1.使用Spring的ActionSupport類整合Structs
手動創建一個Spring環境是一種整合Struts和Spring的最直觀的方式。為了使它變得更簡單,Spring提供了一些幫助。為了方便地獲得Spring環境,org.sprinsframework.web.struts.ActionSupport類提供了一個getWebApplicationContextO方法。我們所做的只是從Spring的ActionSupport而不是StrutsAction類擴展我們所需要的動作,如下面代碼所示:

在①處,通過從Spring的ActionSupport類而不是Struts的Action類進行擴展,創建了一個新的Action。在②處,使用getWebAppliationContext()方法獲得一個ApplicationContext。為了獲得業務服務,使用在②處獲得的環境在③處查找一個Spring bean。
2.通過Spring的DelegatingRequestProeessor進行整合
將Spring從Struts動作中分離是一個更巧妙的設計選擇。分離的一種方法是使用org.springframework.web.struts.DelegatingRequestProeessor類來覆蓋Struts的RequestProcessor處理程序,在struts-config.xml文件中添加<controller>標記,用DelegatingRequestProcessor覆蓋默認的StrutsRequestProeessor。具體代碼如下:
<controller proeessorClass = "org.springframework.web.struts.DelegatingRequestPoeessor" />
同時在Spring的配置文件applieationContext.xml中注冊一個bean,以匹配Struts-config中的動作映射名稱。具體代碼如下:

TestSubmit動作揭示了一個JavaBean屬性,允許Spring在運行時利用DelegatingRequestProeessor自動地配置屬性。這種設計使Struts動作并不知道它正被Spring管理,并且使能夠利用Sping的動作管理框架的所有優點。由于Struts動作注意不到Spring的存在,所以不需要重寫Struts代碼就可以使用其他控制反轉容器來替換掉Spring。
3.通過StrutsAction的管理委托進行整合
首先在struts-config.xml文件中注冊Spring插件如下所示:
<plug-in className = "org.springframework.web.struts.ContextLoaderPlugIn" />
<set-property property = "contextConfigLoeation" value = "WEB-INF/applicationContext.xml" />
</plug-in>
其次將所有action標簽中type屬性設為org.springframework.web.struts.DelegatingActionProxy,也就是將action委托給了Spring。因而在Spring配置文件applicationContext.xml
中配置一個于action標簽path屬性對應的bean(也就是bean的name值等于action的path值),如:
struts-config.xml的代碼片段

applicationContext.xml的代碼片段

三種整合方法的對比:
使用Spring的ActionSupport來整合Struts簡單而快捷。但是,它將Struts動作與Spring框架耦合在一起,如果想替換掉Spring的話,就必須重寫代碼。并且,由于Struts動作不在Spring的控制之下,所以它不能獲得Spring AOP的優勢。當使用多重獨立的Spring環境時,這種技術可能有用,但是在大多數情況下,這種方法不如另外兩種方法合適
第二種方法通過委托RequestProcessor巧妙地解開代碼的耦合,彌補了第一種方法的不足,但是仍然存在一些問題,例如要使用一個不同的RequestProeessor,則需要手動整合Spring的DelegatingRequestProcessor。添加的代碼會為后期維護帶來麻煩并且會降低應用程序的靈活性。
通過StrutsAction的管理委托進行整合是這三種方法中最好的。將StrutsAction委托給Spring框架可以使代碼解耦,從而使可以在Struts應用程序中利用Spring的特性。并且一旦讓Spring控制StrutsAction,就可以使用Spring給Action補充更強的活力。例如,沒有Spring的話,所有的StrutsAction都必須是線程安全的。如果設置<bean>標一記的Singleton屬性為“false”,那么不管用何種方法,應用程序都將在每一個請求上有一個新生成的動作對象。在本文所設計的ASSH框架中Spring和Struts的整合
使用的是第三種方法。
2.2.2 Spring框架與Hibernate框架的整合
Spring作為一個開放的框架在數據庫訪問層上和主流的ORM軟件集成就是其重要組成部分。Hibernate最重要的配置文件是hibernate.cfg.xml。在這個配置文件中,可以定義需要進行持久化的類以及相關的一些全局屬性。而Spring通過LocalSessionFactoryBean這個類對Hibernate進行封裝和接口轉換,這樣可以使用統一的方式來處理Spring和Hibernate,同時提供一個全局的SessionFactory。并且Spring還提供了很多IOC特性的支持,方便地處理大部分典型的Hibernate整合問題,如SessionFactory的注入、HibernateTemplate的簡化操作及DAO支持等。
一旦Hibernate處于Spring的管理下,Hibernate所需要的基礎資源,都由Spring提供注入。Hibernate創建SessionFactory必需的Datasource,執行持久化必需的Session及持久層訪問必需的事務控制等,這些原本必須通過代碼控制的邏輯,都將由Spring接管Datasource,SessionFactory,TransactionManager等,都將作為Spring容器中的bean。Spring通過
applicationContext.xml文件管理SessionFactory,無須采用單獨Hibernate應用所必需的hibernate.cfg.xml文件。
Spring通過applicationContext.xml文件配置管理SessionFactory與數據庫的連接。在實際的J2EE應用中,數據源采用依賴注入的方式,將SessionFactory傳給Hibernate。具體applicationContext.xml的配置如下所示:





SessionFactory由applicationContext.xml管理,并隨著應用程序啟動時自動加載,可以被處于applicationContext.xml管理下的任意一個bean引用,比如DAO。Hibernate的數據庫訪問需要在Session管理下,而SessionFactory是Session的工廠。Spring采用依賴注入的方式為DAO對象注入SessionFactory的引用。
Spring還提供了HibernateTemplate用于持久層訪問,該模板類無須顯示打開Session及關閉Session。它只要獲得SessionFactory的引用,就可以自動打開Session,并在持久化訪問結束后關閉Session,程序開發只需完成持久層邏輯,通用的操作則由HibernateTemplate完成。例如,要把某條數據存入的數據庫中只需寫如下代碼即可,而不必關心Session的打開和關閉:getHibernateTemplate().save(object)。
通過Spring整合Hibernate,使持久層的訪問更加容易,使用Spring管理Hibernate持久層有如下優勢:
①通用的資源管理:spring使用applicationContext.xml管理SessionFactory,使得配置值很容易被管理和修改,無須使用Hibernate的配置文件。
②有效的Session管理:Spring提供了有效、簡單和安全的Hibernate Session處理。
③IOC容器提高了DAO組件與業務邏輯層之間的解耦。
④DAO模式的使用,降低了系統重構的代價。
⑤方便的事務管理:Hibernate的事務管理處理會限制Hibernate的表現,而Spring的聲明式事務管理力度是方法級。
⑥異常包裝:Spring能夠包裝Hibernate異常,把它們從cheeked exeeption變為runtimeException;開發者可選擇在恰當的層處理數據中不可恢復的異常,從而避免
煩瑣的Catch/throw及異常聲明。
2.2.3 Ajax技術在表現層的應用
Ajax技術在框架中的應用使得整個系統與用戶交互的靈活性增加,界面設計更加人性化,下面以“基礎信息管理”模塊中為大項目添加小項目為例來介紹Ajax技術在系統中的應用。
1.編寫JavaScript事件處理的js文件
2.為頁面的目標控件中添加事件觸發屬性
3.在頁面中添加事件響應函數SendRequest()
4.編寫后臺業務邏輯處理程序
5.在頁面中添加響應處理函數callBackRequest(xmlHttpRequest)
2.3ASSH框架與其他解決方案的比較
本文設計的ASSH框架是由Struts、Spring、Hibernate以及Ajax技術整合而成的。其中以Struts負責表現層,以Spring負責業務邏輯層,以Hibernate負責數據持久層,在表現層加入Ajax技術對頁面進行優化。
在表現層,目前比較好的軟件框架有Struts、webworks、Spring MVC、TaPestry、JSF等。相對于其他框架Struts的優勢主要體現在以下幾點:
①以HTTP為中心:Struts設計圍繞標準HTTP請求一響應模式,為許多Web開發人員所熟悉。
②強大的標簽庫:利用Struts提供的taglib可以大大節約開發時間,簡化構造和開發應用程序的過程。
③可擴展性:所有默認的設置都可以配置。核心Struts類可以被重寫和子類化。開發人員可以定制關鍵類如ActionForm和Action。
④邏輯名稱的特性能夠將視圖層與模型層隔離開,使得任何一方的改變不會影響到另一方,使系統禍合性降低。
⑤表單驗證解決了請求數據的驗證問題,增強了系統健壯性。
⑥頁面導航使系統的業務流程脈絡清晰,系統各部分之間的聯系可以通過配置文件反映出來,從而簡化了系統后期的維護工作。
⑦框架己經非常成熟,有著眾多的開發群體,使產品有穩定的發展保障。
在傳統的J2EE Web應用開發中,通常使用EJB技術實現系統的業務邏輯處理,而且業務邏輯處理常常與表現層混雜在一起,為系統的后期維護與擴展帶來了難以估計的困難。本文按照J2EE三層結構將業務邏輯層獨立出來,用Spring框架來實現,與EJB相比,Spring在提供服務時具有更大的靈活性,例如:對于不同的應用程序,你可能希望選擇不同的企業級服務。譬如說,如果使用EJB,事務管理就必須使用JTA,哪怕你只使用一個數據庫也是如此;而如果使用AOP,你在這種情況下就可以選擇JDBC事務管理器,后者的性能開銷比JTA要低得多。Spring框架允許以這種可接插的方式獲得企業級服務,從而使你可以按需選擇企業級服務。基于AOP的方案可以將企業級服務(以及所有的聲明性服務)提供給POJO。這與輕量級容器提供的無侵入性是一致的,AOP方案的可測試性也高于EJB編程模型。
并且Spring框架還具有以下優勢:
①促使我們面向接口編程,遵循好的OO習慣,這給我們帶來了可接插能力和可測試性。
②讓我們可以用統一的方式管理應用程序的全部配置信息。
③基于標準的JeanBean基礎構架。應用對象通常以JeanBean的形式實現,通過JeanBean屬性就可以配置簡單參數和協作對象的依賴關系。
④消除難于測試的Singletion模式,并且不再需要在應用代碼中進行資源查找(這通常涉及難于在測試環境下模擬的API,例如JNDI),從而改善可測試性。
⑤Spring提供了數據持久框架,可以采用JDBC,或者類似Hibernate的O/R mapping產品實現數據存取。
在數據持久層的主流解決方案除了Hibernate框架外,還有JDBC、EJB、JDO。
JDBC是低級別的數據庫訪問方式,JDBC并不支持面向對象的數據庫表示。JDBC數據庫表示完全圍繞關系數據庫模型。在大型應用程序的DAO中書寫這樣的代碼,維護量是非常大的。
EJB定義了兩種持久化的解決方案:一種是BMP,另一種是CMP。其中CMP不需要將SQL語句加入到代碼中。目前,在采用J2EE的應用中,EJB CMP方式得到了廣泛應用。但是,CMP的使用比較復雜,對很多開發人員來說比較難以掌握。而且,不是在所有的情況下都適合在系統中采用EJB,而且想要非常清楚的了解EJB規范也是非常費時的。在用EJB編碼前,先要讓專家理解API,然后需要了解每一個容器部署時所要關注的技術。
JDO是一個存儲Java對象的規范,JDO規范1.0的提出可以使你將精力集中在設計Java對象模型,然后在企業應用軟件架構的不同層面中存儲傳統的Java對象(Plain Old Java Objects,簡稱POJOs),采用JDOQL語言進行SQL操作。一些公司(包括Sun)企圖根據JDO規范進行設計并實現JDO產品,然而他們都不能很好的進行實現,并且性能優化上比較差。
Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行了輕量級的對象封裝,使Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。它不僅提供了從Java類到數據表之間的映射,也提供了數據查詢和恢復機制。相對于使用JDBC和SQL來手工操作數據庫,Hibernate可以大大減少操作數據庫的工作量。另外Hibernate可以利用代理模式來簡化載入類的過程,這將大大減少利用Hibernate QL從數據庫提取數據的代碼的編寫量,從而節約開發時間和開發成本Hibernate可以和多種Web服務器或者應用服務器良好集成,如今已經支持幾乎所有的流行的數據庫服務器。
在傳統Web應用系統中,存在用戶為了調用某項功能而在大量的頁面間跳轉的問題。雖然說這并不是一個很大的問題,而且用戶所需要的功能都已經實現,但是頻繁的頁面跳轉,甚至有些是重復的跳轉充斥在用戶的操作過程中,容易使用戶產生厭煩感,從而對軟件的認可度降低。俗話說“細節決定成敗”,也許正因為這樣一個微不足道的細節成為用戶放棄我們所開發的系統的原因。
Ajax技術的使用可以使Web系統在不刷新整個頁面的前提下維護數據。這使得Web應用程序更為迅捷地響應用戶交互,并避免了在網絡上發送那些沒有改變的信息,提高了系統的可操作性。
本文出自 張賓
基于ASSH框架的J2EE WEB應用與實現
posted on 2009-05-07 17:48
特立獨行 閱讀(761)
評論(0) 編輯 收藏 所屬分類:
J2EE核心技術