在上一篇博客springMVC源码分析--AbstractControllerUrlHandlerMapping(六)中我们介绍到AbstractControllerUrlHandlerMapping定义了抽象方法buildUrlsForHandler,接下来我们看看在其子类ControllerClassNameHandlerMapping中的实现。

ControllerClassNameHandlerMapping中buildUrlsForHandler实现如下,根据beanClass来获取url

@Override
	protected String[] buildUrlsForHandler(String beanName, Class<?> beanClass) {
		return generatePathMappings(beanClass);
	}
	protected String[] generatePathMappings(Class<?> beanClass) {
		StringBuilder pathMapping = buildPathPrefix(beanClass);
		String className = ClassUtils.getShortName(beanClass);
		String path = (className.endsWith(CONTROLLER_SUFFIX) ?
				className.substring(0, className.lastIndexOf(CONTROLLER_SUFFIX)) : className);
		if (path.length() > 0) {
			if (this.caseSensitive) {
				pathMapping.append(path.substring(0, 1).toLowerCase()).append(path.substring(1));
			}
			else {
				pathMapping.append(path.toLowerCase());
			}
		}
		if (isMultiActionControllerType(beanClass)) {
			return new String[] {pathMapping.toString(), pathMapping.toString() + "/*"};
		}
		else {
			return new String[] {pathMapping.toString() + "*"};
		}
	}
	private StringBuilder buildPathPrefix(Class<?> beanClass) {
		StringBuilder pathMapping = new StringBuilder();
		if (this.pathPrefix != null) {
			pathMapping.append(this.pathPrefix);
			pathMapping.append("/");
		}
		else {
			pathMapping.append("/");
		}
		if (this.basePackage != null) {
			String packageName = ClassUtils.getPackageName(beanClass);
			if (packageName.startsWith(this.basePackage)) {
				String subPackage = packageName.substring(this.basePackage.length()).replace('.', '/');
				pathMapping.append(this.caseSensitive ? subPackage : subPackage.toLowerCase());
				pathMapping.append("/");
			}
		}
		return pathMapping;
	}

完整的ControllerClassNameHandlerMapping的源码实现如下:

public class ControllerClassNameHandlerMapping extends AbstractControllerUrlHandlerMapping {

	private static final String CONTROLLER_SUFFIX = "Controller";
	private boolean caseSensitive = false;
	private String pathPrefix;
	private String basePackage;
	public void setCaseSensitive(boolean caseSensitive) {
		this.caseSensitive = caseSensitive;
	}
	public void setPathPrefix(String prefixPath) {
		this.pathPrefix = prefixPath;
		if (StringUtils.hasLength(this.pathPrefix)) {
			if (!this.pathPrefix.startsWith("/")) {
				this.pathPrefix = "/" + this.pathPrefix;
			}
			if (this.pathPrefix.endsWith("/")) {
				this.pathPrefix = this.pathPrefix.substring(0, this.pathPrefix.length() - 1);
			}
		}
	}
	public void setBasePackage(String basePackage) {
		this.basePackage = basePackage;
		if (StringUtils.hasLength(this.basePackage) && !this.basePackage.endsWith(".")) {
			this.basePackage = this.basePackage + ".";
		}
	}
	@Override
	protected String[] buildUrlsForHandler(String beanName, Class<?> beanClass) {
		return generatePathMappings(beanClass);
	}
	protected String[] generatePathMappings(Class<?> beanClass) {
		StringBuilder pathMapping = buildPathPrefix(beanClass);
		String className = ClassUtils.getShortName(beanClass);
		String path = (className.endsWith(CONTROLLER_SUFFIX) ?
				className.substring(0, className.lastIndexOf(CONTROLLER_SUFFIX)) : className);
		if (path.length() > 0) {
			if (this.caseSensitive) {
				pathMapping.append(path.substring(0, 1).toLowerCase()).append(path.substring(1));
			}
			else {
				pathMapping.append(path.toLowerCase());
			}
		}
		if (isMultiActionControllerType(beanClass)) {
			return new String[] {pathMapping.toString(), pathMapping.toString() + "/*"};
		}
		else {
			return new String[] {pathMapping.toString() + "*"};
		}
	}
	private StringBuilder buildPathPrefix(Class<?> beanClass) {
		StringBuilder pathMapping = new StringBuilder();
		if (this.pathPrefix != null) {
			pathMapping.append(this.pathPrefix);
			pathMapping.append("/");
		}
		else {
			pathMapping.append("/");
		}
		if (this.basePackage != null) {
			String packageName = ClassUtils.getPackageName(beanClass);
			if (packageName.startsWith(this.basePackage)) {
				String subPackage = packageName.substring(this.basePackage.length()).replace('.', '/');
				pathMapping.append(this.caseSensitive ? subPackage : subPackage.toLowerCase());
				pathMapping.append("/");
			}
		}
		return pathMapping;
	}
}

最新文章

  1. Array.prototype.sort()对数组对象排序的方法
  2. quartz TRIGGER_STATE变为ERROR解决方法
  3. Java笔试题(一)
  4. easyui datagrid 学习
  5. MYSQL 日志文件路径错误 1067错误
  6. mongo查询某个字段是否存在,并删除记录里的这个字段
  7. 移动应用开发者最应该知道的8款SDK
  8. Linux中oops信息调试【转】
  9. Maven-05:插件目标
  10. [Swift]LeetCode349. 两个数组的交集 | Intersection of Two Arrays
  11. LabVIEW--好书推荐与分享
  12. 1.shell学习之常用语句
  13. Hibernate(十三)迫切内连接fetch
  14. SpringBoot初识
  15. 大数高精度计算库gmp简介
  16. post请求参数问题
  17. opencv3.2.0图像处理之中值滤波medianBlur API函数
  18. Windows系统环境变量之path环境变量(Java, Python环境变量配置)
  19. &lt;&lt;梦断代码&gt;&gt;读后感
  20. Hibernate(十四)缓存

热门文章

  1. &#183;c#之Thread实现暂停继续(转)
  2. react组件开发规范(一)
  3. codevs 3061 质子撞击炮②
  4. [HNOI 2011]数矩形
  5. [Codeforces 940E]Cashback
  6. [APIO 2012]派遣
  7. BZOJ 3938 Robot
  8. 搭积木(block)
  9. hdu 3247 AC自动+状压dp+bfs处理
  10. 【The Time Traveller&#39;s Wife】