前言
當下SpringBoot盛行,咱再聊聊SpringBoot盛行之前的框架組合,當做復習鞏固哈。
在聊之前,得先說說MVC,MVC全名是Model View Controller,是模型(model)--視圖(view)--控制器(controller)的縮寫。M是指業務模型,V是指用戶界面,C則是控制器。
一種軟件設計典范,用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯聚集到一個部件里面,在改進和個性化定制界面及用戶交互的同時,不需要重新編寫業務邏輯。
本人是在學校的時候學過SSH和SSM,並用該框架組合做了幾個私單,算是給大學生活餐加點外快吧,哈哈
一、SSH和SSM的定義:
SSH:指的是Struts2(做前端控制器),Spring(管理各層的組件),Hibernate(負責持久化層)
SSM:指的是SpringMVC(做前端控制器),Spring(管理各層的組件),Mybatis(負責持久化層)
二、SSH和SSM的實現原理:
1、Struts2的原理:
Struts2框架執行過程:
1)、客戶端初始化一個指向Servlet容器(例如tomcat)的請求;
2)、這個請求經過一系列的過濾器(Filter),這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin
3)、接着FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請求是否需要調用某個Action,FilterDispatcher是控制器的核心,就是mvc中c控制層的核心
4)、如果ActionMapper決定需要調用某個Action,FilterDispatcher會把請求的處理交給ActionProxy;
5)、ActionProxy通過Configuration Manager詢問框架的配置文件,找到需要調用的Action類;
6)、ActionProxy創建一個ActionInvocation的實例;
7)、ActionInvocation實例使用命名模式來調用,在調用Action的過程前后,會涉及到相關攔截器(Intercepter) 的調用;
8)、一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果通常是一個需要被表示的JSP或者FreeMarker的模板;
9)、將處理結果返回給客戶端。
2、SpringMVC的原理:
SpringMVC框架執行過程:
1)、客戶端發出一個http請求給web服務器,web服務器對http請求進行解析,如果匹配DispatcherServlet的請求映射路徑(在web.xml中指定),web容器將請求轉交給DispatcherServlet;
2)、DispatcherServlet接收到這個請求之后將根據請求的信息(包括URL、Http方法、請求報文頭和請求參數Cookie等)以及HandlerMapping的配置找到處理請求的處理器(Handler)
3)、DispatcherServlet根據HandlerMapping找到對應的Handler,並返回;
4)、將處理權交給Handler(Handler將具體的處理進行封裝),再由具體的處理器適配器(HandlerAdapter)對Handler進行具體的調用;
5)、處理器適配器執行Handler;
6)、Handler對數據處理完成以后將返回一個ModelAndView對象給處理器適配器;
7)、處理器適配器向前端控制器返回ModelAndView(ModelAndView是SpringMVC框架的一個底層對象,包括Model和View);
8)、Handler返回的ModelAndView只是一個邏輯視圖,並不是一個正式的視圖,前端控制器請求視圖解析器(ViewResolver)去進行視圖解析,根據邏輯視圖名解析成真正的視圖(jsp);
9)、視圖解析器向前端控制器返回View;
10)、前端控制器進行視圖渲染,視圖渲染將模型數據(在ModelAndView對象中)填充到request域中;
11)、前端控制器向用戶響應結果。
3、Hibernate的原理:
Hibernate框架執行過程:
1)、通過Configuration().configure();讀取並解析hibernate.cfg.xml配置文件;
2)、由hibernate.cfg.xml中的讀取並解析映射信息;
3)、通過config.buildSessionFactory(); //創建SessionFactory
4)、sessionFactory.openSession(); //打開Session
5)、session.beginTransaction(); //創建事務Transaction
6)、persistent operate持久化操作;
7)、session.getTransaction().commit(); //提交事務
8)、關閉Session;
9)、關閉SessionFactory;
4、Mybatis原理:
Mybatis框架執行過程:
1)、配置Mybatis的配置文件,SqlMapConfig.xml(名稱不固定)
2)、通過配置文件,加載Mybatis運行環境,創建SqlSessionFactory會話工廠SqlSessionFactory在實際使用時按單例方式;
3)、通過SqlSessionFactory創建SqlSession,SqlSession是一個面向用戶接口(提供操作數據庫方法),實現對象是線程不安全的,建議sqlSession應用場合在方法體內;
4)、調用SqlSession的方法去操作數據。如果需要提交事務,需要執行SqlSession的commit()方法;
5)、釋放資源,關閉SqlSession。
4、Spring家族:
三、對比:
1、Struts2與SpringMVC兩種框架對比:
1)不同之處:
①、springmvc和struts2都是負責去轉發的,但是兩者針對request的請求上面區別很大。
springmvc是針對於方法級別的請求,也就是一個方法對應於一個請求,屬於方法攔截,請求的數據方法不共享;而struts2則時針對一個Action類來進行請求的,即一個Action類對應於一個請求,所以類攔截,請求的數據類共享;
②、springmvc入口是一個servlet前端控制器(DispatcherServlet),struts2入口是一個filter過濾器;
③、springmvc的配置文件相對struts2來說較為少,容易上手,可以加快軟件開發的速度。
2、Hibernate和Mybatis兩種框架對比:
1)、相同之處:
①:Hibernate與Mybatis都可以是通過SessionFactoryBuilder,由XML配置文件生成SessionFactory,然后由SessionFactory生成Session,最后由Session來開啟執行事務和SQL語句。其中SessionFactoryBuilder,SessionFactory,Session的生命周期都是差不多的;
②、Hibernate和Mybatis都支持JDBC和JTA事務處理。
2)、不同之處:
①、Hibernate是一種O/R關系型,即完成數據庫表和持久化類之間的映射,而Mybatis是針對的SQL-Mapping,個人理解是一種Hibernate把數據庫給封裝好以后,可以調用相應的數據庫操作語句HQL,而Mybatis則是用的原始的數據庫操作語句;
②、針對高級查詢,Mybatis需要手動編寫SQL語句,以及ResultMap。而Hibernate有良好的映射機制,開發者無需關心SQL的生成與結果映射,可以更專注於業務流程;
③、Hibernate優化起來相對Mybatis較難,而且Hibernate掌握起來相對Mybatis較難,但是Hibernate數據庫移植性很好,Mybatis的數據庫移植性不好,不同的數據庫需要寫不同SQL。
四、總結:
SSM和SSH相同之處在於都是用Spring依賴注入DI來管理各層的組件,並且都是使用面向切面編程AOP來管理事務、日志、權限等。不同之處在於MVC實現方式,以及ORM持久化方面不同(Hibernate與Mybatis)。SSM越來越輕量級配置,將注解開發發揮到極致,且ORM實現更加靈活,SQL優化更簡便;而SSH較注重配置開發,其中的Hibernate對JDBC的完整封裝更面向對象,對增刪改查的數據維護更自動化,但SQL優化方面較弱,且入門門檻稍高。