zoukankan      html  css  js  c++  java
  • SpringMVC的HandlerMapping(处理器映射器)

    SpringMvc有四种HandlerMapping:BeanNameUrlHandlerMapping ,SimpleUrlHandlerMapping,ControllerClassNameHandlerMapping ,DefaultAnnotationHandlerMapping。

    1. BeanNameUrlHandlerMapping  (默认)根据controller的name名称来映射寻找controller,开启该映射:默认是开启的

    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
    <bean id="helloController" name="/hello1.do" class="com.controller.HelloController"></bean>
    http://localhost:5080/springmvc/hello1.do

    2.SimpleUrlHandlerMapping  根据URL来映射寻找controller, 开启该映射:

    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    
    <property name="mappings">
    <props>
    <prop key="/hello2.do">HelloController</prop>
    </props>
    </property>
    </bean>
    http://localhost:5080/springmvc/hello2.do

    3.ControllerClassNameHandlerMapping 根据controller的类名来映射寻找controller:

    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean>

     4. DefaultAnnotationHandlerMapping 使用注解来映射寻找controller

    <!--开启springMVC注解  -->
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />  
    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"></bean>  

    使用java代码配置的方式:

         /**
         *   将请求(/hessianremote.hessianservice)映射到hessianExporterService服务上
         * @return
         */
        @Bean
        public HandlerMapping hessianMapping() {
            SimpleUrlHandlerMapping mapping=new SimpleUrlHandlerMapping();
            Properties maProperties=new Properties();
            maProperties.setProperty("/xx/hessianremote.hessianservice", "hessianExporterService");
            mapping.setMappings(maProperties);
            return mapping;
        }
    
        /**
         * BeanNameUrlHandlerMapping 会自动探测 '/' 开头的bean当做是一个handler,
         * 但默认是只探测当前context里的bean,不会探测ancestor contexts(父容器),
         * 如果要探测父容器,那么设置detectHandlersInAncestorContexts为true
         * @return
         */
        @Bean
        public HandlerMapping beanNameUrlHandlerMapping() {
            return new  BeanNameUrlHandlerMapping();
        }
    
        /**
         * 注册通过扫描注解controller的处理器映射器
         * 默认情况下springmvc会自动注册BeanNameUrlHandlerMapping和DefaultAnnotationHandlerMapping这两个处理器,
         * 但是当上面手动配置了SimpleUrlHandlerMapping处理器映射器以后,就默认只有这一个处理器,因此,当你还需要
         * springmvc自动解析对controller类上方法的http映射,就需要手动配置该映射器处理器。
         * SpringMVC默认注册处理器映射器,可参考源码:DispatcherServlet 的 initHandlerMappings方法
         * @return
         */
        @Bean
        public HandlerMapping defaultAnnotationHandlerMapping() {
            return new DefaultAnnotationHandlerMapping();
        }

    注意:一旦在SpringMVC 中,如同上面手动配置了HandlerMapping,最好把DefaultAnnotationHandlerMappin,BeanNameUrlHandlerMapping这两个都配置上,否则SpringMvc将不能解析http请求到Controller上。因为SpringMVC默认是会在HandlerMapping为空情况下自动注册这两个HandlerMapping,但是当你手动注册过任意HandlerMapping后,就不会再注册这两个HandlerMapping。

    以上可以参考DispatcherServlet 的 initHandlerMappings方法:

     1 private void initHandlerMappings(ApplicationContext context) {
     2         this.handlerMappings = null;
     3 
     4         if (this.detectAllHandlerMappings) {
     5             // Find all HandlerMappings in the ApplicationContext, including ancestor contexts.
     6             Map<String, HandlerMapping> matchingBeans =
     7                     BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerMapping.class, true, false);
     8             if (!matchingBeans.isEmpty()) {
     9                 this.handlerMappings = new ArrayList<HandlerMapping>(matchingBeans.values());
    10                 // We keep HandlerMappings in sorted order.
    11                 AnnotationAwareOrderComparator.sort(this.handlerMappings);
    12             }
    13         }
    14         else {
    15             try {
    16                 HandlerMapping hm = context.getBean(HANDLER_MAPPING_BEAN_NAME, HandlerMapping.class);
    17                 this.handlerMappings = Collections.singletonList(hm);
    18             }
    19             catch (NoSuchBeanDefinitionException ex) {
    20                 // Ignore, we'll add a default HandlerMapping later.
    21             }
    22         }
    23 
    24         // Ensure we have at least one HandlerMapping, by registering
    25         // a default HandlerMapping if no other mappings are found.
    26         if (this.handlerMappings == null) {
    27             this.handlerMappings = getDefaultStrategies(context, HandlerMapping.class);
    28             if (logger.isDebugEnabled()) {
    29                 logger.debug("No HandlerMappings found in servlet '" + getServletName() + "': using default");
    30             }
    31         }
    32     }

    可以看到26行,就是当没有手动配置HandlerMapping时,会自动添加默认的HandlerMapping。

  • 相关阅读:
    php jquery pjax示例源码 (ajax请求,并改变url)
    mysql 中查看指定表的字段名 (可根据字段变量生成c#后台代码)
    原生js Ajax
    ajax basic 认证
    Json序列化问题
    MSSQL 日期操作函数 总结
    用sql语句按周、按月、按季、按年统
    mssql中得到当天数据的语句
    SP_CreateInsertScript 将表内的数据全部拼接成INSERT字符串输出
    MSSQL 获取指定日期所在星期的第一天和最后一天日期 获取指定日期坐在月的第一天和最后一天
  • 原文地址:https://www.cnblogs.com/xuzimian/p/10277527.html
Copyright © 2011-2022 走看看