springmvc之RequestToViewNameTranslator
一. 概述
RequestToViewNameTranslator可以在处理器返回的view为空时使用它根据request获取viewName。这个组件的实现非常简单,只有一个实现类DefaultRequestToViewNameTranslator
这个组件不是很常用,这里简单分析下
二. 源码分析
2.1 在DispatchServlet中的体现
在DispatchServlet中,如下的方法使用到了这个组件
applyDefaultViewName(processedRequest, mv);
private void applyDefaultViewName(HttpServletRequest request, @Nullable ModelAndView mv) throws Exception {
if (mv != null && !mv.hasView()) {
String defaultViewName = getDefaultViewName(request);
if (defaultViewName != null) {
mv.setViewName(defaultViewName);
}
}
}
@Nullable
protected String getDefaultViewName(HttpServletRequest request) throws Exception {
return (this.viewNameTranslator != null ? this.viewNameTranslator.getViewName(request) : null);
}
当mv没有view时,尝试使用该组件去获取一个默认的viewName
2.2 DefaultRequestToViewNameTranslator
这个类主要的方法就两个
@Override
public String getViewName(HttpServletRequest request) {
String lookupPath = this.urlPathHelper.getLookupPathForRequest(request, HandlerMapping.LOOKUP_PATH);
return (this.prefix + transformPath(lookupPath) + this.suffix);
}
@Nullable
protected String transformPath(String lookupPath) {
String path = lookupPath;
if (this.stripLeadingSlash && path.startsWith(SLASH)) {
path = path.substring(1);
}
if (this.stripTrailingSlash && path.endsWith(SLASH)) {
path = path.substring(0, path.length() - 1);
}
if (this.stripExtension) {
path = StringUtils.stripFilenameExtension(path);
}
if (!SLASH.equals(this.separator)) {
path = StringUtils.replace(path, SLASH, this.separator);
}
return path;
}
在getViewName中首先从request获得lookupPath,然后使用transformPath方法对其进行处理后加上前缀后缀返回。
transformPath方法的作用简单来说就是根据配置对lookupPath“掐头去尾换分隔符”,它是根据其中的四个属性的设置来处理的。这里的Slash代表/
-
stripLeadingSlash:如果最前面的字符为Slash是否将其去掉。
-
stripTrailingSlash:如果最后一个字符为Slash是否将其去掉。
-
stripExtension:是否需要去掉扩展名。
-
separator:如果其值与Slash不同则用于替换原来的分隔符Slash。
getViewName中还使用了可以给返回值添加前缀和后缀的prefix和suffix,这些参数都可以配置。
可以配置的参数除了这6个外还有4个:urlDecode、removeSemicolonContent、alwaysUseFullPath和urlPathHelper
前三个参数都是用在urlPathHelper中的
urlDecode
用于设置url是否需要编解码,一般默认就行
removeSemicolonContent
用于设置是否删除url中与分号相关的内容
alwaysUseFullPath
用于设置是否总使用完整路径
urlPathHelper
是用于处理url的工具,一般使用spring默认提供的就可以了。
三. 请求演示
在controller中定义如下的方法
@RequestMapping("/source/test16")
public void test16() {
System.out.println("test16执行了");
}
此时,就会满足该组件生效的条件。会生成一个默认的viewName
默认情况下,viewName为请求路径,即source/test16
。如果没有对应的视图,就会报错