一、前言
最近有個小面試需要複習以前用到的SSH框架,忘得差不多了當然當時也差不多就是不會的狀態,現在花了三四天的時間進行一個簡單的學習,總結一些概念性的東西放在這兒。
二、參考鏈接
ssh框架:https://baike.baidu.com/item/ssh%E6%A1%86%E6%9E%B6/8882453?fr=aladdin
SSH三大框架的概述:https://blog.csdn.net/ycclydy/article/details/80451571
SSH 框架簡介:https://www.jb51.net/article/123403.htm
淺談Java三大框架SSH是否已經過時 :https://www.sohu.com/a/226103987_99948066
新手學習SSH三大框架的幾點建議:https://baijiahao.baidu.com/s?id=1593174345369404841&wfr=spider&for=pc
SSH三大框架理解:https://blog.csdn.net/qq_28143647/article/details/79459004
三、基礎概念
3.1 背景
傳統的Java Web應用程序是採用JSP+Servlet+Javabean來實現的,實現了最基本的MVC分層,使的程序結構分爲幾層,其中JSP負責前臺展示 、Servlet負責流程邏輯控制、Javabean負責數據封裝。但這種結構存在問題:如JSP頁面中需要使用符號嵌入很多的Java代碼,造成頁面結構混亂;Servlet和Javabean負責了大量的跳轉和運算工作,耦合緊密,程序複用度低等等。
MVC:Web應用開發常用的一種開發模式,其中視圖層通過提取用戶的輸入信息,提交到控制器之後,控制器根據某種選擇來決定這個請求交由給模型層來處理,模型層根據業務邏輯的代碼處理用戶請求並返回數據,並最終用視圖層展示給用戶。
後對數據庫操作進行封裝出現Hibernate,對業務跳轉進行封裝出現Struts,結合Spring框架,出現SSH框架。
Struts、Spring、Hibernate(或SpringMVC、Spring、Hibernate)Struts進行流程控制、Spring進行業務流轉、Hibernate進行數據庫操作的比較
3.2 Struts
Struts是一個基於MVC模式的應用框架(和Servlet本質差不多),主要作爲控制器來建立模型和視圖的數據交互(控制邏輯判斷加頁面跳轉),目前主要使用Struts2,通過攔截器處理客戶的各種請求。
技術基於MVC框架,實現依賴Servlet和JSP實現;EJB和JavaBean兩個組件是其框架業務功能實現的基礎部件;Action和ActionServlet是實現控制功能的重要部件;視圖部分是由若干個存在內在聯繫的JSP文件有機構成來實現系統功能
EJB:有3種類型:Session, Entity和Message-driven,運行一般需要EJB容器(即應用服務器,如JBoss/Weblogic/Websphere等 ,在J2EE中包括會話Bean(Session Bean),實體Bean(Entity Bean)和消息驅動Bean(MessageDriven Bean)
JavaBean:實體類,在大部分情況下和POJO是同義詞,基本構成就是一些字段和與之對應的setter、getter方法,如果一個JavaBean需要在不同的JVM的進程中進行傳遞,還需要實現Serializable接口(JavaBean是一個組件,而EJB就是一個組建框架 )
J2EE:Java 2 Platform Enterprise Edition,企業級分佈式應用程序開發規範,是市場上主流的企業級分佈式應用平臺的解決方案
Struts的工作流程:
客戶端發送請求(HttpServletRequest)到服務器,服務器接收到請求就先進入web.xml配置文件看看有沒有配置過濾器,發現有struts2的過濾器,然後就找到struts.xml配置文件,struts.xml配置文件裏有定義一個action,然後就去找到類名叫XXXAction這個類(此action類必須是繼承ActionSupport接口),並且實現了execute()方法,返回一個字符串爲"success"給struts.xml配置文件,struts.xml配置文件的action會默認調用XXXAction類的execute()方法,result接收到了返回的字符串,然後查找結果字符串對應的(Result),result就會調用你指定的jsp頁面將結果呈現,最後響應回給客戶端。
Struts的優點:
-
開源框架,結構清晰
-
MVC的經典實現
-
處理異常機制
-
標籤庫強大
-
解決JSP頁面存在大量Java代碼,維護方便
-
在formBean中提交,不會使用傳統的get、set方法得值、取值
Struts的缺點:
-
配置複雜
-
測試不方便
-
依賴Web容器
-
action爲單例模式(貌似也可以配成多例模式,通過加註釋@scope("prototype"))
3.3 Spring
Spring使用基本的JavaBean完成以前只能EJB完成的事情,主要控制翻轉IOC和麪向切面AOP,是一種分層的輕量級開源框架,更像是一個容器,將所有配置的Struts和Hibernate中的東西都放置進來,只要做好配置即可找到相應位置並進行處理。
IOC:Inversion of Control,輕量級的反向控制。基本思想:通過外部的配置文件反過來調用應用程序來替代原有程序調用的控制功能
在框架中進行控制功能的創建工作就實現了輕量級控制反轉,這樣就能使控制功能的編寫從應用程序的編寫中分離出來。在使用組件調用容器時,在框架中的控制功能創建中只需要給出調用組件所用到的對象。(SSH中Spring主要使用這種方式,通過action的調用反向調用service)
工作過程:首先創建程序中以後所用到的所有對象,並進行對象屬性設置,對相關的屬性和慣性進行連接配置,最後再確定調用的方法和時間點即可。
AOP:日誌記錄,性能統計,安全控制,事務處理、異常處理等。針對業務處理過程中的切面進行提取,它所面對的是處理過程中的某個步驟或階段,以獲得邏輯過程中各部分之間低耦合性的隔離效果
3.4 Hibernate
Hibernate是開源代碼的對象映射框架,根據JDBC技術基礎衍生而來,將直接操作原來的數據庫變爲直接操作數據表後生成的Java類,實現對象編程思維來操縱數據庫。 即實現數據庫表及屬性與POJO的相互映射。
通過hibernate.cfg.xml文件來取代以往的JDBC連接數據庫的一大串代碼,通過XXX(實體Bean的類名).hbm.xml文件來與數據庫的具體表進行映射。
POJO:Plain Ordinary Java Object,即簡單的Java對象
ORM:Object Relational Mapping,對象關係映射
Hibernate的核心接口:
-
SessionFactory
配置對象被用於創造一個SessionFactory對象,使用提供的配置文件爲應用程序依次配置Hibernate,並允許實例化一個會話對象。SessionFactory是一個線程安全對象並由應用程序所有的線程所使用。
SessionFactory是一個重量級對象所以通常它都是在應用程序啓動時創造然後留存爲以後使用。每個數據庫需要一個SessionFactory對象使用一個單獨的配置文件。所以如果你使用多種數據庫那麼你要創造多種SessionFactory對象。
-
Session
一個會話被用於與數據庫的物理連接。Session對象是輕量級的,並被設計爲每次實例化都需要與數據庫的交互。持久對象通過 Session 對象保存和檢索。
Session 對象不應該長時間保持開啓狀態因爲它們通常情況下並非線程安全,並且它們應該按照所需創造和銷燬
一般可通過sessionFactory.getCurrentSession()方法獲得
-
Transaction
事務對象指定工作的原子單位,它是一個可選項.org.hibernate.Transaction接口提供事務管理的方法。
-
Query
Query對象使用SQL或者Hibernate查詢語言(HQL)字符串在數據庫中來檢索數據並創造對象。一個查詢的實例被用於連結查詢參數,限制由查詢返回的結果數量,並最終執行查詢。
-
Configuration
在任何Hibernate應用程序中創造的第一個Hibernate對象,並且經常只在應用程序初始化期間創造。它代表了Hibernate所需一個配置或屬性文件,配置對象提供了兩種基礎組件。
數據庫連接:由Hibernate支持的一個或多個配置文件處理。這些文件是hibernate.properties和hibernate.cfg.xml。
Hibernate的工作原理:
-
Configuration.config() 來讀取XXXbean.hbm.xml配置文件
-
Configuration.config()來讀取配置文件裏面的映射信息
-
創建sessionFactory
-
打開Session
-
開啓事務transaction
-
持久化到數據庫
-
關閉session
-
關閉sessionFactory
3.5 SSH
SSH框架中,Struts對應着前臺的控制層,而Spring則負責實體bean的業務邏輯處理,至於Hibernate則是負責數據庫的交接以及使用Dao接口來完成操作
SSH從系統職能上可分三層:
-
表示層
主要涉及Struts的功能,在這一層,首先通過JSP頁面實現交互界面,負責傳送用戶請求和接收響應,然後Struts根據配置文件將接收到的用戶請求委派給相應的Action處理。
-
業務邏輯層
主要涉及Spring的功能,在這一層,管理服務組件負責向Struts配置好的對應Action提供業務模型(Service類和Dao類),該組件的對象數據處理組件完成業務邏輯,並提供事務處理等容器組件以提升系統性能和保證數據的完整性。
-
數據持久層
主要涉及Hibernate的功能,實現了數據持久化功能,使得程序員可以通過面向對象的編程思維來操作數據庫。在這一層中,依賴於Hibernate的對象化映射和數據庫交互,處理Spring中的DAO組件請求的數據,並返回處理結果。
SSH的優點:
實現了視圖、控制器與模型的徹底分離,而且還實現了業務邏輯層與數據持久層的分離。這樣無論前端如何變化,邏輯層只需很少的改動,並且數據庫的變化也不會對前端有所影響,大大提高了系統的可複用性,提高了開發效率。
四、總結
目前主流的Java Web開發框架就是SSH(Struts2、Spring、Hibernate)和SSM(Spring、SpringMVC、MyBatis),SSH雖然能實現M、V、C三層的完全分離,最大程度的對每個模塊進行封裝,但是每一個框架都需要很多繁瑣的配置(web.xml、application.properties、struts.xml、hibernate.cfg.xml、spring-XXX.xml以及項目本身的需要添加多個依賴的pom.xml[如果使用的是Maven項目/Spring項目]),學習難度較大。同時又有相同封裝高效率性能的SSM面世,相對SSH來講,SSM的配置要少很多,對開發者較爲友好,後續會進行繼續學習。
基本確定以後的職業發展路線是大數據數據存儲+後端開發,而對於後端開發來講,在努力學習去熟練掌握一門編程語言類似Java之外,還需要了解流行的集中常用的開發框架,畢竟學的東西都是要實踐的嘛(配置也算一種磨鍊吧:) )