对于访问方式的配置就是,一个url路径和一个函数配对,你访问这个url,就会直接调用这个函数,简单明了。对于java的面向对象来说,就要分两步走。第一步首先要找到是哪个对象,即handler,本工程的handler则是HomeAction对象。第二步要找到访问的函数,即HomeAction的handleRequest方法。所以就出现了两个源码接口 HandlerMapping和HandlerAdapter,前者负责第一步,后者负责第二步。
HandlerMapping接口的实现 :
- BeanNameUrlHandlerMapping :通过对比url和bean的name找到对应的对象
- SimpleUrlHandlerMapping :也是直接配置url和对应bean,比BeanNameUrlHandlerMapping功能更多
- DefaultAnnotationHandlerMapping : 主要是针对注解配置@RequestMapping的,已过时
- RequestMappingHandlerMapping :取代了上面一个
- ControllerClassNameHandlerMapping:比较少用
HandlerAdapter 接口实现:
- HttpRequestHandlerAdapter : 要求handler实现HttpRequestHandler接口,该接口的方法为 void handleRequest(HttpServletRequest request, HttpServletResponse response)也就是 handler必须有一个handleRequest方法
- SimpleControllerHandlerAdapter:要求handler实现Controller接口,该接口的方法为ModelAndView
- AnnotationMethodHandlerAdapter :和上面的DefaultAnnotationHandlerMapping配对使用的,也已过时
- RequestMappingHandlerAdapter : 和上面的RequestMappingHandlerMapping配对使用,针对@RequestMapping
先简单的说下Hello案例工程的流程,访问http://localhost:8080/Hello/hello.do首先由DispatcherServlet进行转发,通过BeanNameUrlHandlerMapping(含有 /hello.do->Hello的配置),找到了Hello,然后再拿Hello和每个adapter进行适配,由于Hello实现了Controller接口,所以最终会有SimpleControllerHandlerAdapter来完成对Hello的handleRequest方法的调度。然后就顺利的执行了我们想要的方法。