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();
}
}