SSM開發Web的框架已經很成熟了,成熟得以致於有點落後了。雖然現在是SOA架構大行其道,微服務鋪天蓋地的時代,不過由於仍有大量的企業開發依賴於SSM,本文簡單對基於SSM的Java開發作一快速入門,方便讀者儘快把握脈絡,理解Java Web開發的主軸,便於作進一步深刻學習。html
關於第一代MVC開發可見:JavaWeb開發之詳解Servlet及Servlet容器前端
SpringMVCweb
跟許多MVC框架同樣,SpringMVC底層依賴Servlet實現底層HTTP請求的處理。不久前Spring 5.0更新了基於Servlet3.1非阻塞式IO的Spring WebFlux,將另文介紹。數據庫
DispatcherServlet安全
DispatcherServlet的核心做用是請求分發,做爲前端控制器接收全部請求,特色以下:服務器
- 繼承了HttpServlet,須要配置在Web應用中。
- 需在init-param中配置contextConfigLocation參數,DispatcherServlet會解析該文件並生成一個WebApplicationContext的容器對象,稱爲上下文環境。
- WebApplicationContext繼承ApplicationContext容器,它須要ServletContext實例。所以必須運行在Web容器中
基於Controller接口的控制器mybatis
DispatcherServlet請求轉發至Handler,Handler是Controller接口的實現類,能夠經過handleRequest方法訪問對應請求的HttpServletRequest和HttpServletResponse對象。處理完業務請求後,必須返回一個包含模型對象和視圖路徑的ModelAndView對象。架構
Spring MVC執行流程app

- 當web程序啓動的時候,ContextLoaderServlet會把對應的配置文件信息讀取出來,經過IoC去初始化控制器DispatchServlet
- 用戶向服務器發送請求,請求被前端控制器DispatcherServlet統一截獲。
- DispatcherServlet解析URL獲得URI,根據URI調用HandlerMapping得到該Handler配置的全部相關對象,包括Handler對象以及Handler對象對應的攔截器,這些對象會被封裝到HandlerExecutionChain對象返回。
- DispatcherServlet根據得到的Handler,選一個合適的HandlerAdapter。HandlerAdapter符合單一職責原則,會被用於處理多種Handler,調用Handler的實際處理方法。
- 提取請求中的數據模型,開始執行Handler。在處理入參過程當中,根據配置,Spring會負責:
- 消息轉換:將請求信息(如Json,xml)轉換爲對象,將對象轉換爲響應。
- 數據轉換:將請求信息的數據進行轉換,如String轉爲Integer、Double等。
- 數據格式化:對請求信息的數據進行格式化,如String轉爲格式化數字或日期等。
- 數據驗證:驗證數據的有效性(長度、格式等),驗證結果存儲到BindingResult或Error中。
- Handler執行完畢後,向DispatcherServlet返回一個ModelAndView對象,該對象應該包含視圖名,或視圖名和模型。
- 根據返回的ModelAndView,選擇一個合適的ViewResolver視圖解析器返回給DispatcherServlet。
- ViewResolver結合Model來渲染視圖。
- 將視圖渲染結果返回給客戶端。
開發步驟框架
- web.xml中定義前端控制器DispatcherServlet
- 定義使用POST提交數據的前端JSP
- 定義處理用戶請求的Handle類,能夠實現Controller接口或使用@Controller註解
- 配置Handle
- 編寫視圖資源
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初始化基本流程
- 調用SqlSessionFactoryBuilder對象的build(inputStream)方法;
- SqlSessionFactoryBuilder會根據輸入流建立XMLConfigBuilder對象;
- SqlSessionFactoryBuilder調用XMLConfigBuilder的parse方法,解析XML配置文件返回Configuration對象;
- SqlSessionFactoryBuilder根據Configuration對象建立一個DefaultSessionFactory對象,並返回給客戶端。

使用MyBatis操做持久化對象接本步驟
- 編寫持久化類POJO和持久化操做的Mapper.xml,定義要執行的SQL語句
- 獲取SqlSessionFactory
- 獲取SqlSession
- 用面向對象的方式操做數據庫
- 關閉事務,關閉SqlSession