spring 映射

当DispatcherServlet接收到web请求时,它只会将请求分发给适当的处理程序来处理请求。为DispatcherServlet定义一种策略,用来将请求映射到处理中。

在Spring MVC应用程序中,web请求被web应用程序上下文中声明的一个或多个处理程序映射Bean映射到处理程序上。这些Bean必须实现HandlerMapping接口,这样DispatcherServlet才能自动侦测它们。Spring MVC提供了几个HandlerMapping实现,让你可以利用不同的策略来映射请求。默认情况下,如果你没有显式地配置程序映射,DispatcherServlet将利用BeanNameUrlHandlerMapping作为它的默认处理程序映射,它根据Bean名称中指定URL模式将请求映射到处理程序上。因此,如果你觉得这一策略还好用,就不需要定义自己的处理程序映射了。

处理程序映射根据它们与上下文路径和Servlet路径的相对路径来匹配URL。因此,对于http://localhost:8080/court/welcome.htm这个URL而言,与之匹配的路径应该是/weblcome.htm,因为上下文路径是/court,没有Servlet路径。

1. 按Bean名称映射请求

要将请求映射到处理程序,最简单的策略是按照处理程序的Bean名称进行映射,这也是默认的策略。为了让这个策略生效,必须将每个处理程序的Bean名称声明成URL模式的形式,它可以接受通配符,供处理程序处理多个URL。如果处理程序的Bean名称与请求的URL相匹配,DispatcherServlet就会将请求分布给这个处理程序,让它处理请求。
xml文件

<beans...>  
    ...  
    <bean name="/welcome.htm" class="com.apress.springrecipes.court  
        .web.WelcomeController">  
        ...  
    </bean>  
    <bean name="/reservationQuery.htm" class="com.apress.springrecipes.court  
        .web.ReservationQueryController">  
        ...  
    </bean>  
</beans>  

在使用这个映射策略时,必须通过name属性设置处理程序的名称,因为id属性无法包含"/"符号。

2. 按控制器类名称映射请求

Spring提供的另一个处理程序映射是ControllerClassNameHandlerMapping,它为实现Controller接口的处理程序生成处理程序映射。它根据web应用程序上下文中声明的控制器的类名称,自动生成映射。
xml文件

<beans...>  
    ...  
    <bean class="org.springframework.web.servlet.mvc.support.  
        ControllerClassNameHandlerMapping"/>  
    <bean class="com.apress.springrecipes.court.web.WelcomeController">  
        ...  
    </bean>  
    <bean class="com.apress.springrecipes.court.web.ReservationQueryController">  
        ...  
    </bean>  
</beans>  

对于这些Bean配置,ControllerClassNameHandlerMapping会移除类名称中的Controller后缀,并将其他部分转换成小写字母,以此来自动生成处理程序映射。
Java代码

WelcomeController --> /welcome*  
ReservationQueryController --> /reservationquery*  

然而,如果想让你的URL模式遵循java的变量命名约定(如生成/reservationQuery而不是/reservationquery),必须将caseSensitive属性设置为true。此外,可以在pathPrefix属性中为生成的URL模式指定一个前缀。你还可以在basePackage属性中指定基包,然后在映射中就会包含相对于基包的子包。
Xml代码

<bean class="org.springframework.web.servlet.mvc.support.  
    ControllerClassNameHandlerMapping">  
    <property name="caseSensitive" value="true"/>  
    <property name="pathPrefix" value="/reservation"/>  
    <property name="basePackage" value="com.apress.springrecipes.court"/>  
</bean>  

这个ControllerClassNameHandlerMapping定义会生成下面的处理程序映射。
Java代码

WelcomeController --> /reservation/web/welcome*  
ReservationQueryController --> /reservation/web/reservationQuery*  

3. 用定制的映射定义来映射请求

将请求映射到处理程序的最直接且最灵活的策略,是显式地指定URL模式和处理程序之间的映射定义。你可以通过

SimpleUrlHandlerMapping来做到这一点。
xml文件

<beans...>  
    ...  
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
        <propery name="mappings">  
            <props>  
                <prop key="/welcom.htm">welcomeController</prop>  
                <prop key="/reservationQuery.htm">reservationQueryController</prop>  
            </props>  
        </property>  
    </bean>  
    <bean id="welcomeController" class="com.apress.springrecipes.court.web  
        .WelcomeController">  
        ...  
    </bean>  
    <bean id="reservationQueryController"   
        class="com.apress.springrecipes.court.web.ReservationQuerController">  
        ...  
    </bean>  
</beans>  

SimplerUrlHandlerMapping接受Properties对象形式的映射定义。属性键是URL模式,而属性值则是处理器ID或名称。URL模式也可以接受通配符,让处理程序能够处理多个URL。

4. 按多种策略映射请求

在带有大量处理程序的web应用程序中,只选择一种处理程序映射策略经常是不够用的。一般情况下,ControllerClassNameHandlerMapping可以满足大多数的映射。然而,有些映射必须利用SimpleUrlHandlerMapping显式地进行映射。在这种情况下,要结合这两种策略来处理映射。
xml文件

<beans...>  
    ...  
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
        <property name="mappings">  
            <props>  
                <prop key="/index.htm">welcomeController</prop>  
                <prop key="/main.htm">welcomeController</prop>  
            </props>  
        </property>  
        <property name="order" value="0"/>  
    </bean>  
    <bean class="org.springframework.web.servlet.mvc.support.  
        ControllerClassNameHandlerMapping">  
        <property name="caseSensitive" value="true"/>  
        <property name="order" vlaue="1"/>  
    </bean>  
</beans>  

当同时选择不止一种策略时,重要的是指定映射优先级。为此,可以设置处理程序映射Bean的order属性。order值越小,表示优先级越高。对于这两种处理程序映射,web请求映射是下面这样的。
Java代码

/index.html --> WelcomeController  
/amin.html --> WelcomeController  
/welcome* --> WelcomController  
/reservationQuery* --> ReservationQueryController  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC中,映射器(Handler Mapping)是用来将请求映射到相应的处理器(Handler)的组件。有几种常用的映射器可以选择使用。 一种常用的映射器是BeanNameUrlHandlerMapping。它根据配置的Bean名称来找到相应的处理器。使用BeanNameUrlHandlerMapping,你需要先配置好相应的Bean,并指定它们的名称。可以通过XML配置bean,也可以使用注解@Controller来指定名称,并通过<context:component-scan>来扫描获取Bean。然后,你可以配置BeanNameUrlHandlerMapping并指定要使用的Bean名称。例如: ``` <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" id="handlerMapping"> <property name="beanName" value="/hello"/> </bean> ``` 另一种常用的映射器是SimpleUrlHandlerMapping。它通过配置URL和对应的处理器的映射关系来处理请求。使用SimpleUrlHandlerMapping时,你可以直接指定URL和对应的处理器名称。例如: ``` <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" id="handlerMapping"> <property name="mappings"> <props> <prop key="/hello">myController</prop> <prop key="/hello2">myController2</prop> </props> </property> </bean> ``` 无论是使用哪种映射器,Spring MVC都会根据请求的URL来选择合适的处理器进行处理。这样就可以实现将请求映射到相应的处理器上,从而完成请求的处理过程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Springmvc处理器映射器](https://blog.csdn.net/qq_32015565/article/details/122516587)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [小白学习SpringMVC(映射器理解)](https://blog.csdn.net/hjs_75187712/article/details/119917598)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值