通俗易懂SpringMVC整體框架理解
最近又重新溫習了一下前臺SpringMVC框架,能夠從整體上對SpringMVC有一個全域性的認識。在這裡也總結一下,為那些即將學習SpringMVC的親們,做一個很好的開端吧!
1. SpringMVC整體框架圖
學習某一種技術的話,要能夠從巨集觀上把握一下這種技術的大致實現原理,然後才開始刨根問底的學習,這種技術的細節,這樣會快也一些。首先從巨集觀上把控一些知識點之間的聯絡,學習起來更有連貫性,下面就先從SpringMVC的框架圖來整體分析一下。
上圖就是SpringMVC整體的框架圖,就這麼幾個部分。下面來著重的分析一下,整個過程中的流轉。
1.首先是使用者傳送請求,比如在瀏覽器中輸入http://localhost:8080/SpringTest/login
2.使用者的請求就傳送到了DispatcherServlet也就是前端控制器,這個東西是一個Servlet的實現,用來幹什麼呢?用來接收使用者的請求,然後響應結果,相當於一個轉發器,它的配置如下
[html] view plain copy print?-
<spanstyle="font-family:Comic Sans MS;font-size:18px;"><!-- 自此請求已交給Spring Web MVC框架處理,因此我們需要配置Spring的配置檔案,預設DispatcherServlet會載入WEB-INF/[DispatcherServlet的Servlet名字]-servlet.xml配置檔案。
- 本示例為WEB-INF/ chapter2-servlet.xml。 -->
- <servlet>
- <servlet-name>springMVC</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <init-param>
-
<param-name>contextConfigLocation</
- <param-value> classpath:springMVC-servlet.xml</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <!-- 這裡一定要是/根據Servlet規範來的 -->
- <servlet-mapping>
- <servlet-name>springMVC</servlet-name>
- <url-pattern>/</url-pattern>
- </servlet-mapping></span>
- <span style="font-family:Comic Sans MS;font-size:18px;">static {
- // Load default strategy implementations from properties file.
- // This is currently strictly internal and not meant to be customized
- // by application developers.
- try {
- ClassPathResource resource = new ClassPathResource(DEFAULT_STRATEGIES_PATH, DispatcherServlet.class);
- defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);
- }
- catch (IOException ex) {
- thrownew IllegalStateException("Could not load 'DispatcherServlet.properties': " + ex.getMessage());
- }
- }</span>
3.經過DispatcherServlet過濾後URL後,比如上述的URL是http://localhost:8080/SpringTest/login,那麼這時候就進入到了HandleMapping也就是對映處理器。這是用來幹什麼的呢?就是用來根據URL來匹配我們的處理器(或者就做控制器),比如我們請求的路徑最後結尾的字母是login,那麼讓那個控制器來為我們服務呢?這時候就靠HandleMapping來處理了。下面列一下SpringMVC中的幾種處理對映器。
3.1 BeanNameUrlHandlerMapping:用來根據控制器的name屬性來匹配要處理的對映器,配置如下
[html] view plain copy print?- <spanstyle="font-family:Comic Sans MS;font-size:18px;"><beanid="itemsController1"name="/queryItems_test.action"class="cn.ssm.controller.ItemsController1"/>
- <!-- 處理器對映器 將bean的name作為url進行查詢 ,需要在配置Handler時指定beanname(就是url)
- 所有的對映器都實現 HandlerMapping介面。
- -->
- <bean
- class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/></span>
3.2 SimpleUrlHandlerMapping:根據URL來對映匹配
[html] view plain copy print?- <spanstyle="font-family:Comic Sans MS;font-size:18px;"><beanid="itemsController1"name="/queryItems_test.action"class="cn.ssm.controller.ItemsController1"/>
- <!--簡單url對映 -->
- <beanclass="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
- <propertyname="mappings">
- <props>
- <!-- 對itemsController1進行url對映,url是/queryItems1.action -->
- <propkey="/queryItems1.action">itemsController1</prop>
- <propkey="/queryItems2.action">itemsController1</prop>
- <propkey="/queryItems3.action">itemsController2</prop>
- </props>
- </property>
- </bean></span>
3.3 RequestMappingHandlerMapping:3.1後引入的新的特性,註解介面卡,直接通過Controller標籤即可識別
[html] view plain copy print?- <spanstyle="font-family:Comic Sans MS;font-size:18px;"><!--註解對映器 -->
- <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?- <spanstyle="font-family:Comic Sans MS;font-size:18px;"><!-- 檢視解析器
- 解析jsp解析,預設使用jstl標籤,classpath下的得有jstl的包
- -->
- <bean
- class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <!-- 配置jsp路徑的字首 -->
- <propertyname="prefix"value="/WEB-INF/jsp/"/>
- <!-- 配置jsp路徑的字尾 -->
- <propertyname="suffix"value=".jsp"/>
- </bean></span>
8.最後一部操作了,解析完檢視資訊後,就把modelview中的model資訊傳遞到我們的view介面上,整個流程就處理完畢。