Xml 为什么需要ControllerClassNameHandlerMapping
我原以为ControllerClassNameHandlerMapping是用于将url映射到控制器(在删除控制器部分之后),但我的示例似乎不是这样 如果我从导航控制器(见下文)中删除“/导航”映射,则会出现404个错误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"
<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也知道。谢谢你的解释。