struts、spring、hibernate、ajax、JQuery原理講解

struts原理
struts2並不是一個陌生的web框架,它是以Webwork的設計思想爲核心,吸收struts1的優點,可以說
struts2是struts1和Webwork結合的產物。
struts2 的工作原理圖:
一個請求在Struts2框架中的處理分爲以下幾個步驟:
1.客戶端發出一個指向servlet容器的請求(tomcat);
2.這個請求會經過圖中的幾個過濾器,最後會到達FilterDispatcher過濾器。
3.過濾器FilterDispatcher是struts2框架的心臟,在處理用戶請求時,它和請求一起相互配合訪問struts2
的底層框架結構。在web容器啓動時,struts2框架會自動加載配置文件裏相關參數,並轉換成相應的類。
如:ConfigurationManager、ActionMapper和ObjectFactory。ConfigurationManager 存有配置文件的一
些基本信息,ActionMapper存有action的配置信息。在請求過程中所有的對象(Action,Results,
Interceptors,等)都是通過ObjectFactory來創建的。過濾器會通過詢問ActionMapper類來查找請求中
需要用到的Action。
4.如果找到需要調用的Action,過濾器會把請求的處理交給ActionProxy。ActionProxy爲Action的代理對象
。ActionProxy通過ConfigurationManager詢問框架的配置文件,找到需要調用的Action類。
5.ActionProxy創建一個ActionInvocation的實例。ActionInvocation在ActionProxy層之下,它表示了
Action的執行狀態,或者說它控制的Action的執行步驟。它持有Action實例和所有的Interceptor。
6.ActionInvocation實例使用命名模式來調用,1. ActionInvocation初始化時,根據配置,加載Action相
關的所有Interceptor。2. 通過ActionInvocation.invoke方法調用Action實現時,執行Interceptor。在
調用Action的過程前後,涉及到相關攔截器(intercepetor)的調用。
7. 一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果通常是(但不總是,也可能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。在表
示的過程中可以使用Struts2 框架中繼承的標籤。

Struts1與struts2的優缺點
類:? Struts1要求Action類繼承一個抽象基類。Struts1的一個普遍問題是使用抽象類編程而不是接口。? Struts 2 Action類可以實現一個Action接口,也可實現其他接口,使可選和定製的服務成爲可能。Struts2提供一個ActionSupport基類去實現常用的接口。Action接口不是必須的,任何有execute標識的POJO對象都可以用作Struts2的Action對象。線程模式:? Struts1 Action是單例模式並且必須是線程安全的,因爲僅有Action的一個實例來處理所有的請求。單例策略限制了Struts1 Action能作的事,並且要在開發時特別小心。Action資源必須是線程安全的或同步的。? Struts2 Action對象爲每一個請求產生一個實例,因此沒有線程安全問題。(實際上,servlet容器給每個請求產生許多可丟棄的對象,並且不會導致性能和垃圾回收問題)Servlet 依賴:? Struts1 Action 依賴於Servlet API ,因爲當一個Action被調用時HttpServletRequest 和 HttpServletResponse 被傳遞給execute方法。? Struts 2 Action不依賴於容器,允許Action脫離容器單獨被測試。如果需要,Struts2 Action仍然可以訪問初始的request和response。但是,其他的元素減少或者消除了直接訪問HttpServetRequest 和 HttpServletResponse的必要性。可測性:? 測試Struts1 Action的一個主要問題是execute方法暴露了servlet API(這使得測試要依賴於容器)。一個第三方擴展--Struts TestCase--提供了一套Struts1的模擬對象(來進行測試)。? Struts 2 Action可以通過初始化、設置屬性、調用方法來測試,“依賴注入”支持也使測試更容易。捕獲輸入:? Struts1 使用ActionForm對象捕獲輸入。所有的ActionForm必須繼承一個基類。因爲其他JavaBean不能用作ActionForm,開發者經常創建多餘的類捕獲輸入。動態Bean(DynaBeans)可以作爲創建傳統ActionForm的選擇,但是,開發者可能是在重新描述(創建)已經存在的JavaBean(仍然會導致有冗餘的javabean)。? Struts 2直接使用Action屬性作爲輸入屬性,消除了對第二個輸入對象的需求。輸入屬性可能是有自己(子)屬性的rich對象類型。Action屬性能夠通過 web頁面上的taglibs訪問。Struts2也支持ActionForm模式。rich對象類型,包括業務對象,能夠用作輸入/輸出對象。這種 ModelDriven 特性簡化了taglib對POJO輸入對象的引用。表達式語言:? Struts1 整合了JSTL,因此使用JSTL EL。這種EL有基本對象圖遍歷,但是對集合和索引屬性的支持很弱。? Struts2可以使用JSTL,但是也支持一個更強大和靈活的表達式語言--"Object Graph Notation Language" (OGNL). 綁定值到頁面(view):? Struts 1使用標準JSP機制把對象綁定到頁面中來訪問。 ? Struts 2 使用 "ValueStack"技術,使taglib能夠訪問值而不需要把你的頁面(view)和對象綁定起來。ValueStack策略允許通過一系列名稱相同但類型不同的屬性重用頁面(view)。類型轉換:? Struts 1 ActionForm 屬性通常都是String類型。Struts1使用Commons-Beanutils進行類型轉換。每個類一個轉換器,對每一個實例來說是不可配置的。? Struts2 使用OGNL進行類型轉換。提供基本和常用對象的轉換器。校驗:? Struts 1支持在ActionForm的validate方法中手動校驗,或者通過Commons Validator的擴展來校驗。同一個類可以有不同的校驗內容,但不能校驗子對象。? Struts2支持通過validate方法和XWork校驗框架來進行校驗。XWork校驗框架使用爲屬性類類型定義的校驗和內容校驗,來支持chain校驗子屬性Action執行的控制:? Struts1支持每一個模塊有單獨的Request Processors(生命週期),但是模塊中的所有Action必須共享相同的生命週期。? Struts2支持通過攔截器堆棧(Interceptor Stacks)爲每一個Action創建不同的生命週期。堆棧能夠根據需要和不同的Action一起使用。

Spring
Spring是一個輕量級框架,也是一個全方位的整合框架,對ibatis、hibernate、toplink以及struts等提供了整合服務。Spring包括有容器、IOC、AOP以及一個MVC框架。
IOC 直觀地講,就是容器控制程序之間的關係,而非傳統實現中,由程序代碼直接操控。這也就是所謂“控制反轉”的概念所在。控制權由應用代碼中轉到了外部容器,控制權的轉移是所謂反轉,也就是說由容器在運行期將組件間的某種依賴關係動態注入到組件中。
原理:IOC的實現方式就是採用工廠模式來實現的,通過配置文件來配置所有的類以及要給類注入什麼對象,然後再通過XMLBeanFactory這個工廠類來解析這個配置文件,根據調用者傳過來的參數,獲取不同的對象實例,並且根據配置注入關係對象,從而提高系統的靈活新和移植性。

AOP是Aspect Oriented Programming的縮寫,意思是面向方面編程,AOP實際是GoF設計模式的延續,設計模式孜孜不倦追求的是調用者和被調用者之間的解耦,AOP可以說也是這種目標的一種實現。它可以解決OOP和過程化方法不能夠很好解決的橫切(crosscut)問題。如:事務、安全、日誌等橫切關注。當未來系統變得越來越複雜橫切關注點就成爲一個大問題的時候,AOP就可以很輕鬆的解決橫切關注點這個問題。
AOP的實現主要是通過方法的攔截實現.在不使用AOP框架的情況下,我們可以通過JDK提供的動態代理來實現方法的攔截
MVC
Spring 框架提供了構建 Web 應用程序的全功能 MVC 模塊。使用 Spring 可插入的 MVC 架構,可以選擇是使用內置的 Spring Web 框架還是 Struts 這樣的 Web 框架。通過策略接口,Spring 框架是高度可配置的,而且包含多種視圖技術,例如 JavaServer Pages(JSP)技術、Velocity、Tiles、iText 和 POI。Spring MVC 框架並不知道使用的視圖,所以不會強迫您只使用 JSP 技術。Spring MVC 分離了控制器、模型對象、分派器以及處理程序對象的角色,這種分離讓它們更容易進行定製。
優點:易於同其它View框架(Titles等)無縫集成,採用IOC便於測試。  它是一個典型的教科書式的mvc構架,而不像struts等都是變種或者不是完全基於mvc系統的框架,對於初學者或者想了解mvc的人來說我覺得 spring是最好的,它的實現就是教科書!第二它和tapestry一樣是一個純正的servlet系統,這也是它和tapestry相比 struts所沒有的優勢。而且框架本身有代碼,而且看起來也不費勁比較簡單可以理解
Hibernate
Hibernate是一個開放源代碼的對象關係映射(OR-mapping)框架,它對JDBC進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。 Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate可以在應用EJB的J2EE架構中取代CMP,完成數據持久化的重任。
優點:
a. Hibernate 使用 Java 反射機制 而不是字節碼增強程序來實現透明性。
b.Hibernate 的性能非常好,因爲它是個輕量級框架。 映射的靈活性很出色。
c. 它支持各種關係數據庫,從一對一到多對多的各種複雜關係。

缺點:
它限制您所使用的對象模型。(例如,一個持久性類不能映射到多個表)
Hibernate的核心接口一共有6個,分別爲:Session、SessionFactory、Transaction、Query、Criteria和Configuration。這6個核心接口在任何開發中都會用到。通過這些接口,不僅可以對持久化對象進行存取,還能夠進行事務控制。
Hibernate 中提供了兩級Cache,第一級別的緩存是Session級別的緩存,它是屬於事務範圍的緩存。這一級別的緩存由hibernate管理的,一般情況下無需進行干預;第二級別的緩存是SessionFactory級別的緩存,它是屬於進程範圍或羣集範圍的緩存。這一級別的緩存可以進行配置和更改,並且可以動態加載和卸載。 Hibernate還爲查詢結果提供了一個查詢緩存,它依賴於第二級緩存。
一級緩存的管理
當應用程序調用Session的save()、update()、saveOrUpdate()、get()或load(),以及調用查詢接口的 list()、iterate()或filter()方法時,如果在Session緩存中還不存在相應的對象,Hibernate就會把該對象加入到第一級緩存中。當清理緩存時,Hibernate會根據緩存中對象的狀態變化來同步更新數據庫。 Session爲應用程序提供了兩個管理緩存的方法: evict(Object obj):從緩存中清除參數指定的持久化對象。 clear():清空緩存中所有持久化對象
二級緩存
E1、Hibernate的二級緩存策略的一般過程如下:   
條件查詢的時候,總是發出一條select * from table_name where …. (選擇所有字段)這樣的SQL語句查詢數據庫,一次獲得所有的數據對象。   
把獲得的所有數據對象根據ID放入到第二級緩存中。   
當Hibernate根據ID訪問數據對象的時候,首先從Session一級緩存中查;查不到,如果配置了二級緩存,那麼從二級緩存中查;查不到,再查詢數據庫,把結果按照ID放入到緩存。  
刪除、更新、增加數據的時候,同時更新緩存。  Hibernate的二級緩存策略,是針對於ID查詢的緩存策略,對於條件查詢則毫無作用。爲此,Hibernate提供了針對條件查詢的Query Cache。   
E2. 什麼樣的數據適合存放到第二級緩存中?
1 很少被修改的數據
2 不是很重要的數據,允許出現偶爾併發的數據
3 不會被併發訪問的數據
4 參考數據,指的是供應用參考的常量數據,它的實例數目有限,它的實例會被許多其他類的實例引用,實例極少或者從來不會被修改。  
E3. 不適合存放到第二級緩存的數據?
1 經常被修改的數據
2 財務數據,絕對不允許出現併發
3 與其他應用共享的數據。   
E4. 常用的緩存插件 Hibernate 的二級緩存是一個插件,下面是幾種常用的緩存插件:   l EhCache:可作爲進程範圍的緩存,存放數據的物理介質可以是內存或硬盤,對Hibernate的查詢緩存提供了支持。   
l OSCache:可作爲進程範圍的緩存,存放數據的物理介質可以是內存或硬盤,提供了豐富的緩存數據過期策略,對Hibernate的查詢緩存提供了支持。  
l SwarmCache:可作爲羣集範圍內的緩存,但不支持Hibernate的查詢緩存。   l JBossCache:可作爲羣集範圍內的緩存,支持事務型併發訪問策略,對Hibernate的查詢緩存提供了支持。   
上述4種緩存插件的對比情況列於表中。  
緩 存 插 件 支 持 只 讀 支持非嚴格讀寫 支 持 讀 寫 支 持 事 務
EhCache 是 是 是
OSCache 是 是 是
SwarmCache 是 是
JBossCache 是 是

Ajax
1)、AJAX 指異步 JavaScript 及 XML(Asynchronous JavaScript And XML)。
通過 AJAX,您的 JavaScript 可使用 JavaScript 的 XMLHttpRequest 對象來直接與服務器進行通信。通過這個對象,您的 JavaScript 可在不重載頁面的情況與 Web 服務器交換數據。   AJAX 在瀏覽器與 Web 服務器之間使用異步數據傳輸(HTTP 請求),這樣就可使網頁從服務器請求少量的信息,而不是整個頁面。   AJAX 可使因特網應用程序更小、更快,更友好。   AJAX 是一種獨立於 Web 服務器軟件的瀏覽器技術。 AJAX 基於下列 Web 標準:   JavaScript XML HTML CSS 在 AJAX 中使用的 Web 標準已被良好定義,並被所有的主流瀏覽器支持。AJAX 應用程序獨立於瀏覽器和平臺。   Web 應用程序較桌面應用程序有諸多優勢;它們能夠涉及廣大的用戶,它們更易安裝及維護,也更易開發。  不過,因特網應用程序並不像傳統的桌面應用程序那樣完善且友好。  通過 AJAX,因特網應用程序可以變得更完善,更友好
2)、ajax的優點
Ajax的給我們帶來的好處大家基本上都深有體會,在這裏我只簡單的講幾點:
 1、最大的一點是頁面無刷新,在頁面內與服務器通信,給用戶的體驗非常好。
  2、使用異步方式與服務器通信,不需要打斷用戶的操作,具有更加迅速的響應能力。
  3、可以把以前一些服務器負擔的工作轉嫁到客戶端,利用客戶端閒置的能力來處理,減輕服務器和帶寬的負擔,節約空間和寬帶租用成本。並且減輕服務器的負擔,ajax的原則是“按需取數據”,可以最大程度的減少冗餘請求,和響應對服務器造成的負擔。
4、基於標準化的並被廣泛支持的技術,不需要下載插件或者小程序。
3)、ajax的缺點
下面我着重講一講ajax的缺陷,因爲平時我們大多注意的都是ajax給我們所帶來的好處諸如用戶體驗的提升。而對ajax所帶來的缺陷有所忽視。
下面所闡述的ajax的缺陷都是它先天所產生的。
1、ajax幹掉了back按鈕,即對瀏覽器後退機制的破壞。後退按鈕是一個標準的web站點的重要功能,但是它沒法和js進行很好的合作。這是ajax所帶來的一個比較嚴重的問題,因爲用戶往往是希望能夠通過後退來取消前一次操作的。那麼對於這個問題有沒有辦法?答案是肯定的,用過Gmail的知道,Gmail下面採用的ajax技術解決了這個問題,在Gmail下面是可以後退的,但是,它也並不能改變ajax的機制,它只是採用的一個比較笨但是有效的辦法,即用戶單擊後退按鈕訪問歷史記錄時,通過創建或使用一個隱藏的IFRAME來重現頁面上的變更。(例如,當用戶在Google Maps中單擊後退時,它在一個隱藏的IFRAME中進行搜索,然後將搜索結果反映到Ajax元素上,以便將應用程序狀態恢復到當時的狀態。)
但是,雖然說這個問題是可以解決的,但是它所帶來的開發成本是非常高的,和ajax框架所要求的快速開發是相背離的。這是ajax所帶來的一個非常嚴重的問題。
2、安全問題
技術同時也對IT企業帶來了新的安全威脅,ajax技術就如同對企業數據建立了一個直接通道。這使得開發者在不經意間會暴露比以前更多的數據和服務器邏輯。ajax的邏輯可以對客戶端的安全掃描技術隱藏起來,允許黑客從遠端服務器上建立新的攻擊。還有ajax也難以避免一些已知的安全弱點,諸如跨站點腳步攻擊、SQL注入攻擊和基於credentials的安全漏洞等。
3、對搜索引擎的支持比較弱。
4、破壞了程序的異常機制。至少從目前看來,像ajax.dll,ajaxpro.dll這些ajax框架是會破壞程序的異常機制的。關於這個問題,我曾經在開發過程中遇到過,但是查了一下網上幾乎沒有相關的介紹。後來我自己做了一次試驗,分別採用ajax和傳統的form提交的模式來刪除一條數據……給我們的調試帶來了很大的困難。
AAAA?AA
5、另外,像其他方面的一些問題,比如說違背了url和資源定位的初衷。例如,我給你一個url地址,如果採用了ajax技術,也許你在該url地址下面看到的和我在這個url地址下看到的內容是不同的。這個和資源定位的初衷是相背離的。
6、一些手持設備(如手機、PDA等)現在還不能很好的支持ajax,比如說我們在手機的瀏覽器上打開採用ajax技術的網站時,它目前是不支持的,當然,這個問題和我們沒太多關係。

4)、ajax原理和XmlHttpRequest對象

Ajax的原理簡單來說通過XmlHttpRequest對象來向服務器發異步請求,從服務器獲得數據,然後用javascript來操作DOM而更新頁面。這其中最關鍵的一步就是從服務器獲得請求數據。要清楚這個過程和原理,我們必須對 XMLHttpRequest有所瞭解。
XMLHttpRequest是ajax的核心機制,它是在IE5中首先引入的,是一種支持異步請求的技術。簡單的說,也就是javascript可以及時向服務器提出請求和處理響應,而不阻塞用戶。達到無刷新的效果。
所以我們先從XMLHttpRequest講起,來看看它的工作原理。
首先,我們先來看看XMLHttpRequest這個對象的屬性。
它的屬性有:
onreadystatechange 每次狀態改變所觸發事件的事件處理程序。
responseText 從服務器進程返回數據的字符串形式。
responseXML 從服務器進程返回的DOM兼容的文檔數據對象。
status 從服務器返回的數字代碼,比如常見的404(未找到)和200(已就緒)
status Text 伴隨狀態碼的字符串信息
readyState 對象狀態值
0 (未初始化) 對象已建立,但是尚未初始化(尚未調用open方法)
1 (初始化) 對象已建立,尚未調用send方法
2 (發送數據) send方法已調用,但是當前的狀態及http頭未知
3 (數據傳送中) 已接收部分數據,因爲響應及http頭不全,這時通過responseBody和responseText獲取部分數據會出現錯誤,
4 (完成) 數據接收完畢,此時可以通過通過responseXml和responseText獲取完整的迴應數據。
JQuery
Jquery是繼prototype之後又一個優秀的Javascrīpt框架。它是輕量級的js庫(壓縮後只有21k) ,它兼容CSS3,還兼容各種瀏覽器 (IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+)。jQuery使用戶能更方便地處理HTML documents、events、實現動畫效果,並且方便地爲網站提供AJAX交互。jQuery還有一個比較大的優勢是,它的文檔說明很全,而且各種應用也說得很詳細,同時還有許多成熟的插件可供選擇。jQuery能夠使用戶的html頁保持代碼和html內容分離,也就是說,不用再在html裏面插入一堆js來調用命令了,只需定義id即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章