Spring MVC溫故而知新 – 從零開始
Spring MVC簡介
Spring MVC是一款基於MVC架構模式的輕量級Web框架,目的是將Web開發模塊化,對整體架構進行解耦。
Spring MVC有一下優點:
作為Spring框架的一部分,擁有Spring的優點(IOC,AOP等)
支持靈活的URL到頁面控制器的映射
提供靈活的數據驗證、格式化、數據綁定機制
支持RESTful風格
Spring MVC請求流程
Spring MVC框架的整體請求流程如下:
上圖中涉及到Spring MVC的幾個功能組件:
前端控制器(DispatcherServlet):接收用戶請求並返回請求結果。它的作用相當於一個轉發器或中央處理器,控制整個執行流程,對各逐漸進行調度降低組件之間的耦合。
處理器映射器(HandlerMapping):根據用戶請求的URL,通過註解或者XML配置,查找相應的處理器Handler
處理器適配(HandlerAdapter):根據映射器查找出的Handler,完成調用處理器中的方法
處理器(Handler):請求處理的具體邏輯,返回數據和視圖信息
視圖解析器(View Resolver):解析具體視圖,通過ModelAndView對象中的View信息,將邏輯視圖名解析成真正的視圖View
請求流程具體步驟詳解:
1:用戶發起請求,請求會被前端控制器(DispatcherServlet)攔截
2:前端控制器(DispatcherServlet)請求處理器映射器(HandlerMapping)查找Handler
3:處理器映射器(HandlerMapping)根據配置找到相應Handler(可以更具註解或者XML配置),可能包含多個Interceptor攔截器,返回給前端控制器
4:前端控制器(DispatcherServlet)請求處理器適配器(HandlerAdapter)去執行相應的Handler
5:適配器交由對應Handler處理器執行
6: Handler處理器執行完成後返回ModelAndView對象給處理器適配器
7:處理器適配器接受Handler處理器的返回結果,並將該結果返回給前端控制器(DispatcherServlet)
8:前端控制器(DispatcherServlet)接收處理器適配器返回的數據和視圖信息,請求視圖解析器,解析對應的視圖
9:視圖解析器根據View信息匹配的相應的視圖結果,反回給前端控制器
10:前端控制器接收具體視圖,進行視圖渲染,將Model數據填充到View視圖中,生成最終視圖
11:前端控制器向用戶返回結果
從零開始搭建demo
創建工程:
Eclipse下新建一個動態Web項目
工程默認目錄結構:
添加jar包依賴
WebContent > WEB-INF > lib 文件夾下導入相應的jar包,其中核心的jar包是spring-webmvc-5.0.0.RELEASE.jar,其他是幾個主要是spring用於管理上下文和beande 包、jstl標簽庫和一個用於打印日誌的log包:
在web.xml中配置前端控制器
前端控制器相當於Spring MVC的專有servlet,用於攔截所有符合條件的請求,交由框架做後續處理
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <!-- 配置前端控制器-DispatchServlet --> <servlet> <servlet-name>springMvcNext</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- contextConfigLocation不是必須的, 如果不配置contextConfigLocation, springmvc的配置文件默認在:WEB-INF/servlet的name+"-servlet.xml" --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springMvcNext</servlet-name> <url-pattern>/</url-pattern> <!--根據url-pattern設定的規則攔截用戶發來的請求 此處攔截所有請求,包括靜態資源 -> </servlet-mapping> </web-app>
其中<servlet-mapping>標簽中定義url匹配規則為符合*.action的形式,對應的servlet名為springMvcNext,而<servlet>配置的控制器為org.springframework.web.servlet.DispatchServlet,該控制器為當前SpringMVC項目的前端控制器,<init-param>標簽為當前控制器依賴的參數,兩個參數分別代表上下文參數和參數加載路徑。
關於classpath:代表web項目編譯後編譯後的輸出路徑
配置spring MVC配置
在java源代碼更目錄下添加applicationContext.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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 包掃描器 標簽將用於激活Spring MVC註釋掃描功能,允許使用@Controller和@RequestMapping等註釋。--> <context:component-scan base-package="com.sl.controller" /> <!-- 註解驅動 --> <mvc:annotation-driven /> <!-- 配置視圖解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <property name="prefix" value="/WEB-INF/view/" /> <property name="suffix" value=".jsp" /> </bean> </beans>
添加控制器Controller與視圖View
Src目錄下添加包com.sl.controller,添加控制器代碼如下:
package com.sl.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class HelloWorldController { @RequestMapping("/index") //處理URL路徑中以/index開頭的所有請求: 包括 /index/* 和 /index.html public ModelAndView helloWorld() { String message = "Hello Spring MVC"; return new ModelAndView("index", "message", message); } }
在WEB-INF/view中添加視圖文件index.jsp
<html> <head> <title>Spring MVC </title> </head> <body> ${message} </body> </html>
運行結果:
Spring MVC溫故而知新 – 從零開始