当客户的请求来到时,DispatcherServlet 根据一个 Handler mapping 的实例了解到,如何将请 求转发至对应的 Controller,对于 Web 应用程式来说,通常就是以 URL 路径对应至 Controller。
DispatcherServlet 预设的 Handler mapping 是 org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,所以即使您在 Bean 定义档中没有明确的宣告 BeanNameUrlHandlerMapping,也会使用 BeanNameUrlHandlerMapping 依每 个 Bean 定义的 "name"属性上之 URL 来决定该使用哪一个 Controller,例如:
... <bean id="viewResolver" class="org.springframework.web.servlet. →?view.InternalResourceViewResolver "> <property name="prefix"> <value>/WEB-INF/jsp/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> ... <bean name="/hello.do" class="onlyfun.caterpillar.HelloController"> <property name="viewPage"> <value>hello</value> </property> </bean>
在上面的设定中,使用者对/hello.do 路径的请求,DispatchServlet 都会交由 HelloController 的实例来处理。
BeanNameUrlHandlerMapping 是个简单的 Handler mapping,方便但仅适用于小型的应用程式, 因为这让您的 URL 与 Controller 的类别名称直接建立关系,在 Spring 的 Handler mapping 中最 常使用的是 org.springframework.web.servlet.handler.SimpleUrlHandlerMapping,一个使用 的例子如 下所示:
... <bean id="urlHandlerMapping" class="org.springframework.web.servlet. →?handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/hello.do"> helloController </prop> <prop key="/welcome.do"> welcomeController </prop> </props> </property> </bean> <bean id="viewResolver" class="org.springframework.web.servlet. →?view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/jsp/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> <bean id="helloController" class="onlyfun.caterpillar.HelloController"> <property name="viewPage"> <value>hello</value> </property> </bean> <bean id="welcomeController" class="onlyfun.caterpillar.WelcomeController"> ... </bean> ...
在"mappings"属性的设置中,<prop>的"key"设置的是请求的 URL,而<prop>与< /prop>间设定 的值是实际上要处理请求的 Controller 之 Bean 名称,<prop>的"key"设置还可以使用 Wildcard, 例如:
... <bean id="urlHandlerMapping" class="org.springframework.web.servlet. →?handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/hello*.do"> helloController </prop> <prop key="/welcome.do"> welcomeController </prop> </props> </property> </bean> ....
在上面的设置中,以 hello 开头及.do 结尾的 URL 请求,都会交给 Bean 定义档中的 helloController 来处理。