ITEEDU

Handler Mapping

当客户的请求来到时,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 来处理。