一个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匹配原则中的任何名字。
Listing A Controller Mapped by a Bean Name
<bean class="com.apress.expertspringmvc.flight.web.HomeController" name="/home"></bean>
<property name="flightService" ref="flightService"></property>
■注意:你不能使用id这个属性来指定任何的URL路径,因为在XML规格定中禁止(/)字符来指定XML的id,不过你可以在一个Bean定义中同时拥有id和name属性
BeanNameUrlHandlerMapping 的缺点
它非常便于使用的同时,也拥有一些缺点。它不能影射一个Prototype的Bean.换句话说,当使用BeanNameUrlHandlerMapping时,所有的请求处理类只能是单例的(singletons) . 一般来说,Controllers 都是按照单例建立的,所以这个并不是一个很严重的问题.还有,我会在后面的章节中介绍Controller,只会有很少类型的Controller需要是prototypes.
■注释: Prototype bean 是一种非单例(non-singleton)的bean. 任何一次调用ApplicationContext的getBean()方法时都会返回一个新的Bean实例更多的信息请参照
<
<pro spring=""></pro>
>.
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接口.
Listing SimpleUrlHandlerMapping Example
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"></bean>
<property name="urlMap">
<entry value-ref="homeController" key="/home"></entry>
</property>
<bean class="com.apress.expertspringmvc.flight.web.HomeController" id="homeController"></bean>
<property name="flightService" ref="flightService"></property>
不幸的是,映射不同的URL到相同的请求处理器是要稍微麻烦一点的:),你必须要建立两个映射才可以。
分享到:
相关推荐
在本篇博客“SpringMVC源码总结(一)HandlerMapping和HandlerAdapter入门”中,我们将探讨Spring MVC框架的核心组件——HandlerMapping和HandlerAdapter。这两个组件是Spring MVC处理请求的关键,它们负责映射HTTP...
org.apache.cxf.spring.remoting.Jsr181HandlerMapping.jar
### Spring MVC核心组件之HandlerMapping详解 #### 一、引言 在Java Web开发领域,Spring MVC框架因其灵活且强大的特性而备受青睐。它提供了一种简洁的方式来构建可维护、可扩展的应用程序。Spring MVC的核心组件之...
HandlerMapping HandlerAdapter View ViewResolver类图 矢量图文件 https://blog.csdn.net/qq_39609993/article/details/105435850
在Spring MVC框架中,HandlerMapping是一个至关重要的组件,它的职责是将HTTP请求映射到相应的处理器(Handler)。在源码解读中,我们关注的是AbstractDetectingUrlHandlerMapping,这是一个抽象类,它通过扫描应用...
本文将深入探讨`HandlerMapping`的工作原理及其在Spring MVC中的作用。 首先,`HandlerMapping`是一个接口,它定义了一个关键方法`getHandler(HttpServletRequest request)`,该方法负责根据请求获取对应的`...
2. 实现HandlerMapping接口,将请求映射到对应的处理器。 3. 实现HandlerAdapter接口,处理控制器方法的调用。 4. 配置异常处理和拦截器机制。 5. 自定义视图解析逻辑。 总结,通过深入理解MVC模式和Spring MVC的...
AbstractUrlHandlerMapping是HandlerMapping的一个抽象实现,它处理基于URL的请求分发。本文将深入探讨AbstractUrlHandlerMapping如何进行request分发,并介绍其核心功能。 首先,我们关注`getHandler`方法,这是...
Spring MVC默认提供了一些内置的HandlerMapping实现,如BeanNameUrlHandlerMapping、SimpleUrlHandlerMapping等。但是,在实际项目中,我们可能需要根据特定需求定制自己的映射规则。通过扩展HandlerMapping接口,...
3. 配置SpringMVC:创建SpringMVC的配置文件,如servlet-context.xml,配置DispatcherServlet、ViewResolver、HandlerMapping等。 4. 配置Mybatis:创建mybatis的全局配置文件,mybatis-config.xml,配置数据源、...
HandlerMapping可以通过配置文件或注解方式进行配置,例如使用"@RequestMapping"注解标注请求映射。 ViewResolver简介 ViewResolver是SpringMVC框架中的视图解析组件,负责将逻辑视图名解析为具体的视图实现。...
HandlerMapping是SpringMVC中的一个重要组件,它负责将用户的请求映射为HandlerExecutionChain对象,包含一个Handler解决器对象和多个HandlerInterceptor拦截器对象。HandlerMapping使用策略模式,使得添加新的映射...
如果配置为false(第13行之后的代码),则只会尝试获取名为`HANDLER_MAPPING_BEAN_NAME`的特定bean,如果没有找到,将忽略异常并稍后添加默认的HandlerMapping。 在Spring MVC中,HandlerMapping的作用是将HTTP请求...
当请求到达服务器,`DispatcherServlet`作为标准Servlet接收请求,并根据`HandlerMapping`接口来确定合适的处理器。 `HandlerMapping`接口位于`org.springframework.web.servlet`包中,它是SpringMVC中定义的核心...
本文将从核心组件、请求处理流程、DispatcherServlet、HandlerMapping、ModelAndView、视图解析等多个方面,详细阐述SpringMVC的源码分析。 1. **核心组件** SpringMVC的核心组件包括DispatcherServlet、...
首先,Spring MVC中的主要组件包括DispatcherServlet、HandlerMapping、Controller、HandlerInterceptor、ViewResolver等。 DispatcherServlet是Spring MVC框架的前端控制器,负责接收HTTP请求并将其分发给合适的...
Spring MVC的核心组件包括DispatcherServlet、HandlerMapping、Controller、ModelAndView以及一系列辅助组件。DispatcherServlet作为前端控制器,它是所有请求的入口点,负责接收HTTP请求,并将请求转发给适当的处理...
本文主要对 Spring MVC 框架的第二天课堂笔记进行了总结,涵盖了 DispatcherServlet、HandlerMapping、HandlerAdapter、Handler、ViewResolver 等核心组件的作用和使用方式,以及注解开发方式的应用。 一、...
- 清晰的角色分配,如DispatcherServlet、HandlerMapping、HandlerAdapter、ViewResolver等,提高可读性和可维护性。 - 支持灵活的请求资源映射策略。 3. Spring MVC核心组件: - DispatcherServlet:前端控制器,...
SpringMVC的工作原理是基于一系列组件的协作,这些组件包括DispatcherServlet、HandlerMapping、Controller、ModelAndView和ViewResolver。 首先,客户端发起HTTP请求,这个请求会到达DispatcherServlet,这是...