概述
请求到视图名的转换器接口
1 2 3 4 5 6 7 8 9
| public interface RequestToViewNameTranslator {
/** * 根据请求,获得其视图名 */ @Nullable String getViewName(HttpServletRequest request) throws Exception;
}
|
在 DispatcherServlet 中,我们已经看到,在 ModelAndView 不存在对应的视图时,会通过 RequestToViewNameTranslator 来获取默认的视图名,作为其视图。
DefaultRequestToViewNameTranslator
实现 RequestToViewNameTranslator 接口,默认且是唯一的 RequestToViewNameTranslator 实现类。
构造方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| // DefaultRequestToViewNameTranslator.java
private static final String SLASH = "/";
/** * 前缀 */ private String prefix = ""; /** * 后缀 */ private String suffix = "";
/** * 分隔符 */ private String separator = SLASH;
/** * 是否移除开头 {@link #SLASH} */ private boolean stripLeadingSlash = true; /** * 是否移除末尾 {@link #SLASH} */ private boolean stripTrailingSlash = true; /** * 是否移除拓展名 */ private boolean stripExtension = true;
/** * URL 路径工具类 */ private UrlPathHelper urlPathHelper = new UrlPathHelper();
|
getViewName
1 2 3 4 5 6 7
| @Override public String getViewName(HttpServletRequest request) { // 获得请求路径 String lookupPath = this.urlPathHelper.getLookupPathForRequest(request); // 获得视图名 return (this.prefix + transformPath(lookupPath) + this.suffix); }
|
- 获得请求路径。
- 调用 #transformPath(String lookupPath) 方法,转换请求路径,后续在拼接上 prefix 和 suffix ,形成最终的视图名。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| @Nullable protected String transformPath(String lookupPath) { String path = lookupPath; // 移除开头 SLASH if (this.stripLeadingSlash && path.startsWith(SLASH)) { path = path.substring(1); } // 移除末尾 SLASH 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; }
|