Wildcard | Description | |
? | 匹配任何单字符 | |
* | 匹配0或者任意数量的字符 | |
** | 匹配0或者更多的目录 |
Table Example Ant-Style Path Patternshtml
Path | Description | |
/app/*.x | 匹配(Matches)全部在app路径下的.x文件 | |
/app/p?ttern | 匹配(Matches) /app/pattern 和 /app/pXttern,可是不包括/app/pttern | |
/**/example | 匹配(Matches) /app/example, /app/foo/example, 和 /example | |
/app/**/dir/file. | 匹配(Matches) /app/dir/file.jsp, /app/foo/dir/file.html,/app/foo/bar/dir/file.pdf, 和 /app/dir/file.java | |
/**/*.jsp | 匹配(Matches)任何的.jsp 文件 |
HandlerMappingjava
一 个WEB应用程序基本上都要依赖于URL与请求处理器之间的映射,spring MVC也是同样,但Spring MVC就像Spring所做的一切同样(译者:灵活,能够配置各类东西,可是也形成了不少复杂性),确定不会只有一种方法来映射URL和 Controller之间的关系,而且在实际上,容许你本身建立映射规则和实现,而不单单依赖URL映射。
Spring提供了URL的映射处理, 而且处理路径模式的顺序和方法并无限定到任何的接口上。Spring MVC的默认实现org.springframework.web.servlet.handler. AbstractUrlHandlerMapping, 会以最长符合路径模式来匹配一个路径。
例如:给定一个请求是 /app/dir/file.jsp 而且如今存在两个路径匹配模式/**/*.jsp 和/app/dir/*.jsp, 那么,URL会匹配那个模式呢?最后的那个模式/app/dir/*.jsp,会由于最长(has more characters)的原则被匹配,它比/**/*.jsp拥有更多的字符.注意的是,这个原则并无在任何高级别的接口中指定,但倒是一种实现细节。
!!下面看一下默认的两个HandlerMapping
BeanNameUrlHandlerMapping
默 认的映射策略实现是org.springframework.web. servlet.handler.BeanNameUrlHandlerMapping类. 这个类要求任何有可能处理请求的Bean都要起一个以反斜杠(/)字符开头的名称或者别名,这个名称或者别名能够是符合URL Path匹配原则中的任何名字。web
Listing A Controller Mapped by a Bean Name算法
■注意:你不能使用id这个属性来指定任何的URL路径,由于在XML规格定中禁止(/)字符来指定XML的id,不过你能够在一个Bean定义中同时拥有id和name属性
BeanNameUrlHandlerMapping 的缺点
它 很是便于使用的同时,也拥有一些缺点。它不能影射一个Prototype的Bean.换句话说,当使用 BeanNameUrlHandlerMapping时, 全部的请求处理类只能是单例的(singletons) . 通常来讲,Controllers 都是按照单例创建的,因此这个并非一个很严重的问题.还有,我会在后面的章节中介绍Controller,只会有不多类型的Controller须要是 prototypes.spring
■注释: Prototype bean 是一种非单例(non-singleton)的bean. 任何一次调用ApplicationContext的getBean()方法时都会返回一个新的Bean实例.数据结构
BeanNameUrlHandlerMapping的另一个问题存在于在你的应用程序中 应用拦截(interceptor). 由于请求的映射(handler mapping )和Bean(beans imapping)的映射给绑定在一块儿了,没有分开,这样就不可能在Controller和拦截之间建立复杂的关系。若是有复杂的请求映射需求,你能够用 SimpleUrlHandlerMapping 来代替BeanNameUrlHandlerMapping. SimpleUrlHandlerMapping做为BeanNameUrlHandlerMapping的另一种选择, SimpleUrlHandlerMapping直指BeanNameUrlHandlerMapping的两大软肋.它能够映射 prototype类型的请求处理器,而且它容许你为处理器(handlers)和拦截器(interceptors)之间建立复杂灵活的映射路径的映射算法与BeanNameUrlHandlerMapping是 使用相同的基础组件,因此这个模式依然是映射URL到请求处理器的(request handler) ,你简单的在ApplicationContext中声明一下,就可使用SimpleUrlHandlerMapping了. DispatcherServlet会根据类型找到的,而且不会建立默认的映射器了(BeanNameUrlHandlerMapping).意思就是, 若是你想两个都用,那么就要所有声明一下在ApplicationContext里.
■提示 DispatcherServlet会链式处理请求的(译者:依次处理请求,能够参照过滤器和GOF中的责任链模式),这样容许按照你的要求处理映射,映射处理器(Handler mappings )实现了Orderedr接口.mvc