06-RequestToViewNameTranslator

2022-07-18

06-RequestToViewNameTranslator

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。如果没有对应的视图,就会报错

image-20210618115407752

image-20210618115423413


标题:06-RequestToViewNameTranslator
作者:mahaonan
地址:https://mahaonan.fun/articles/2022/07/18/1658147010402.html