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>
相关文章
相关标签/搜索