spring mvc 之配置式開發一

1.SimplUrlHandlerMapping前端

01.在applicationContext.xml中配置:java

<bean id="firstController" class="cn.happy.controller.FirstController"></bean>

    <!--處理器映射器  -->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/hello.do">firstController</prop>
            </props>
        </property>
    </bean> 

02.定義控制器web

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FirstController implements Controller {
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView mv = new ModelAndView();
        mv.addObject("username","Spring-MVC");
        mv.setViewName("index");  //邏輯視圖名
        return mv;
    }
}

03.web.xml中的配置還如上篇博客spring

2.HandllerMapping執行流程數組

請求過來先遇見中央調度器(前端調度器)mvc

對當前請求決定交給哪一個handler, 當前請求地址過來app

處理器執行鏈處理請求,接着咱們去找getHandler的實現性能

hm是HandlerMapping對象,下圖選定位置調用HandlerMapping的getHandler()方法經過請求找到Handler,可是返回值爲HandlerExecutionChain(執行鏈)this

這個servlet所支持的處理器映射器的集合,這裏有N個處理器映射器。hm就是指HandlerMapping ,下面的if中的代碼是指記錄日誌,日誌跟蹤。HandlerMapping處理器映射器中有N個攔截器,處理客服端請求的處理器只有一個,就是handler處理器。url

getHandler咱們跟進去,

看過來的handler是否是執行鏈,要是就把handler強轉成執行鏈,若是不是我new出一個執行鏈而且把handler給執行鏈。

HandlerInterceptor是處理器的攔截器。並且不是一個是多個攔截器(this.adaptedInterceptors),而後作了一個操做。若是當期攔截器,是映射用的攔截器,就把他給強轉成處理器映射器。

而後作了一個匹配,和查找的路徑作匹配。而後加到了執行鏈攔截器中。那麼若是不是就直接用一個的參數來添加。全部能夠看出HandlerExecutionChain中只包含一個handler。包含N個攔截器。在把這個對象返回給了中央調度器。

 HandlerMapping總結:

DispatcherServlet

--->doDispatcher()

---->getHandler(request):

---->HandlerExecutionChain

------> hm.getHandler(request)-----》方法體中

----->ExecutionChain executionChain = getHandlerExecutionChain(handler, request);

----->new HandlerExecutionChain(handler)

----->chain.addInterceptor(interceptor);

HandlerMapping:處理器映射器
做用:根據【請求】找到【處理器Handler】,但並非簡單的返回處理器,而是
將處理器和攔截器封裝,造成一個處理器執行鏈(HandlerExecuteChain)。

4..DispatcherServlet 拿着執行鏈去尋找對應的處理器適配器(HandlerAdapter)
爲何要引入適配器?

由於處理器(Handler)有不少種,DispatcherServlet沒辦法統一管理,因此出現了適配器。讓適配器統一處理Handler,而DispatcherServlet統一處理適配器。根據請求去找對應的handler

 3.HandlerAdapto執行流程

1.0在DispatcherServlet中找到getHandlerAdapter()方法

 

2.0進入getHandlerAdapter()具體的方法實現內

3.0獲取ModelAndView:

4.0真正的執行者:

4.HashMap和LinkedHashMap

    HashMap底層是經過一個Entry<k,v> []  table,接下來單個entry數據類型:是HashMap靜態內部類。靜態內部類中有一個成員變量:Entry<k,v> next :經過該成員變量,其底層用的是單向鏈表,性能低。

 

    LinkedHashMap:底層也是一個Entry<k,v>數組,接下來單個Entry數據類型Entry<k,v>  before,after;(雙向鏈表)

5.AbstractController:

    若處理器繼承自AbstractController類,那麼該控制類就具備了一些新功能。由於AbstractController類還繼承自一個父類WebControllerGenerator, WebControllerGenerator具備supportMethods屬性,能夠設置支持的HTTP數據提交方式。默認支持GET/POST/HEAD

01.AbstractController限定請求提交方式

<!--處理器映射器  -->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="urlMap">
            <map>
                <entry key="/*.do" value="myPropertiesController"></entry>
            </map>
        </property>
    </bean>



   <!--AbstractController-->
    <bean id="abstractController" class="cn.happy.day02.MyAbstractController">
        <property name="supportedMethods" value="POST,GET"></property>
    </bean>

<!--控制器配置-->
<bean id="myPropertiesController" class="cn.happy.day02.MyMutilActionController">
</bean>

6.MultiActionController默認方法名稱解析器

    <!--處理器映射器  -->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="urlMap">
            <map>
                <entry key="/*.do" value="myPropertiesController"></entry>
            </map>
        </property>
    </bean>



<!--默認的方法名解析器-->
        <bean id="myMutilActionController" class="cn.happy.day02.MyMutilActionController"></bean> 


<!--控制器配置-->
      <bean id="myPropertiesController" class="cn.happy.day02.MyAbstractController">
      </bean>

7.PropertiesMethodNameResolveer屬性方法名稱解析器

  <!--處理器映射器  -->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="urlMap">
            <map>
                <entry key="/*.do" value="myPropertiesController"></entry>
            </map>
        </property>
    </bean>

 <!--屬性方法名稱解析器-->
    <bean id="propertiesMethodName" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
        <property name="mappings">
            <props>
                <prop key="/first.do">doFirst</prop>
                <prop key="/second.do">doSecond</prop>
            </props>
        </property>
    </bean>

<!--控制器配置-->
      <bean id="myPropertiesController" class="cn.happy.day02.MyMutilActionController">
          <property name="methodNameResolver" ref="propertiesMethodName"></property>
      </bean>
相關文章
相關標籤/搜索