为什么需要ControllerClassNameHandlerMapping

时间:2013-05-09 16:19:16

标签: xml spring configuration controller

我认为ControllerClassNameHandlerMapping用于将url映射到控制器(在删除Controller部分之后),但这似乎与我的示例不同。

如果我删除" /导航"从导航控制器映射(见下文)然后我得到404错误。

<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />

<bean name="navigationController" class="com.mvc.controller.NavigationController">
    <property name="methodNameResolver">
        <bean class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
            <property name="mappings">
                <props>
                   <prop key="/navigation/menu">menuHandler</prop>
                </props>
           </property>
        </bean>
    </property>
</bean>

在上面的代码片段中,我需要将属性键作为/ navigation / menu传递,但我想如果/ navigation被映射到控制器,那么我可以通过传递/菜单逃脱,否则ControllerClassNameHandlerMapping的意义何在?

我尝试删除ControllerClassNameHandlerMapping但需要它。

有人可以解释一下ControllerClassNameHandlerMapping实际上在做什么吗?

由于

1 个答案:

答案 0 :(得分:2)

ControllerClassNameHandlerMapping正在映射:

/navigation/* -> NavigationController.

如果你删除它,导航控制器永远不会被执行,并且丢失了将网址映射到方法的任何机会。

工作流程为:

 DispatcherServlet -> ControllerClassNameHandlerMapping 
 -> NavigationController -> MethodNameResolver -> method

修改

例如,如果要将“menu”直接映射到menuHandler方法,可以使用以下MethodNameResolver

public class LastPathNameMethodResolver extends AbstractUrlMethodNameResolver {

    private Properties mappings;

    @Override
    protected String getHandlerMethodNameForUrlPath(String urlPath) {
        return mappings.getProperty(StringUtils.substringAfterLast(urlPath, "/"));
    }

    public Properties getMappings() {
        return mappings;
    }

    public void setMappings(Properties mappings) {
        this.mappings = mappings;
    }