關於SSH框架設計的一些理解

最近在學習企業開發領域很流行的SSH框架(Struts、Hibernate、Spring),由於之前有做過原生的Servlet+JSP的項目,所以在學習過程中我會跟原生開發模式進行對比,在這裏我把自己的一些理解做下小結。

1、Servlet+JSP原生開發

先簡要說一下Java Web原生開發模式,Java Web開發通常是使用Tomcat之類的容器,Tomcat容器實現了一套也可以稱爲框架的東西,就是Servlet。Tomcat運行於Apache之類的Web服務器上,Apache服務器負責處理用戶請求的HTTP協議本身的部分。當用戶請求的HTTP協議部分被Apache服務器處理之後,內容部分就要由Tomcat來處理了。Tomcat歸納了Web請求的共同特性,封裝了一個叫Servlet的東西,開發者基於Servlet,就只需要編寫處理Web請求的具體邏輯部分了,至於HTTP請求字段的解析,響應字段的封裝都交給Servlet了。另外對於Web頁面的拼接生成,是使用JSP腳本,Tomcat容器內置有解析器,可以把JSP文件解析成Servlet來執行。JSP除了包含HTML/CSS/JS內容以外,有一些JSP的標籤語法,用於Servlet向JSP傳遞一些對象,這樣就可以把Servlet處理的結果動態的在JSP頁面中顯示出來,從而實現動態頁面的效果。

2、Struts框架

我們來看下原生開發的的一些不足,這樣才能較好的理解爲什麼會有Struts框架。其實從功能實現角度來說,一般的Web開發用Servlet基本是可以滿足的,但是當項目規模比較大的時候,就會顯得比較凌亂,因爲會定義大量的Servlet,各個Servlet的處理流程會有一些相同的部分,每個Servlet都需要去重複實現。針對這個問題,SSH框架中的Struts基於軟件分層的思想,把Web處理流程中各個部分獨立開來,並且把Servlet相同的處理邏輯放到框架來實現,從而把開發人員從重複中釋放出來,聚焦於具體業務功能實現。Struts採用稱爲MVC的設計模式,把Web應用分爲數據庫訪問(M)、業務邏輯(C)、JSP頁面(C)三個部分。能夠通過XML配置文件的方式,把不同的Action訪問引導到對應的Action類進行處理,並且根據Action類處理的結果,在XML中配置不同的結果調用不同的JSP頁面資源。

Struts還把Web開發中一些常用通用的工作整合進了框架內:

1)國際化資源文件,如果用原生開發模式,JSP中的字符串多語言需要自己實現,在各個JSP文件中引入各自語言的JSP字符串定義文件,如果使用Struts就可以由框架來實現,並通過XML配置。

2)JSP標籤,針對原生JSP的不足,Struts定義了一些標籤,增強了JSP的表達能力。

3)輸入類型轉換,這個工作如果是原生開發通常也是由開發人員自己實現的,使用Struts就可以由框架來幫助完成請求參數到內建對象成員之間相互轉換。

4)輸入校驗,這個工作如果是原生開發通常也是由開發人員自己實現的,使用Struts就可以通過XML定義的方式,由框架來幫助實現。

5)攔截器,由於如果使用Struts,那麼Struts就接管了處理Web請求的整個過程,用戶沒法自由的在處理過程中插入一些必要的邏輯代碼。所以框架提供了攔截器這樣的機制,能夠讓開發者在Web請求處理過程中插入一些需要的處理邏輯,通過在XML定義攔截器的方式來提供。

從上面分析可以看出,相比於原生開發,從功能角度Struts並沒有增強多少,Struts主要的工作就是幫助我們把Web應用進行比較好的分層,同時把一些重複的工作集成到框架來完成,這就是框架的作用。

3、Hibernate框架

不論採用原生開發模式還是Struts框架,我們都需要自己實現Web應用的具體邏輯部分,這其中包括對數據庫的訪問。對於Web應用來說,數據庫訪問所佔的比重是比較多的,特別是近年來流行的比如ArgularJS之類的前端框架,都有把原本在後端實現的業務邏輯放到前端來實現,如果這樣,後端的工作就主要只剩下數據庫訪問和安全相關功能了。如果我們採用原生開發模式,我們需要自己實現對數據庫的CRUD訪問,通常要編寫SQL語句直接訪問數據庫,然後解析SQL訪問的結果,並封裝到Java對象中提供給上層使用。如果後期切換不同數據庫,我們就需要重新編寫SQL處理代碼並適配。

Hibernate框架幫我們封裝了對數據庫的訪問,爲我們提供了另外一種選擇。它通過XML配置的方式,完成數據庫連接,把數據庫表映射到Java對象,並且能夠把表之間的關聯關係也通過XML配置映射到Java對象中,這樣開發人員訪問數據庫時就只需要面對Java對象進行操作,而不用自己去實現原生開發的那些工作了,這樣就能從具體的數據庫操作中解放出來,後期如果切換數據庫通常只用修改XML配置就可以了。這種方式的不足就是增加的了XML的配置。

4、Spring框架

Spring框架實現主要包含兩個核心機制,一個是IOC(依賴注入),另一個是AOP(切面注入),我現在分別來分析。

IOC解決的是對象之間的依賴問題,Java是面嚮對象語言,Web應用會定義大量的對象,對象之間也有相互關聯。在通常的開發模式下,我們需要編程來創建各種Java對象,並且把它們互相關聯起來,這樣做的缺點是對象之間的耦合比較多,後續維護變更時會需要修改代碼。IOC提供了另外一種做法,就是對象和對象之間關係通過XML方式定義,然後Spring框架通過Java反射機制幫我們創建這些對象,並按照定義把對象相互關聯起來,之後就可以提供給業務邏輯使用了。有人會想,自己創建對象和框架創建對象哪種好,這可能各人有各人的看法,對於大型工程來說,Spring關聯對象創建和關聯可能更清晰,但由此帶來的代價就是XML配置的膨脹。所以實際中通常對於大的組件級的對象可以採用IOC注入,對於細小的對象還是自己創建管理,這樣可以取得兩者之間的平衡。

AOP是一個重要思想在Spring框架中的具體實現,就是面向切面編程。這個思想簡單的說,就是對已有程序的某個接口插入一些另外處理邏輯,這是怎樣做到的呢?這依賴於IOC機制,由於使用IOC,對象由框架創建,當AOP在XML中定義了切入點和切面函數後,再定義這些切入點指向的IOC對象,之後框架在創建這些IOC對象時,就會通過Java的動態代理機制,對這些IOC對象生成相應的動態代理,並在定義的切入點把切面函數集成進去。當用戶程序調用這些代理對象切入點的函數時,也會自動調用切面函數,這樣就實現了把切面函數的注入。通過這種機制就能夠把獨立切面函數隨意注入需要切入的IOC對象中去,在實際中的一個典型應用就是爲對象增加事務機制,能夠把事務處理獨立的注入需要事務的對象裏,這樣事務處理就不用與需要事務的對象緊密耦合。除了事務,在Web系統中一些具有橫切性質的服務通常也會使用AOP來實現,比如安全檢查、緩存、對象池管理等。

5、總結

從上面的分析可以看出來,Servlet幫我們封裝了Web請求和響應的通用處理邏輯,而SSH又在Servlet的基礎上又幫我們封裝了一些Web應用系統的通用處理邏輯,軟件就是這樣一層一層的疊加而成,遇到通用的地方就進行抽象封裝。當然封裝的代價是增加了許多XML配置,這也是許多人詬病SSH配置繁複的原因,在實際項目怎樣取捨我想每個人心中都有一杆秤。

(完)

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