Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 为什么需要ControllerClassNameHandlerMapping_Xml_Spring_Configuration_Controller - Fatal编程技术网

Xml 为什么需要ControllerClassNameHandlerMapping

Xml 为什么需要ControllerClassNameHandlerMapping,xml,spring,configuration,controller,Xml,Spring,Configuration,Controller,我原以为ControllerClassNameHandlerMapping是用于将url映射到控制器(在删除控制器部分之后),但我的示例似乎不是这样 如果我从导航控制器(见下文)中删除“/导航”映射,则会出现404个错误 <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" /> <bean name="navigationController"

我原以为ControllerClassNameHandlerMapping是用于将url映射到控制器(在删除控制器部分之后),但我的示例似乎不是这样

如果我从导航控制器(见下文)中删除“/导航”映射,则会出现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实际上在做什么吗


谢谢控制器ClassNameHandlerMapping正在映射:

/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;
    }

好的,谢谢你,这几乎是我想要的答案,有一件事我仍然不确定,但我认为我最初的问题不够清楚。所以,如果/navigation由ControllerClassNameHandlerMapping映射到NavigationController,这就是我实际上的想法。我不明白的是,为什么当我现在想映射到NavigationController中的方法时,仍然需要URL(例如)“/navigation/menu”而不是“/menu”,这是我本以为可以做到的。当我使用注释时,我用@RequestMapping为/navigation注释了类,然后每个方法都会有一个进一步的请求映射,如/menu。当我尝试使用menuHandler时,我得到一个404错误。因为NavigationController不知道它是如何映射的。它只是将URL(默认情况下从servlet路径)与使用MethodNameResolver的方法相匹配。您可以使用ant表达式或实现MethodNameResolverOk谢谢,我认为它的工作方式可能与NavigationController中的注释类型配置相同,NavigationController知道其映射到的路径,方法名称resolver也知道。谢谢你的解释。