技术开发 频道

Spring架构增强MultiActionController(上)



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接口

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; } }
    在afterPropertiesSet中,
    PropertiesMethodNameResolver propertiesMethodNameResolver
= new PropertiesMethodNameResolver();
    创建一个默认的PropertiesMethodNameResolver的实例
    propertiesMethodNameResolver.setMappings(urlMethodmappings);
    把urlMethodmappings作为propertiesMethodNameResolver的mapping属性值
   this.setMethodNameResolver(propertiesMethodNameResolver);
   调用父类方法,把propertiesMethodNameResolver注入MethodNameResolver属性中

    注意,在这里我命名为MultiMethodController是为了与MultiActionController区别。 
    通过这样的代码,简化了原本复杂的配置。
0
相关文章