4. 增强的MultiActionController实现
上面提到理想MultiActionController的构想,有三点需要实现。现在来讨论实现它们。
1. 把请求与具体方法之间的映射作为MultActionController自身的一个属性。也就是说MultiActionController提供一个“urlMethodMapping”的属性来保存请求路径与对应方法之间的映射关系。
我们知道MultiActionController有一个methodNameResolver的属性,而请求路径与方法之间的对应映射关系是由一个MethodNameResolver 的bean来保存的。我们一般可以配置一个PropertiesMethodNameResolver来作默认实现。把请求路径与方法之间的映射关系保存在PropertiesMethodNameResolver中的“mapping”属性中。
我们可以在MultiActionController中定义一个PropertiesMethodNameResolver类型的成员变量“propertiesMethodNameResoler”。和定义一个Properties类型的成员变量“urlMethodmappings”
在MultiActionController的bean进行配置的时候把urlMethodmappings的值作为propertiesMethodNameResoler的mapping的值。然后再调用MultiActionController的setMethodNameResolver()方法,把propertiesMethodNameResoler设置为MultiActionController的methodNameResolver的属性值。要做到这一些还应该实现InitializingBean接口
在afterPropertiesSet中,public class MultiMethodController extends MultiActionController implements
InitializingBean ...{
![]()
private Properties urlMethodmappings;
public void afterPropertiesSet() throws Exception ...{
if (urlMethodmappings != null && !urlMethodmappings.isEmpty()) ...{
![]()
PropertiesMethodNameResolver propertiesMethodNameResolver
= new PropertiesMethodNameResolver();
propertiesMethodNameResolver.setMappings(urlMethodmappings);
this.setMethodNameResolver(propertiesMethodNameResolver);
if (this.logger.isInfoEnabled()) ...{
this.logger.info("binding success...... ");
}
} else ...{
logger.info("no 'urlMethodmappings' set on MultiMethodController");
}
}
/**//**
* @return Returns the urlMethodmappings.
*/
public Properties getUrlMethodmappings() ...{
return urlMethodmappings;
}
![]()
/**//**
* @param urlMethodmappings
* The urlMethodmappings to set.
*/
public void setUrlMethodmappings(Properties urlMethodmappings) ...{
this.urlMethodmappings = urlMethodmappings;
}
}
PropertiesMethodNameResolver propertiesMethodNameResolver
= new PropertiesMethodNameResolver();
创建一个默认的PropertiesMethodNameResolver的实例
propertiesMethodNameResolver.setMappings(urlMethodmappings);
把urlMethodmappings作为propertiesMethodNameResolver的mapping属性值
this.setMethodNameResolver(propertiesMethodNameResolver);
调用父类方法,把propertiesMethodNameResolver注入MethodNameResolver属性中
注意,在这里我命名为MultiMethodController是为了与MultiActionController区别。
通过这样的代码,简化了原本复杂的配置。
