1. 程式人生 > >通俗易懂SpringMVC整體框架理解

通俗易懂SpringMVC整體框架理解

最近又重新溫習了一下前臺SpringMVC框架,能夠從整體上對SpringMVC有一個全域性的認識。在這裡也總結一下,為那些即將學習SpringMVC的親們,做一個很好的開端吧!

 1. SpringMVC整體框架圖

 學習某一種技術的話,要能夠從巨集觀上把握一下這種技術的大致實現原理,然後才開始刨根問底的學習,這種技術的細節,這樣會快也一些。首先從巨集觀上把控一些知識點之間的聯絡,學習起來更有連貫性,下面就先從SpringMVC的框架圖來整體分析一下。

 

 上圖就是SpringMVC整體的框架圖,就這麼幾個部分。下面來著重的分析一下,整個過程中的流轉。

 1.首先是使用者傳送請求,比如在瀏覽器中輸入http://localhost:8080/SpringTest/login

 2.使用者的請求就傳送到了DispatcherServlet也就是前端控制器,這個東西是一個Servlet的實現,用來幹什麼呢?用來接收使用者的請求,然後響應結果,相當於一個轉發器,它的配置如下

[html] view plain copy  print?
  1. <spanstyle="font-family:Comic Sans MS;font-size:18px;"><!-- 自此請求已交給Spring Web MVC框架處理,因此我們需要配置Spring的配置檔案,預設DispatcherServlet會載入WEB-INF/[DispatcherServlet的Servlet名字]-servlet.xml配置檔案。  
  2. 本示例為WEB-INF/ chapter2-servlet.xml。 -->
  3.     <servlet>
  4.         <servlet-name>springMVC</servlet-name>
  5.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  6.         <init-param>
  7.             <param-name>contextConfigLocation</
    param-name>
  8.             <param-value> classpath:springMVC-servlet.xml</param-value>
  9.         </init-param>
  10.         <load-on-startup>1</load-on-startup>
  11.     </servlet>
  12.     <!-- 這裡一定要是/根據Servlet規範來的 -->
  13.     <servlet-mapping>
  14.         <servlet-name>springMVC</servlet-name>
  15.         <url-pattern>/</url-pattern>
  16.     </servlet-mapping></span>
 如果翻開DispatcherServlet原始碼的話,會發現會預設載入SpringMVC的一些配置,原始碼如下 [java] view plain copy  print?
  1. <span style="font-family:Comic Sans MS;font-size:18px;">static {  
  2.         // Load default strategy implementations from properties file.
  3.         // This is currently strictly internal and not meant to be customized
  4.         // by application developers.
  5.         try {  
  6.             ClassPathResource resource = new ClassPathResource(DEFAULT_STRATEGIES_PATH, DispatcherServlet.class);  
  7.             defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);  
  8.         }  
  9.         catch (IOException ex) {  
  10.             thrownew IllegalStateException("Could not load 'DispatcherServlet.properties': " + ex.getMessage());  
  11.         }  
  12.     }</span>  
 並且該servlet也會預設載入預設DispatcherServlet會載入WEB-INF/[DispatcherServlet的Servlet名字]-servlet.xml配置檔案。本示例為WEB-INF/SpringMVC-servlet.xml.改配置檔案就用來配置後面的處理對映器、處理介面卡等相關資訊

 3.經過DispatcherServlet過濾後URL後,比如上述的URL是http://localhost:8080/SpringTest/login,那麼這時候就進入到了HandleMapping也就是對映處理器。這是用來幹什麼的呢?就是用來根據URL來匹配我們的處理器(或者就做控制器),比如我們請求的路徑最後結尾的字母是login,那麼讓那個控制器來為我們服務呢?這時候就靠HandleMapping來處理了。下面列一下SpringMVC中的幾種處理對映器。

 3.1 BeanNameUrlHandlerMapping:用來根據控制器的name屬性來匹配要處理的對映器,配置如下

[html] view plain copy  print?
  1. <spanstyle="font-family:Comic Sans MS;font-size:18px;"><beanid="itemsController1"name="/queryItems_test.action"class="cn.ssm.controller.ItemsController1"/>
  2.     <!-- 處理器對映器 將bean的name作為url進行查詢 ,需要在配置Handler時指定beanname(就是url)   
  3.     所有的對映器都實現 HandlerMapping介面。  
  4.     -->
  5.     <bean
  6.         class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/></span>
 經過這樣配置的話,就可以通過/queryItems_test來查詢我們的控制器了

 3.2 SimpleUrlHandlerMapping:根據URL來對映匹配

[html] view plain copy  print?
  1. <spanstyle="font-family:Comic Sans MS;font-size:18px;"><beanid="itemsController1"name="/queryItems_test.action"class="cn.ssm.controller.ItemsController1"/>
  2.     <!--簡單url對映  -->
  3.     <beanclass="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  4.         <propertyname="mappings">
  5.             <props>
  6.                 <!-- 對itemsController1進行url對映,url是/queryItems1.action -->
  7.                 <propkey="/queryItems1.action">itemsController1</prop>
  8.                 <propkey="/queryItems2.action">itemsController1</prop>
  9.                 <propkey="/queryItems3.action">itemsController2</prop>
  10.             </props>
  11.         </property>
  12.     </bean></span>

 3.3 RequestMappingHandlerMapping:3.1後引入的新的特性,註解介面卡,直接通過Controller標籤即可識別

[html] view plain copy  print?
  1. <spanstyle="font-family:Comic Sans MS;font-size:18px;"><!--註解對映器 -->
  2.     <beanclass="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/></span>

4.接著向下走,通過對映處理器就找到了我們需要處理使用者請求的控制器也就是Handler,那麼此時還需要HandlerAdapter(處理器介面卡)來,作用就是要按照特定規則(HandlerAdapter要求的規則)去執行Handler。常見的介面卡如下

        4.1 SimpleControllerHandlerAdapter:要求handler實現Controller介面

         SimpleControllerHandlerAdapter將會呼叫處理器的handleRequest方法進行功能處理,該處理方法返回一個ModelAndView給DispatcherServlet;當然了也有對應的註解介面卡

     4.2 HttpRequestHandlerAdapter:要求編寫的Handler實現HttpRequestHandler介面

     4.3.註解介面卡有RequestMappingHandlerAdapter,用來配合註解的開發

 5.接著向下走,經過介面卡呼叫控制器的方法後,就會想前端控制器返回一個ModelView,包含我們需要資訊的pojo物件和檢視資訊。

 6.前端控制器開始解析檢視資訊,通過檢視解析器(View Resolver),進行檢視解析,根據邏輯檢視名解析成真正的檢視(view)。如下配置

[html] view plain copy  print?
  1. <spanstyle="font-family:Comic Sans MS;font-size:18px;"><!-- 檢視解析器  
  2.     解析jsp解析,預設使用jstl標籤,classpath下的得有jstl的包  
  3.      -->
  4.     <bean
  5.         class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  6.         <!-- 配置jsp路徑的字首 -->
  7.         <propertyname="prefix"value="/WEB-INF/jsp/"/>
  8.         <!-- 配置jsp路徑的字尾 -->
  9.         <propertyname="suffix"value=".jsp"/>
  10.     </bean></span>

8.最後一部操作了,解析完檢視資訊後,就把modelview中的model資訊傳遞到我們的view介面上,整個流程就處理完畢。