HandlerMapping


當客戶的請求來到時,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來處理。