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