從零學習Spring MVC框架「環境搭建和MVC架構」

從零學習Spring MVC框架「環境搭建和MVC架構」

來自專欄極樂科技4 人贊了文章

環境搭建

這是Spring MVC框架教程的第一篇,首先為大家講解MVC架構思想,MVC模式並不是Javaweb項目中獨有的,MVC是一種軟體工程中的一種軟體架構模式,把軟體系統分為三個基本部分:模型「Model」、視圖「View」和控制器「Controller」,即為MVC。

圖源見文末

我們直接拿例子來解釋,最典型的MVC就是Jsp+servlet+Javabean模式。比如登陸的案例,在視圖層即Jsp中有一個表單,用戶填寫用戶名和密碼,點擊提交。這時候會跳轉到控制層,控制層Servlet會接受到表單提交的用戶名和密碼。

圖源:processon.com

注意:我們並不會在Servlet裡面進行業務邏輯和資料庫SQL編寫,這樣會顯得雜亂不堪。MVC架構的思想是,控制層接到用戶名和密碼送給Service層,在Service層中進行業務邏輯的編寫,比如判斷當前有沒有此用戶、密碼是否正確。

判斷密碼的正確性需要和資料庫進行交互,此時就需要另一個Dao層,Dao是專門和資料庫打交道,在Dao層中可以利用JDBCUtil進行SQL的編寫,並把查詢的結果返回給Service層。Service層有了Dao層的返回結果便可以進一步判斷密碼是否正確、用戶名存不存在,從而給控制層一個答覆。

控制層接到Service層的答覆後進行跳轉,比如:密碼錯誤時,返回Json值到視圖層,視圖層進行渲染展示給用戶,密碼正確就可以直接跳轉到主頁面。這樣分工明確才有利於項目的擴展和維護,我們學習的SSM框架便是很好的實踐:

圖源:processon.com

對於我們學習的SSM框架中,Spring MVC便是充當控制層的角色,即可以近似理解為提到了上面登陸例子中的Servlet,Mybatis作為數據訪問層的解決方案,近似理解為登陸例子中JDBC,而Spring是橫跨三層的一種容器框架。

1. 簡介

Spring的模型-視圖-控制器(MVC)框架是圍繞一個 DispatcherServlet 來設計的,這個Servlet非常重要,此Servlet會把請求分發給各個處理器,並支持可配置的處理器映射、視圖渲染、本地化、時區 與主題渲染等,甚至還能支持文件上傳。這個Servlet是框架的核心,暫時不理解沒關係。

處理器是你的應用中註解 了 @Controller 和 @RequestMapping 的類和方法,Spring為處理器方法提供了極其多樣靈活的 配置。Spring 3.0以後提供了 @Controller 註解機制、 @PathVariable 註解以及一些其他的特 性,也就是說你可以使用RESTful 風格的介面。

上方的簡介涉及的名稱和註解不理解沒關係,只需要有個大體的印象即可,我們會慢慢的為大家解釋清楚。

2. 起步

學習Spring MVC框架,首先我們搭建一個環境出來,在搭建環境的過程中就會對此框架有個大體的了解,開始我們的環境搭建。

去官網下載相應的Jar包,解壓後這樣的:

Jar包就在libs此文件夾里,docs是相關文檔,schema是xml上方的約束。

libs下有我們需要的Jar包,它是class文件,docs是文檔,source是源碼java文件,準備好了Jar包我們就開始環境搭建。

3. 案例截圖

4. 導入Jar包

5. web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"><display-name>SpringMVC01</display-name><servlet> <servlet-name>mvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup></servlet><servlet-mapping> <servlet-name>mvc</servlet-name> <url-pattern>/</url-pattern></servlet-mapping><welcome-file-list> <welcome-file>index.html</welcome-file></welcome-file-list></web-app>

在上方web.xml中,配置了一個用於調度控制的Servlet,在我們框架的學習過程中,DispatcherServlet是特別重要的,也是框架的核心。所有的請求驅動都圍繞這個控制器開分派請求,分別Servlet的配置進行解釋:

全限定類名

org.springframework.web.servlet.DispatcherServlet此全限定類名可以在導入的Jar文件spring-webmvc-4.2.1.RELEASE.jar的第一個包org.springframework.web.servlet中找到。

<load-on-startup>

在<servlet>中添加<load-on-startup>的作用是在web伺服器(tomcat)啟動時會不會創建這個Servlet實例,即是否在Web伺服器啟動時調用該Servlet的 init()方法,而不是真正訪問時才創建實例。

  • 值大於等於0時,Web容器啟動時就載入並初始化此Servlet,數字越小,被創建的越早。
  • 當值小於0或不指定時,Servlet在真正被使用時才被創建。
  • 值相同時,容器自己選擇次序。

<url-pattern>

不要寫/*,否則所有的Jsp頁面會報404錯誤,我們使用的是 / :表示包括靜態文件,css、js等一併攔截,這就需要對靜態文件進行處理,否則出現就會沒有樣式的情況,具體處理在後面文章給出。同樣還可以使用/*.do來攔截以.do結尾的請求,這也是開發中常用的。

<servlet-name>mvc</servlet-name>

在DispatcherServlet載入的時候需要一個Spring MVC 的配置文件,默認情況下,應用會去WEB-INF文件夾下查找對應的[name]-servlet.xml文件。對應我們的的xml配置就是是mvc-servlet.xml,也就是說<servlet-name>mvc</servlet-name>中參數名一定和Spring mvc的配置文件相同,如圖:

點擊放大圖片

並非一定要把Spring MVC的配置文件放在WEB-INF下面,你可以在Servlet的配置文件添加<init-param>配置來指定配置文件路徑。

6. HelloWorldController.java

@Controllerpublic class HelloWorldController { @RequestMapping("/test01") public ModelAndView test01(){ System.out.println("Hello World!"); return null; } @RequestMapping("/webjujidi") public ModelAndView upload(){ System.out.println("web項目聚集地"); return null; }}

我們創建一個類HelloWorldController,在類的上方添加@Controller註解,表明此類的實例是一個控制器,我們請求會在Controller中匹配方法進行處理,@RequestMapping註解類型用來映射一個請求和請求的方法,@RequestMapping("/test01")此註解表明凡是請求/test01路徑都會被test01方法處理,即列印出Hello World。

在Spring MVC中,控制器Controller 負責處理由DispatcherServlet 分發的請求,它把用戶請求的數據經過業務處理層處理之後封裝成一個Model ,然後再把該Model 返回給對應的View 進行展示。

在SpringMVC 中提供了一個非常簡便的定義Controller 的方法,你無需繼承特定的類或實現特定的介面,只需使用@Controller 註解標記一個類是Controller ,然後使用@RequestMapping 和@RequestParam 等一些註解用以定義URL 請求和Controller 方法之間的映射,這樣的Controller 就能被外界訪問到。

7. mvc-servlet.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!-- 啟動springMVC註解 --> <mvc:annotation-driven/> <!-- 掃描註解所在的包 --> <context:component-scan base-package="com.**.controller"></context:component-scan></beans>

上面的xml就是Spring MVC的配置文件,這個文件用來編輯Spring MVC相關的配置,對配置的兩行進行講解:

<mvc:annotation-driven/>

這是一種簡寫形式,完全可以手動配置替代這種簡寫形式,此配置會自動註冊為RequestMappingHandlerMapping和RequestMappingHandlerAdapter兩個Bean,這是Spring MVC為@Controller分發請求所必須的。

在Controller中我們使用了@Controller和@RequestMapping註解,但是使用它們需要在Spring MVC的配置文件中添加<mvc:annotation-driven/>配置用來啟動Spring MVC的註解。

<context:component-scan base-package="">

在xml配置了這個標籤後,Spring可以自動去掃描base-pack下面或者子包下面的java文件,如果可以掃描到含有@Component @Controller@Service等這些註解的類,則把這些類註冊為bean。

這裡是自動掃描帶@Controller註解的類註冊為bean,沒有學習Spring可能對這個地方不理解,不過沒關係,我們會馬上推出Spring的教程,你先暫時理解為:配置了它後,就可以找到帶@Controller註解的類,我們就可以使用它了即可。

8. 運行截圖

注意觀察,箭頭的指向,我們在瀏覽器中請求 test01路徑,此時test01的請求會被Servlet攔截,然後去匹配Controller中哪個方法上方@RequestMapping註解的值和test01相同,便會執行相應的方法。

注意觀察,箭頭的指向,我們在瀏覽器中請求/web路徑,此時/web的請求會被Servlet攔截,然後去匹配Controller中哪個方法上方@RequestMapping註解的值和/web相同,便會執行相應的方法。

9. 工作原理

如果看到這裡你能明白個大概就說明你已經入門了,接下來我會詳細的和你解釋一些剛剛的案例是怎麼樣的流程,以及Spring MVC的工作原理。

對於我們剛剛搭建的案例工作流程是這樣的:用戶發送請求至前端控制器DispatcherServlet。DispatcherServlet收到請求調用HandlerMapping處理器映射器。處理器映射器找到具體的處理器(可以根據xml配置、註解進行查找),生成處理器對象及處理器攔截器(如果有則生成,我們沒有使用)返回DispatcherServlet。

DispatcherServlet調用HandlerAdapter處理器適配器。HandlerAdapter經過適配調用具體的處理器(Controller,也叫後端控制器)。Controller執行方法在控制台列印"Hello World"等。

我們案例的視圖層可以簡單的理解為是控制台,但實際開發中並非這樣,我只是為了降低難度,不想第一篇文章涉及太多概念,讓讀者失去學習的興趣,而實際開發中Spring MVC的工作流程可以看下圖:

圖源:processon.com

10. 流程解釋

  1. 用戶發送請求至前端控制器DispatcherServlet。
  2. DispatcherServlet收到請求調用HandlerMapping處理器映射器。
  3. 處理器映射器找到具體的處理器(可以根據xml配置、註解進行查找),生成處理器對象及處理器攔截器(如果有則生成)一併返回給DispatcherServlet。
  4. DispatcherServlet調用HandlerAdapter處理器適配器。
  5. HandlerAdapter經過適配調用具體的處理器(Controller,也叫後端控制器)。
  6. Controller執行方法在控制台列印"Hello World"等,我們測試學習使用的控制台,開發中執行完畢常常返回ModelAndView。
  7. HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet。
  8. DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器。
  9. ViewReslover解析後返回具體View。
  10. DispatcherServlet根據View進行渲染視圖(即將模型數據填充至視圖中)。
  11. DispatcherServlet響應用戶。

上方是對比較完整的Spring MVC搭建的web項目工作原理的描述,我們剛開始的案例很多概念沒有涉及到,如ModelAndView、視圖解析器等,以後我們會逐漸完善項目,並且一一講解。

如果喜歡,關注我的微信公眾號:Web項目聚集地

圖一:my.oschina.net/Taciturn

圖二、三:processon.com

推薦閱讀

1. Linux養成計劃(一)

2. Linux養成計劃(二)

3. SSM框架開發「內容管理系統」

4. 讀書無用論,是歷史最大陰謀!

歡迎您的轉發和點贊

推薦閱讀:

手把手教你ASP.NET Core
MVC設計模式以及其他
Unity中使用簡易MVC詳解

TAG:設計模式 | MVC | SpringMVC |