Spring MVC处理器映射器(HandlerMapping)详解

不同的处理器映射器对URL处理的方式也不相同。

Spring MVC提供的处理器映射器:

  • BeanNameUrlHandlerMapping

    此时无需使用注解@RequestMapping("/student"),控制器的URL路径就是控制器类的name值。

    public class BeanNameUrlHandlerMapping extends AbstractDetectingUrlHandlerMapping {
        // 父类除外,类中无成员变量,构造方法也只有无参构造方法。
        // ......
    }
    

    配置方式是只需在Spring MVC的配置文件中通过bean标签声明处理器映射器即可。

    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
    

    使用如下:

    • spring-servlet.xml

      <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
      <!--注意:name属性值需以"/"开始-->
      <bean name="/student" class="controller.StudentController" />
      
    • StudentController.java

      package controller;
      
      import jakarta.servlet.http.HttpServletRequest;
      import jakarta.servlet.http.HttpServletResponse;
      // import org.springframework.stereotype.Controller;
      // 注意导入的Controller接口的来源,别导错了包(如上所示,此为使用@Controller注解需导入的包。如下才是使用Controller接口需导入的包)。
      import org.springframework.web.servlet.mvc.Controller;
      import org.springframework.web.servlet.ModelAndView;
      
      // 需要实现Controller接口。
      public class StudentController implements Controller {
          @Override
          public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
              return new ModelAndView("/tips.jsp");
          }
      }
      
    • 运行结果

      在这里插入图片描述

    根据spring-webmvc-6.0.11.jar\org\springframework\web\servlet\DispatcherServlet.properties文件可知,BeanNameUrlHandlerMapping为默认的处理器映射器。

    # Default implementation classes for DispatcherServlet's strategy interfaces.
    # Used as fallback when no matching beans are found in the DispatcherServlet context.
    # Not meant to be customized by application developers.
    
    org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
    
    org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver
    
    org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
    	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping,\
    	org.springframework.web.servlet.function.support.RouterFunctionMapping
    
    org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
    	org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
    	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter,\
    	org.springframework.web.servlet.function.support.HandlerFunctionAdapter
    
    
    org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver,\
    	org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
    	org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
    
    org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator
    
    org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
    
    org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
    
  • SimpleUrlHandlerMapping

    public class SimpleUrlHandlerMapping extends AbstractUrlHandlerMapping {
        private final Map<String, Object> urlMap = new LinkedHashMap();
    
        // ......
    
        public void setMappings(Properties mappings) {
            CollectionUtils.mergePropertiesIntoMap(mappings, this.urlMap);
        }
    
        public void setUrlMap(Map<String, ?> urlMap) {
            this.urlMap.putAll(urlMap);
        }
    
        // ......
    }
    

    BeanNameUrlHandlerMapping不同的是,SimpleUrlHandlerMapping处理器解析器解析的URL路径与控制器的idname无关,即控制器类的路径可自行随意设置,与其idname属性无关。

    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <!--
            通过上述类中的setMappings(Properties mappings)方法可知,
            我们可通过Properties方式来为类中成员变量urlMap赋值。
        -->
        <property name="mappings">
            <props>
                <!--key为控制器类的路径值,value为控制器类的id值。-->
                <prop key="/student">studentController</prop>
            </props>
        </property>
    </bean>
    
    <bean id="studentController" class="controller.StudentController" />
    

    控制器类的实现与上述StudentController.java一致。

在Spring中,Controller注解(@Controller)用于指示Spring类的实例是一个控制器,相对于实现Controller接口变得更加简单。实现Controller接口只能处理一个单一的请求,而使用@Controller注解可以支持同时处理多个请求动作,更加灵活。@Controller用于标记一个类,使用他标记的类就是一个SpringMVC Controller对象,即一个控制器类,Spring使用扫描机制查找应用程序中所有基于注解的控制器类。分发处理器会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping注解,使用了@RequestMapping注解的方法才是真正处理请求的处理器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值