zoukankan      html  css  js  c++  java
  • spring mvc 之配置式开发一

    1.SimplUrlHandlerMapping

    01.在applicationContext.xml中配置:

    <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.定义控制器

    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中的配置还如上篇博客

    2.HandllerMapping执行流程

    请求过来先碰见中央调度器(前端调度器)

    对当前请求决定交给哪个handler, 当前请求地址过来

    处理器执行链处理请求,接着我们去找getHandler的实现

    hm是HandlerMapping对象,下图选定位置调用HandlerMapping的getHandler()方法通过请求找到Handler,但是返回值为HandlerExecutionChain(执行链)

    这个servlet所支持的处理器映射器的集合,这里有N个处理器映射器。hm就是指HandlerMapping ,下面的if中的代码是指记录日志,日志跟踪。HandlerMapping处理器映射器中有N个拦截器,处理客服端请求的处理器只有一个,就是handler处理器。

    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>
    

      

     

      

      

      

      

  • 相关阅读:
    BUCK/BOOST电路原理分析
    boost升压电路原理
    NPN/PNP和N沟道/P沟道负载的接法
    常用电源芯片记录
    LDO和BUCK降压稳压器对比
    some nets were not able to be matched
    Altium PCB布局时快速摆放元件的技巧
    树莓派+android things+实时音视频传输demo之遥控小车
    野狗产品与价格
    librtmp将本地FLV文件发布到RTMP流媒体服务器
  • 原文地址:https://www.cnblogs.com/cn-930621/p/7747715.html
Copyright © 2011-2022 走看看