Spring MVC 之 HandlerMapping

HanderMapping的作用 

HandlerMapping类定义了request与handler之间映射关系。查找request对应的handler是SpringMVC DispatcherServlet处理request的第一步。通过分析request的url和消息头headers查找对应的handler对象handlerExecutionChain ,然后DispatcherServlet会执行handlerExecutionChain 中包含的处理器方法handler method和一系列前置和后置的方法拦截器handler Interceptor。

public interface HandlerMapping {
      HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
}

HandlerMapping的子类

  • RequestMappingHandlerMapping

RequestMappingHandlerMapping-根据@Controller注解的类中的类级别和方法级别的@RequestMapping注解来创建定义了request和handler method之间映射关系的RequestMappingInfo实例。基本用法如下:

@Controller
public class WelcomeController 
{
    @RequestMapping("/welcome")
    protected ModelAndView someMethod() throws Exception {
        System.out.println("Inside WelcomeController");

        ModelAndView model = new ModelAndView("welcome");
        model.addObject("message", "JavaInterviewPoint");

        return model;
    }

}
  • BeanNameUrlHandlerMapping

BeanNameUrlHandlerMapping-从URL到以斜杠/开头的bean名称的映射的HandlerMapping接口的实现类,与Struts中URL映射到action名称的方式类似。其特点是,每次只能注册一个url与bean的映射关系,如果将多个url映射到一个bean上,需要多次注册。基本用法如下:

//用法1,直接在@Controller注解上定义别名,注册映射/welcome->WelcomeController
@Controller("/welcome")
public class WelcomeController  extends AbstractController
{
    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest request,
                                                 HttpServletResponse response) throws Exception {
       
        ModelAndView model = new ModelAndView("welcome");
        model.addObject("message", "JavaInterviewPoint");

        return model;
    }
}
//用法2,在@Configuration注解类中定义指定别名的Bean,注册映射/welcome1、/welcome2->WelcomeController
@Configuration
public class BeanNameUrlHandlerMappingConfig {
    @Bean
    BeanNameUrlHandlerMapping beanNameUrlHandlerMapping() {
        return new BeanNameUrlHandlerMapping();
    }
 
    @Bean({"/welcome1","/welcome2"})
    public WelcomeController welcome() {
        return new WelcomeController();
    }
}
  • SimpleUrlHandlerMapping

SimpleUrlHandlerMapping-从URL到request处理程序bean的映射的HandlerMapping接口的实现类。支持映射到bean实例以及映射到bean名称。

SimpleUrlHandlerMapping与BeanNameUrlHandlerMapping类似,都是基于url和bean映射关系,但是SimpleUrlHandlerMapping更灵活。其setUrlMap方法支持一次注册多个Url映射关系。

//注册映射/welcome1、/welcome2->WelcomeController
@Configuration
public class UrlHandlerMappingConfig {
 @Bean
    SimpleUrlHandlerMapping simpleUrlHandlerMapping() {
        Map<String, Object> urlMap = new LinkedHashMap<String, Object>();
        urlMap.put("welcome1","welcomeController");
        urlMap.put("welcome2","welcomeController");
        SimpleUrlHandlerMapping handlerMapping=new SimpleUrlHandlerMapping();
        handlerMapping.setUrlMap(urlMap);
        return handlerMapping;
    }

    @Bean WelcomeController welcomeController(){
        return new WelcomeController();
    }
 
     
}

猜你喜欢

转载自my.oschina.net/yqz/blog/1623703