1

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

如果我从导航控制器中删除“/navigation”映射(见下文),则会收到 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 映射到控制器,那么我可以不传递 /menu,否则 ControllerClassNameHandlerMapping 的意义何在?

我尝试删除 ControllerClassNameHandlerMapping 但它是必需的。

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

谢谢

4

1 回答 1

2

ControllerClassNameHandlerMapping映射:

/navigation/* -> NavigationController.

如果您删除它,NavigationController 将永远不会执行,并且会失去将 url 映射到方法的任何机会。

工作流程是:

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

编辑

例如,如果您想将“菜单”直接映射到 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;
    }
于 2013-05-09T21:29:51.013 回答