上海高端网站建设服,承德网站建设制作,影视网站策划书,自建网站流程RequestToViewNameTranslator 组件RequestToViewNameTranslator 组件#xff0c;视图名称转换器#xff0c;用于解析出请求的默认视图名。就是说当 ModelAndView 对象不为 null#xff0c;但是它的 View 对象为 null#xff0c;则需要通过 RequestToViewNameTranslator 组件…RequestToViewNameTranslator 组件RequestToViewNameTranslator 组件视图名称转换器用于解析出请求的默认视图名。就是说当 ModelAndView 对象不为 null但是它的 View 对象为 null则需要通过 RequestToViewNameTranslator 组件根据请求解析出一个默认的视图名称。回顾先来回顾一下在 DispatcherServlet 中处理请求的过程中哪里使用到 RequestToViewNameTranslator 组件可以回到《一个请求的旅行过程》中的 DispatcherServlet 的 doDispatch 方法中看看如下protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {HttpServletRequest processedRequest request;try {ModelAndView mv null;try {// ... 省略相关代码// 6 真正的调用 handler 方法也就是执行对应的方法并返回视图mv ha.handle(processedRequest, response, mappedHandler.getHandler());// ... 省略相关代码// 8 无视图的情况下设置默认视图名称applyDefaultViewName(processedRequest, mv);// ... 省略相关代码}catch (Exception ex) {dispatchException ex; // 10 记录异常}// 11 处理正常和异常的请求调用结果processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);}catch (Exception ex) { // 12 已完成处理 拦截器 }finally { }
}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);
}
在上面方法的8处会调用 applyDefaultViewName(HttpServletRequest request, Nullable ModelAndView mv) 方法如果返回的 ModelAndView 对象不为 null但是他的 View 对象为 null则需要通过 viewNameTranslator 的 getViewName(HttpServletRequest request) 方法从请求中获取默认的视图名如果获取到了则设置到 ModelAndView 对象中applyDefaultViewName(HttpServletRequest request, Nullable ModelAndView mv) 这个方法还会在处理异常的时候调用因为处理异常也返回 ModelAndView 对象所以需要做“类似”的处理RequestToViewNameTranslator 接口org.springframework.web.servlet.RequestToViewNameTranslator视图名称转换器用于解析出请求的默认视图名代码如下public interface RequestToViewNameTranslator {/*** 根据请求获得其视图名*/NullableString getViewName(HttpServletRequest request) throws Exception;
}Spring MVC 就提供一个实现类org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator我看了一下Spring Boot 没有提供其他的实现类初始化过程在 DispatcherServlet 的 initRequestToViewNameTranslator(ApplicationContext context) 方法初始化 RequestToViewNameTranslator 组件方法如下private void initRequestToViewNameTranslator(ApplicationContext context) {try {this.viewNameTranslator context.getBean(REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME, RequestToViewNameTranslator.class);if (logger.isTraceEnabled()) {logger.trace(Detected this.viewNameTranslator.getClass().getSimpleName());}else if (logger.isDebugEnabled()) {logger.debug(Detected this.viewNameTranslator);}}catch (NoSuchBeanDefinitionException ex) {// We need to use the default./*** 如果未找到则获取默认的 RequestToViewNameTranslator 对象* {link org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator}*/this.viewNameTranslator getDefaultStrategy(context, RequestToViewNameTranslator.class);if (logger.isTraceEnabled()) {logger.trace(No RequestToViewNameTranslator REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME : using default [ this.viewNameTranslator.getClass().getSimpleName() ]);}}
}
获得 Bean 名称为 viewNameTranslator类型为 RequestToViewNameTranslator 的 Bean 将其设置为 viewNameTranslator如果未获得到则获得默认配置的 RequestToViewNameTranslator 实现类调用 getDefaultStrategies(ApplicationContext context, ClassT strategyInterface) 方法就是从 DispatcherServlet.properties 文件中读取 RequestToViewNameTranslator 的默认实现类如下org.springframework.web.servlet.RequestToViewNameTranslatororg.springframework.web.servlet.view.DefaultRequestToViewNameTranslatorDefaultRequestToViewNameTranslatororg.springframework.web.servlet.view.DefaultRequestToViewNameTranslator 实现 RequestToViewNameTranslator 接口默认且是唯一的 RequestToViewNameTranslator 实现类构造方法public class DefaultRequestToViewNameTranslator implements RequestToViewNameTranslator {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实现 getViewName(HttpServletRequest request) 方法代码如下Override
public String getViewName(HttpServletRequest request) {// 获得请求路径String lookupPath this.urlPathHelper.getLookupPathForRequest(request);// 获得视图名return (this.prefix transformPath(lookupPath) this.suffix);
}Nullable
protected String transformPath(String lookupPath) {String path lookupPath;// 移除开头 SLASHif (this.stripLeadingSlash path.startsWith(SLASH)) {path path.substring(1);}// 移除末尾 SLASHif (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;
}通过 urlPathHelper 获取该请求的请求路径调用 transformPath(String lookupPath) 方法获得视图名并添加前后缀默认都是空的。实际上就是你的请求 URI总结本文对 Spring MVC 的RequestToViewNameTranslator 组件进行了分析视图名称转换器用于解析出请求的默认视图名。当 ModelAndView 对象不为 null但是它的 View 对象为 null则需要通过 RequestToViewNameTranslator 组件根据请求解析出一个默认的视图名称。默认的 DefaultRequestToViewNameTranslator 实现类返回的就是请求的 URI。我们目前最常用的 ResponseBody 注解对应的 RequestResponseBodyMethodProcessor 返回值处理器所得到的 ModelAndView 对象为 null所以不会用到该组件也不会进行视图渲染前后端分离嘛~