1. 開發步驟:
(1)增加Spring支持
下載Spring安裝包和其依賴的commons-logging.jar,復制到項目Web應用的lib文件夾(WebRoot/WEB-INF/lib);
Spring文件夾內容介紹: |
dccs: Spring相關文檔,包括開發指南、API參考文檔; libs: jar包。分為:1)Spring框架calss文件的JAR包;2)Spring框架源文件的壓縮包,文件名以-source結尾; 3)Spring框架API文檔的壓縮包,文件名以-javadoc結尾; schemas: Spring配置文件的XML Schema文檔; 其他.txt說明性文檔。 |
(2)配置前端控制器DispatchServlet
在部署描述符web.xml中編輯配置DispatchServlet(WebRoot/WEB-INF/web.xml)
<?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" version="3.1"> <display-name>SM02</display-name> <!-- 配置SpringMVC前端控制器DispatcherServlet --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <!-- 指定SpringMVC配置文件spring-config.xml,用來將攔截的對應請求分發給對應的Controller--> <param-value>/WEB-INF/springmvc-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!-- 指定該springmvc的Servlet可以攔截的請求為所有請求("/"),
之后可以分發給對應的Controller--> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
(3)配置SpringMVC的Controller
在SpringMVC的配置文件springmvc-config.xml中配置對應的Controller、對應的Java Bean、對應攔截的請求等
(WEN-INF/springmvc-config.xml,路徑在web.xml的DispatcherServlet的配置中param-value子標簽中配置)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd"> <!-- 配置Handle,映射"/hello"請求 --> <bean name="/hello" class="org.fkit.controller.HelloController"/> <!-- 處理映射器將bean的name作為url進行查找,需要在配置Handle時指定name(即url) --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!-- SimpleControllerHandlerAdapter是一個處理器適配器,所有處理適配器都要實現 HandlerAdapter接口--> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> <!-- 視圖解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/> </beans>
其中,Spring4.0之后可以不配置處理映射器、處理器適配器、視圖解析器,這些工作會默認完成。此處為顯式表現出SpringMVC工作流程。
(4)Controller類的實現
HelloController類實現了Controller接口,用來處理"/hello"的單一請求,即瀏覽器發出http://localhost:8080/SM02/hello的請求時實際由該Controller處理。
(src/org/fkit/controller/HelloController.java)
package org.fkit.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; /** * 一個實現了Controller接口的控制器 * 可以處理一個單一的請求動作("/hello") * http://localhost:8080/SM02/hello */ public class HelloController implements Controller { private static final Log logger = LogFactory.getLog(HelloController.class); /** * handleRequest方法時Controller接口必須實現的方法 * 返回一個ModelAndView對象,包含視圖名或視圖名和模型 */ public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception { logger.info("handleRequest調用"); //創建ModelAndView對象 ModelAndView mv = new ModelAndView(); //添加模型數據,可以是任意POJO對象,第一個參數是對該對象的命名,可在jsp中用EL表達式引用 mv.addObject("message", "Hello SpringMVC"); //設置邏輯視圖名,視圖解析器會根據該名字解析到具體的視圖頁面,參數指定該頁面路徑 mv.setViewName("/WEB-INF/content/welcome.jsp"); //返回ModelAndView對象 return mv; } }
(5)View頁面實現
HelloController返回的頁面,用來顯式返回的視圖內容,在該Controller的ModelAndView對象的setViewName()中指定路徑。
(WEB-INF/content/welcome.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>歡迎頁面</title> </head> <body> <!-- 頁面可以訪問Controller傳遞傳遞出來的message --> ${requestScope.message} </body> </html>
(6)結果展示
在瀏覽器中輸入URL:http://localhost:8080/SM02/hello,返回以下視圖,表示訪問成功。
2. 執行流程解析
(1)用戶向服務器發送請求
(2)請求被DispatcherServlet攔截
(3)DispatcherServlet對請求URL(統一資源定位符)進行解析,得到URI(請求資源標識符)。根據該URI,調用HandlerMapping獲得該Handler(Controller)配置的所有相關對象,包括Handler對象以及Handler對象對應的攔截器,這些對象會被封裝到一個HandlerExecutionChain對象中返回。
(4)DispatcherServlet根據獲得的Handler,選擇一個合適的HandlerAdapter。HandlerAdapter的設計符合面向對象的單一職責原則,代碼架構清晰,便於維護,可復用性高。HandlerAdapter被用於處理多種Handler,調用Handler實際處理請求的方法。
(5)提取請求中的模型數據,執行Handler(Controller)。在填充Handler入參過程中,根據配置,Spring會做一些額外的工作(消息轉換、數據轉換、數據格式化、數據驗證...)
(6)Handler執行完成后向DispatcherServlet返回一個ModelAndView對象,對象中應包括視圖名,或視圖名和模型
(7)根據返回的對象,選擇合適的ViewResolver(視圖解析器),返回給DispatcherServlet。
(8)ViewResolver結和Model和View渲染視圖。
(9)將視圖渲染結果返回給客戶端。