1. 程式人生 > >基於SSM的Java Web應用開發原理初探

基於SSM的Java Web應用開發原理初探

SSM開發Web的框架已經很成熟了,成熟得以至於有點落後了。雖然如今是SOA架構大行其道,微服務鋪天蓋地的時代,不過因為仍有大量的企業開發依賴於SSM,本文簡單對基於SSM的Java開發做一快速入門,方便讀者儘快把握脈絡,理解Java Web開發的主軸,便於做進一步深入學習。

關於第一代MVC開發可見:JavaWeb開發之詳解Servlet及Servlet容器

SpringMVC

跟許多MVC框架一樣,SpringMVC底層依賴Servlet實現底層HTTP請求的處理。不久前Spring 5.0更新了基於Servlet3.1非阻塞式IO的Spring WebFlux,將另文介紹。

DispatcherServlet

DispatcherServlet的核心作用是請求分發,作為前端控制器接收所有請求,特點如下:

  1. 繼承了HttpServlet,需要配置在Web應用中。
  2. 需在init-param中配置contextConfigLocation引數,DispatcherServlet會解析該檔案並生成一個WebApplicationContext的容器物件,稱為上下文環境。
  3. WebApplicationContext繼承ApplicationContext容器,它需要ServletContext例項。因此必須執行在Web容器中

基於Controller介面的控制器

DispatcherServlet請求轉發至Handler,Handler是Controller介面的實現類,可以通過handleRequest方法訪問對應請求的HttpServletRequest和HttpServletResponse物件。處理完業務請求後,必須返回一個包含模型物件和檢視路徑的ModelAndView物件。

Spring MVC執行流程

  1. 當web程式啟動的時候,ContextLoaderServlet會把對應的配置檔案資訊讀取出來,通過IoC去初始化控制器DispatchServlet
  2. 使用者向伺服器傳送請求,請求被前端控制器DispatcherServlet統一截獲。
  3. DispatcherServlet解析URL得到URI,根據URI呼叫HandlerMapping獲得該Handler配置的所有相關物件,包括Handler物件以及Handler物件對應的攔截器,這些物件會被封裝到HandlerExecutionChain物件返回。
  4. DispatcherServlet根據獲得的Handler,選一個合適的HandlerAdapter
    。HandlerAdapter符合單一職責原則,會被用於處理多種Handler,呼叫Handler的實際處理方法。
  5. 提取請求中的資料模型,開始執行Handler。在處理入參過程中,根據配置,Spring會負責:
    • 訊息轉換:將請求資訊(如Json,xml)轉換為物件,將物件轉換為響應。
    • 資料轉換:將請求資訊的資料進行轉換,如String轉為Integer、Double等。
    • 資料格式化:對請求資訊的資料進行格式化,如String轉為格式化數字或日期等。
    • 資料驗證:驗證資料的有效性(長度、格式等),驗證結果儲存到BindingResult或Error中。
  6. Handler執行完畢後,向DispatcherServlet返回一個ModelAndView物件,該物件應該包含檢視名,或檢視名和模型。
  7. 根據返回的ModelAndView,選擇一個合適的ViewResolver檢視解析器返回給DispatcherServlet。
  8. ViewResolver結合Model來渲染檢視。
  9. 將檢視渲染結果返回給客戶端。

開發步驟

  1. web.xml中定義前端控制器DispatcherServlet
  2. 定義使用POST提交資料的前端JSP
  3. 定義處理使用者請求的Handle類,可以實現Controller介面或使用@Controller註解
  4. 配置Handle
  5. 編寫檢視資源

Mybatis

ORM(Object/Relation Mapping)即物件/關係資料庫對映,核心作用就是把持久化物件的增刪查改轉為對資料庫的操作。開發者可以面向物件的方式操作持久化物件,而ORM框架負責將相關操作轉換成對應的SQL操作。

ORM基本對映關係:

  • 資料表對映類:持久化類被對映到一個數據表。程式使用該持久化類來建立例項、修改屬性、刪除例項時,系統會自動轉換為對錶的CRUD操作。
  • 資料行對映物件:持久化類所生成的物件,對應表中的行。當程式修改例項時,ORM轉為對行的操作。
  • 資料類欄位對映物件的屬性:程式修改程式化類的某個屬性時,ORM會對應修改某個列。

Mybatis體系結構

Mybatis的常用物件有SqlSessionFactory和SqlSession。

SqlSessionFactory是執行緒安全的,是資料庫編譯後的記憶體映象,通常一個應用對應一個SqlSessionFactory。SqlSessionFactory物件通過載入mybatis-config.xml配置檔案生成。它生成的邏輯是:

XML配置檔案/Configuration例項===>SqlSessionFactoryBuilder===>SqlSessionFactory

SqlSession是執行緒不安全的,是執行持久化操作的物件,底層封裝了JDBC連線,由SqlSessionFactory生成。因為是執行緒不安全的,一般不能作為類的靜態欄位或例項欄位,也不能放在任何類的管理範圍中,比如Servlet中的HttpSession物件。

Mybatis初始化基本流程

  1. 呼叫SqlSessionFactoryBuilder物件的build(inputStream)方法;
  2. SqlSessionFactoryBuilder會根據輸入流建立XMLConfigBuilder物件;
  3. SqlSessionFactoryBuilder呼叫XMLConfigBuilder的parse方法,解析XML配置檔案返回Configuration物件;
  4. SqlSessionFactoryBuilder根據Configuration物件建立一個DefaultSessionFactory物件,並返回給客戶端。

使用MyBatis操作持久化物件接本步驟

  1. 編寫持久化類POJO和持久化操作的Mapper.xml,定義要執行的SQL語句
  2. 獲取SqlSessionFactory
  3. 獲取SqlSession
  4. 用面向物件的方式操作資料庫
  5. 關閉事務,關閉SqlSession