SpringMVC應用的開發步驟前端
1.在web.xml文件中定義前端控制器DispatcherServlet來攔截用戶請求。在web.xml中配置該框架的核心Servlet或Filter,這樣纔可讓該框架接入web應用中。java
例如,開發SpringMVC應用的第1步就是在web.xml文件中增長以下配置片斷:web
<!-- 定義Spring MVC的前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 讓Spring MVC的前端控制器攔截全部請求 -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>spring
2.若是須要以post方式提交請求,則定義包含表單數據的JSP頁面。若是僅僅只是以get方式發送請求,則無須通過這一步。服務器
3.定義處理用戶請求的Handle類,能夠實現Controller接口或使用@Controller註解。架構
這一步也是全部MVC框架中必不可少的,由於這個DispatcherServlet就是MVC中的C,也就是前端控制器,該控制器負責接收請求,並將請求分發給對應的Handle,即實現Controller接口的Java類,而該Java類負責調用後臺業務邏輯代碼來處理請求。mvc
MVC框架的底層機制是:前端Servlet接收到用戶請求後,一般會對用戶請求進行簡單預處理,例如解析、封裝參數等,而後經過反射來建立Controller實例,並調用Controller的指定方法(實現Controller接口的是handleRequest方法,而使用基於註解的控制器能夠任意方法)來處理用戶請求。app
當Servlet攔截用戶請求後,有兩種解決方案來知道建立哪一個Controller接口的實例。1):利用xml配置文件,例如在xml配置文件中描述hello請求對應使用HelloController類。這就可讓MVC框架知道建立哪一個Controller接口的實例。2)利用註解,例如使用註解@Controller描述一個類,並使用註解@RequestMapping(value="/hello")描述hello請求對應的方法。這樣也可讓MVC框架知道建立哪一個Controller接口的實例並調用哪一個方法處理請求。框架
在SpringMVC框架中,控制器實際上由兩個部分共同組成,即攔截全部用戶請求和處理請求的通用代碼都由前端控制器DispatcherServlet完成,而實際的業務控制(諸如調用後臺業務邏輯代碼,返回處理結果等)則由Controller處理。jsp
4.配置Handle。Java領域的絕大部分MVC框架都很是喜歡使用xml文件來進行配置管理,這在之前是一種思惟定勢。即配置哪一個請求對應哪一個Controller進行處理,從而讓前端控制器根據該配置來建立合適的Controller實例,並調用該Controller的業務控制方法。
例如,能夠採用以下代碼片斷來配置Handle:
<!--配置Handle,映射「/hello」請求-->
<bean name="/hello" class="org.fkit.controller.HelloController"/>
在Spring2.5以後,推薦使用註解來配置Handle:
@Controller
public class HelloController{
@RequestMapping(value="/hello")
public ModelAndView hello(){
...
}
}
上面的配置片斷指定若是用戶請求URL爲hello,則使用org.fkit.controller.HelloController來處理。如今幾乎全部的框架都使用「約定優於配置」的思想,也就是採用約定方式來規定用戶請求地址和Handle之間的對應關係。
5.編寫視圖資源
當Handle處理用戶請求結束後,一般會返回一個ModelAndView對象,該對象中應該包含的視圖名和模型,這個視圖名就表明須要顯示的物理視圖資源。若是Handle須要把一些數據傳給視圖資源,則能夠經過模型對象。
通過上面的5個步驟,便可基本完成一個SpringMVC處理流程的開發,也就是能夠執行一次完整的請求->響應過程。
SpringMVC請求->響應的完整工做流程以下:
1.用戶向服務器發送請求,請求被Spring的前端控制器DispatcherServlet截獲。
2.DispatcherServlet對請求URL(統一資源定位符)進行解析,獲得URI(請求資源標識符)。而後根據該URI,調用HandlerMapping得到該Handler配置的全部的相關的對象,包括Handler對象以及Handler對象對應的攔截器,這寫對象會被封裝到一個HandlerExecutionChain對象當中返回。
3.DispatcherServlet根據得到的Handler,選擇一個合適的HandlerAdapter。HandlerAdapter的設計符合面對對象中的單一職責原則,代碼架構清晰,便於維護,最重要的是,代碼可複用性高。HandlerAdapter會被用於處理多種Handler,調用Handler實際處理請求的方法,例如hello方法。
4.提取請求中的模型數據,開始執行Handler(Controller)。在填充Handler的入參過程當中,根據配置,Spring將幫你作一些額外的工做。
消息轉換:將請求消息(如Json、xml等數據)轉換爲一個對象,將對象轉換爲指定的響應信息。
數據轉換:對請求消息進行數據轉換,如String轉換成Integer、Double等。
數據格式化:對請求消息進行數據格式化,如將字符串轉換爲格式化數字或格式化日期等。
數據驗證:驗證數據的有效性(長度、格式等),驗證結果存儲到BindingResult或Error中。
5.Handler執行完成後,DispatcherServlet返回一個ModelAndView對象,ModelAndView對象中應該包含視圖名或視圖名和模型。
6.根據返回的ModelAndView對象,選擇一個合適的ViewReslover(視圖解析器)返回給DispatcherServlet。
7.ViewReslover結合Model和View來渲染視圖。
8.將視圖渲染結果返回給客戶端。
以上8個步驟,DispatcherServlet、HandlerMapping、HandlerAdapter和ViewResolver等對象協同工做,完成SpringMVC請求->響應的整個工做流程,這些對象所完成的工做對於開發者來講都是不可見的,開發者並不須要關心這些對象如何工做,只須要在Handler(Controller)當中完成對請求的業務處理。
對於MVC框架,控制器(Controller)執行業務邏輯,用戶產生模型數據(Model),而視圖(View)則用於渲染模型數據。如何將模型數據傳遞給視圖是SpringMVC框架的一項工做,SpringMVC提供了多種途徑輸出模型數據,如:Model和ModelMap,ModelAndView、@ModelAttribute、@SessionAttributes。
關於spingmvc-config.xml文件,最基本的有兩步:
step1:
<!-- spring能夠自動去掃描base-pack下面的包或者子包下面的java文件,
若是掃描到有Spring的相關注解的類,則把這些類註冊爲Spring的bean -->
<context:component-scan base-package="org.fkit.controller"/>
step2(視圖解析器):
<!-- 視圖解析器 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 前綴 --> <property name="prefix"> <value>/WEB-INF/content/</value> </property> <!-- 後綴 --> <property name="suffix"> <value>.jsp</value> </property> </bean>