从DispatcherServlet到HandlerMapping

tomcat启动的时候DispatcherServlet加载默认资源DispatcherServlet.properties就会去加载默认的HandlerMapping,包括org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping和 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping及自定义HandlerMapping。先分析一下

BeanNameUrlHandlerMapping

先翻译注释的意思:

实现@link org.springframework.web.servlet.handlermapping的接口,该接口使用以斜线“/”开头的名称从URL映射到bean,类似于Struts如何将URL映射到操作名称。

这是@link org.springframework.web.servlet.DispatcherServlet 使用的默认实现,以及@link org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping(在Java 5和更高版本上)。或者,@link simpleurlhandlermapping允许以声明方式自定义处理程序映射。

映射是从URL到bean名称。因此,如果多个映射到单个处理程序,则传入的URL“/foo”将映射到名为“/foo”的处理程序,或者映射到“/foo/foo2”。注意:在XML定义中,需要在bean定义中使用别名name=“/foo”,因为XML ID可能不包含斜杠。

支持直接匹配(给定的“/test”->注册的“/test”)和“*”匹配(给定的“/test”->注册的“/t*”)。请注意,默认值是在当前servlet映射中进行映射(如果适用);有关详细信息,请参见@link setalwayssusefullpath“alwayssusefullpath”属性。有关模式选项的详细信息,请参见@link org.springframework.util.antpathmatcher javadoc。

理解一下,就是这是个实现org.springframework.web.servlet.handlermapping的类,这个类做了什么呢?就是把带“/”的url名称或别名映射到对应的bean,就像下面一样:

<bean name="/admin" class="com.squid.admin/AdminController"/>

RequestMappingHandlerMapping

先翻译注释的意思:

实现org.springframework.web.servlet.handlermapping接口,该接口基于通过类或方法级别的@requestmapping注释表示的HTTP路径映射处理程序。

默认情况下,org.springframework.web.servlet.DispatcherServlet 在Java 5 +上的版本注册RequestMappingHandlerMapping。如果在DispatcherServlet上下文中定义自定义handlerMapping bean,则需要显式添加一个defaultAnnotationhandlerMapping bean,因为自定义handlerMapping bean替换了默认的映射策略。

定义DefaultAnnotationHandlerMapping还允许注册自定义拦截器:带注释的控制器通常在类型级别用@link controller构造型标记。

在类级别应用@requestmapping时,这不是严格必要的(因为此类处理程序通常实现@org.springframework.web.servlet.mvc.controller接口)。但是,如果类型级别不存在@requestmapping,则在方法级别检测@requestmapping注解需要@controller。

方法级映射只允许缩小在类级(如果有)表示的映射。HTTP路径需要唯一地映射到特定的处理程序bean上,任何给定的HTTP路径只允许映射到一个特定的处理程序bean上(而不是跨多个处理程序bean分布)。强烈建议将相关的处理程序方法共同定位到同一个bean中。

@annotationmethodhandleradapter负责处理由该handlerMapping映射的带注释的处理程序方法。对于类型级别的@requestmapping,应用特定的handlerAdapters,如@org.springframework.web.servlet.mvc.simpleControllerhandlerAdapter。

那就是通过类或方法级别的@requestmapping注解,处理url到程序映射关系。

如下:

@Controller
@RequestMapping("/admin")
public class InviteGradeController {
    @RequestMapping(value = "ok")
    public String ok() {
        return "ok";
    }
}

BeanNameUrlHandlerMappingRequestMappingHandlerMapping就是两种不同的url映射处理方式。

猜你喜欢

转载自blog.csdn.net/qq_26400953/article/details/86629614